diff --git a/gems/redmine_cli-0.2.1.gem b/gems/redmine_cli-0.2.1.gem new file mode 100644 index 0000000..1ca9197 Binary files /dev/null and b/gems/redmine_cli-0.2.1.gem differ diff --git a/gems/redmine_cli-0.3.0.gem b/gems/redmine_cli-0.3.0.gem new file mode 100644 index 0000000..2d84112 Binary files /dev/null and b/gems/redmine_cli-0.3.0.gem differ diff --git a/lib/redmine_cli.rb b/lib/redmine_cli.rb index 7890faf..3208ea7 100644 --- a/lib/redmine_cli.rb +++ b/lib/redmine_cli.rb @@ -1,6 +1,7 @@ require 'redmine_cli/config' require 'redmine_cli/query' require 'redmine_cli/filter' +require 'redmine_cli/helpers' require 'redmine_cli/tasks' require 'redmine_cli/cli' require 'redmine_cli/ui' diff --git a/lib/redmine_cli/helpers.rb b/lib/redmine_cli/helpers.rb new file mode 100644 index 0000000..790f9d6 --- /dev/null +++ b/lib/redmine_cli/helpers.rb @@ -0,0 +1,2 @@ + +require 'redmine_cli/helpers/query_helper' diff --git a/lib/redmine_cli/helpers/query_helper.rb b/lib/redmine_cli/helpers/query_helper.rb new file mode 100644 index 0000000..b2724c6 --- /dev/null +++ b/lib/redmine_cli/helpers/query_helper.rb @@ -0,0 +1,88 @@ + +module RedmineCLI + module Helpers + module QueryHelper + + def self.included(base) + base.extend(ClassMethods) + end + + module ClassMethods + + @@query_options = [{ :name => :closed_tickets, :type => :boolean, :aliases => "-C", :desc => 'Only search for closed tickets.' }, + { :name => :all_tickets, :type => :boolean, :aliases => "-A", :desc => 'Include all tickets into search.' }, + { :name => :assigned_to_me, :type => :boolean, :aliases => "-I", :desc => "Only show issues that are assigned to me." }, + { :name => :global_search, :type => :boolean, :aliases => "-G", :desc => "Perform a global search." }, + { :name => :project_id, :type => :string, :aliases => "-P", :desc => "Search in the project with the given id." }] + + def class_options_for_query + options_for_query :class_option, [] + end + + def method_options_for_query(*excludes) + options_for_query :method_option, excludes + end + + def options_description_for_query(*excludes) + @@query_options.select { |option| !excludes.include?(option[:name])} + .collect { |option| "[#{option[:aliases]}]" }.join(" ") + end + + private + + def options_for_query(method, excludes) + @@query_options.each do |option| + unless excludes.include?(option[:name]) + self.send method, option[:name], :type => option[:type], :aliases => option[:aliases], :desc => option[:desc] + end + end + end + + end + + def extract_query_parameters(options) + params = {}; + + params[:status] = :open + params[:status] = :closed if options.closed_tickets? && !options.all_tickets + params[:status] = :all if options.all_tickets? + + params[:assigned_to_me] = options.assigned_to_me? + + params[:project_id] = options.project_id + params[:global_search] = options.global_search? + + params + end + + def create_query_for(params) + query = Query.new + query = add_project(query, params) + query = add_status(query, params) + query = query.assigned_to_me if params[:assigned_to_me] + query = query.subject(params[:term]) unless params[:term].nil? + query + end + + private + + def add_project(query, params) + return query if params[:global_search] + query.project = options.project_id if params[:project_id] + query.default_project unless params[:project_id] + query + end + + def add_status(query, params) + if params[:status] == :open + query.open + elsif params[:status] == :clossed + query.closed + else + query + end + end + + end + end +end diff --git a/lib/redmine_cli/query.rb b/lib/redmine_cli/query.rb index 7976bce..4d2c978 100644 --- a/lib/redmine_cli/query.rb +++ b/lib/redmine_cli/query.rb @@ -8,6 +8,7 @@ module RedmineCLI class Query attr_reader :filters + attr_accessor :project def initialize(query = nil) @filters = if query.nil? @@ -15,6 +16,7 @@ def initialize(query = nil) else query.filters.clone end + @project = query.project if query end def add_filter(field, operator, values) @@ -26,6 +28,7 @@ def execute issues, totalCount, page = [], 0, 1 begin + puts url_for(99, page) url = URI.parse(url_for(99, page)) http = Net::HTTP.new(url.host, url.port) @@ -55,6 +58,11 @@ def subject(*values) Query.new(self).add_filter('subject', '~', values) end + def default_project + @project = Config.project + self + end + def assigned_to_me Query.new(self).add_filter('assigned_to_id', '=', 'me') end @@ -62,7 +70,16 @@ def assigned_to_me private def url_for(limit, page) - "#{Config.url}/projects/#{Config.project}/issues.json?key=#{Config.api_key}&limit=#{limit}&page=#{page}&#{query}" + "#{Config.url}#{resource}?key=#{Config.api_key}&limit=#{limit}&page=#{page}&#{query}" + end + + def resource + prefix = if @project + "/projects/#{@project}" + else + "" + end + prefix + "/issues.json" end def query diff --git a/lib/redmine_cli/tasks/commit.rb b/lib/redmine_cli/tasks/commit.rb index 7135c06..9628057 100644 --- a/lib/redmine_cli/tasks/commit.rb +++ b/lib/redmine_cli/tasks/commit.rb @@ -5,17 +5,19 @@ module RedmineCLI module Tasks class Commit < Base + include Helpers::QueryHelper + namespace :commit class_option :msg, :type => :string, :aliases => "-m", :desc => 'Commit message.' class_option :all, :type => :boolean, :aliases => "-a", :desc => 'Passes -a to git commit.' - class_option :closed_tickets, :type => :boolean, :aliases => "-C", :desc => 'Only search for closed tickets.' - class_option :all_tickets, :type => :boolean, :aliases => "-A", :desc => 'Include all tickets into search.' - class_option :assigned_to_me, :type => :boolean, :aliases => "-I", :desc => "Only show issues that are assigned to me." + + class_options_for_query ['fixes', 'closes', 'refs'].each do |method| - desc "#{method} [-a] [-m ] [-A | -C] [-I]", "Search for issue and commit with #{method}." + desc "#{method} [-a] [-m ] #{options_description_for_query}", "Search for issue and commit with #{method}." define_method method do |*args| + debugger commit(args.first, options.merge(:prefix => method)) end end @@ -33,14 +35,9 @@ def commit(term, options) end def fetch_issues(term, options) - query = Query.new - - query = query.closed if not options.all_tickets and options.closed_tickets - query = query.assigned_to_me if options.assigned_to_me? - query = query.open unless options.all_tickets or options.closed_tickets - query = query.subject(term) unless term.nil? or term.empty? - - query.all + puts options.inspect + puts extract_query_parameters(options).merge!(:term => term).inspect + create_query_for(extract_query_parameters(options).merge({:term => term})).all end end diff --git a/lib/redmine_cli/tasks/list.rb b/lib/redmine_cli/tasks/list.rb index a11cb03..209f8ae 100644 --- a/lib/redmine_cli/tasks/list.rb +++ b/lib/redmine_cli/tasks/list.rb @@ -1,39 +1,30 @@ module RedmineCLI module Tasks class List < Base - namespace :list + include Helpers::QueryHelper - class_option :assigned_to_me, :type => :boolean, :aliases => "-I", :desc => "Only show issues that are assigned to me." + namespace :list ['open', 'closed'].each do |status| - desc "#{status} [term] [-I]", "List of all #{status} tickets matching search" + method_options_for_query :closed_tickets, :all_tickets + desc "#{status} [term] #{options_description_for_query}", "List of all #{status} tickets matching search" define_method status do |*args| list(status, args.first, options) end end - desc "sub ID [-A | -C] [-I]", "List sub tickets" - method_option :closed_tickets, :type => :boolean, :aliases => "-C", :desc => 'Only search for closed tickets.' - method_option :all_tickets, :type => :boolean, :aliases => "-A", :desc => 'Include all tickets into search.' - method_option :assigned_to_me, :type => :boolean, :aliases => "-I", :desc => "Only show issues that are assigned to me." + method_options_for_query + desc "sub ID #{options_description_for_query}", "List sub tickets" def sub(issue_id) - query = Query.new - query = query.closed if not options.all_tickets and options.closed_tickets - query = query.open if !options.all_tickets and !options.closed_tickets - query = query.assigned_to_me if options.assigned_to_me? + query = create_query_for(extract_query_parameters(options)) matching = Filter.new(query.all).with_parent_id(issue_id).all - RedmineCLI.ui.list_issues(matching) end private def list(method, term, options) - query = Query.new.send method - query = query.subject(term) unless term.nil? or term.empty? - query = query.assigned_to_me if options.assigned_to_me? - matching = query.all - + matching = create_query_for(extract_query_parameters(options).merge(:status => method.to_sym, :term => term)).all RedmineCLI.ui.list_issues(matching) end end diff --git a/lib/redmine_cli/version.rb b/lib/redmine_cli/version.rb index b497c94..f2f433c 100644 --- a/lib/redmine_cli/version.rb +++ b/lib/redmine_cli/version.rb @@ -1,3 +1,3 @@ module RedmineCLI - VERSION = '0.2.1' + VERSION = '0.3.0' end diff --git a/test/redmine_mock/server.rb b/test/redmine_mock/server.rb new file mode 100644 index 0000000..48879da --- /dev/null +++ b/test/redmine_mock/server.rb @@ -0,0 +1,56 @@ + +require 'rubygems' +require 'sinatra' + +response = <