lib/embulk/input/jira.rb in embulk-input-jira-0.0.4 vs lib/embulk/input/jira.rb in embulk-input-jira-0.0.5

- old
+ new

@@ -1,9 +1,143 @@ -require "embulk/input/jira_input_plugin" -require "embulk/input/jira/version" +require "embulk/input/jira_input_plugin_utils" +require "embulk/input/jira_api" module Embulk module Input - module Jira + class Jira < InputPlugin + PER_PAGE = 50 + GUESS_RECORDS_COUNT = 10 + PREVIEW_RECORDS_COUNT = 15 + + Plugin.register_input("jira", self) + + def self.transaction(config, &control) + task = { + "username" => config.param("username", :string), + "password" => config.param("password", :string), + "uri" => config.param("uri", :string), + "jql" => config.param("jql", :string), + } + + attributes = {} + columns = config.param("columns", :array).map do |column| + name = column["name"] + type = column["type"].to_sym + attributes[name] = type + Column.new(nil, name, type, column["format"]) + end + + task["attributes"] = attributes + + resume(task, columns, 1, &control) + end + + def self.resume(task, columns, count, &control) + commit_reports = yield(task, columns, count) + + next_config_diff = {} + return next_config_diff + end + + def self.guess(config) + # TODO: api_version should be 2 (the latest version) + # auth_type should be specified from config. (The future task) + + username = config.param("username", :string) + password = config.param("password", :string) + uri = config.param("uri", :string) + api_version = "latest" + auth_type = "basic" + jql = config.param("jql", :string) + + jira = JiraApi::Client.setup do |jira_config| + jira_config.username = username + jira_config.password = password + jira_config.uri = uri + jira_config.api_version = api_version + jira_config.auth_type = auth_type + end + + # TODO: we use 0..10 issues to guess config? + records = jira.search_issues(jql, max_results: GUESS_RECORDS_COUNT).map do |issue| + issue.to_record + end + + columns = JiraInputPluginUtils.guess_columns(records) + + guessed_config = { + "columns" => columns, + } + + return guessed_config + end + + def init + @attributes = task["attributes"] + @jira = JiraApi::Client.setup do |config| + config.username = task["username"] + config.password = task["password"] + config.uri = task["uri"] + config.api_version = "latest" + config.auth_type = :basic + end + @jql = task["jql"] + end + + def run + return preview if preview? + options = {} + total_count = @jira.total_count(@jql) + last_page = (total_count.to_f / PER_PAGE).ceil + + 0.step(total_count, PER_PAGE).with_index(1) do |start_at, page| + logger.debug "Fetching #{page} / #{last_page} page" + @jira.search_issues(@jql, options.merge(start_at: start_at)).each do |issue| + values = @attributes.map do |(attribute_name, type)| + JiraInputPluginUtils.cast(issue[attribute_name], type) + end + + page_builder.add(values) + end + end + + page_builder.finish + + commit_report = {} + return commit_report + end + + def self.logger + Embulk.logger + end + + def logger + self.class.logger + end + + private + + def preview + logger.debug "For preview mode, JIRA input plugin fetches records at most #{PREVIEW_RECORDS_COUNT}" + @jira.search_issues(@jql, max_results: PREVIEW_RECORDS_COUNT).each do |issue| + values = @attributes.map do |(attribute_name, type)| + JiraInputPluginUtils.cast(issue[attribute_name], type) + end + page_builder.add(values) + end + page_builder.finish + + commit_report = {} + return commit_report + end + + def preview? + begin + # http://www.embulk.org/docs/release/release-0.6.12.html + org.embulk.spi.Exec.isPreview() + rescue java.lang.NullPointerException => e + false + end + end end end end