Sha256: 029b17980496ac2b2fcb7daf6fe99d2c7996159fe07571b64c0a14d4e2594beb

Contents?: true

Size: 1.5 KB

Versions: 2

Compression:

Stored size: 1.5 KB

Contents

require 'net/http'
require 'json'
require 'csv'

class ImportRedmineIssues
  def initialize(redmine_api_key)
    @redmine_api_key = redmine_api_key
    @html_uri = URI('https://redmine.renuo.ch/issues')
    @json_uri = URI('https://redmine.renuo.ch/issues.json')
  end

  def run(csv_path)
    https = Net::HTTP.new(@json_uri.host, @json_uri.port)
    https.use_ssl = true

    parsed_issues(csv_path).each do |issue|
      request = build_request(issue)
      response = https.request(request)
      handle_response(response)
    end

  rescue SocketError => details
    say "Are you connected to the internet? SocketError: #{details}"
    exit 1
  end

  private

  def build_request(issue)
    request = Net::HTTP::Post.new(@json_uri)
    request.add_field('Content-Type', 'application/json')
    request.add_field('X-Redmine-API-Key', @redmine_api_key)
    request.body = JSON.generate(issue)
    request
  end

  def handle_response(response)
    if response.is_a? Net::HTTPCreated
      issue_id = JSON.parse(response.body)['issue']['id']
      issue_url = URI.join(@html_uri, issue_id.to_s)
      say issue_url
    else
      say "#{response.code} #{response.message}"
    end
  end

  def parsed_issues(csv_path)
    issues = []

    CSV.foreach(csv_path) do |row|
      issues << { 'issue' => parse_issue(row) }
    end

    issues
  end

  def parse_issue(csv_row)
    {
      'project_id' => csv_row[0],
      'subject' => csv_row[1],
      'description' => csv_row[2],
      'estimated_hours' => csv_row[3]
    }
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
renuo-cli-0.0.11 lib/renuo/cli/app/import_redmine_issues.rb
renuo-cli-0.0.10 lib/renuo/cli/app/import_redmine_issues.rb