Skip to content

Instantly share code, notes, and snippets.

@pachacamac
Created January 10, 2020 15:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pachacamac/af07d3958dd2474dd782ea7da307c35d to your computer and use it in GitHub Desktop.
Save pachacamac/af07d3958dd2474dd782ea7da307c35d to your computer and use it in GitHub Desktop.
gitlab_issues_to_csv
require 'gitlab'
require 'json'
require 'time'
require 'csv'
Gitlab.endpoint = 'https://gitlab.com/api/v4'
Gitlab.private_token = '<ENTER YOUR PRIVATE TOKEN>'
PROJECT_ID = 123 # ENTER YOUR PROJECT_ID
def parse_times(items)
tpf = lambda do |e|
['created_at', 'updated_at', 'closed_at'].each do |a|
e[a] = Time.parse(e[a]) if e[a] && !e[a].is_a?(Time)
end
e
end
if items.is_a?(Array)
items.map(&tpf)
elsif items.is_a?(Hash)
tpf.call(items)
else
items
end
end
def get_issues(project_id)
iterator = Gitlab.issues(project_id, per_page: 50)
issues = []
iterator.auto_paginate{ |issue| issues.push(issue.to_hash) }
issues = parse_times(issues)
end
def csv_decorator(issue)
[
issue.dig('iid'),
issue.dig('web_url'),
issue.dig('title'),
issue.dig('state'),
issue.dig('description'),
issue.dig('author','name'),
issue.dig('author','username'),
issue.dig('assignee','name'),
issue.dig('assignee','username'),
issue.dig('confidential'),
issue.dig('discussion_locked'),
issue.dig('due_date') ? issue.dig('due_date').to_date.iso8601 : nil,
issue.dig('created_at') ? issue.dig('created_at').strftime('%Y-%m-%d %H:%M:%S') : nil,
issue.dig('updated_at') ? issue.dig('updated_at').strftime('%Y-%m-%d %H:%M:%S') : nil,
nil, # Milestone Title of the issue milestone
nil, # Weight Issue weight
(issue.dig('labels')||[]).join(','),
issue.dig('time_stats', 'time_estimate'),
issue.dig('time_stats', 'total_time_spent'),
]
end
get_issues(PROJECT_ID).each do |issue|
puts csv_decorator(issue).to_csv
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment