redmine-cli 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +37 -0
- data/README.markdown +11 -0
- data/Rakefile +2 -0
- data/bin/redmine +9 -0
- data/lib/redmine-cli.rb +4 -0
- data/lib/redmine-cli/cli.rb +141 -0
- data/lib/redmine-cli/issue.rb +16 -0
- data/lib/redmine-cli/version.rb +5 -0
- data/redmine-cli.gemspec +25 -0
- metadata +121 -0
    
        data/.gitignore
    ADDED
    
    
    
        data/Gemfile
    ADDED
    
    
    
        data/Gemfile.lock
    ADDED
    
    | @@ -0,0 +1,37 @@ | |
| 1 | 
            +
            PATH
         | 
| 2 | 
            +
              remote: .
         | 
| 3 | 
            +
              specs:
         | 
| 4 | 
            +
                redmine-cli (0.0.1)
         | 
| 5 | 
            +
                  activeresource (~> 3.0.0)
         | 
| 6 | 
            +
                  thor
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            GEM
         | 
| 9 | 
            +
              remote: http://rubygems.org/
         | 
| 10 | 
            +
              specs:
         | 
| 11 | 
            +
                activemodel (3.0.1)
         | 
| 12 | 
            +
                  activesupport (= 3.0.1)
         | 
| 13 | 
            +
                  builder (~> 2.1.2)
         | 
| 14 | 
            +
                  i18n (~> 0.4.1)
         | 
| 15 | 
            +
                activeresource (3.0.1)
         | 
| 16 | 
            +
                  activemodel (= 3.0.1)
         | 
| 17 | 
            +
                  activesupport (= 3.0.1)
         | 
| 18 | 
            +
                activesupport (3.0.1)
         | 
| 19 | 
            +
                builder (2.1.2)
         | 
| 20 | 
            +
                columnize (0.3.1)
         | 
| 21 | 
            +
                i18n (0.4.2)
         | 
| 22 | 
            +
                linecache (0.43)
         | 
| 23 | 
            +
                ruby-debug (0.10.3)
         | 
| 24 | 
            +
                  columnize (>= 0.1)
         | 
| 25 | 
            +
                  ruby-debug-base (~> 0.10.3.0)
         | 
| 26 | 
            +
                ruby-debug-base (0.10.3)
         | 
| 27 | 
            +
                  linecache (>= 0.3)
         | 
| 28 | 
            +
                thor (0.14.3)
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            PLATFORMS
         | 
| 31 | 
            +
              ruby
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            DEPENDENCIES
         | 
| 34 | 
            +
              activeresource (~> 3.0.0)
         | 
| 35 | 
            +
              redmine-cli!
         | 
| 36 | 
            +
              ruby-debug
         | 
| 37 | 
            +
              thor
         | 
    
        data/README.markdown
    ADDED
    
    | @@ -0,0 +1,11 @@ | |
| 1 | 
            +
            # A command line interface for redmine
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            ## Use cases
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                redmine list
         | 
| 6 | 
            +
                redmine list -a
         | 
| 7 | 
            +
                redmine show 524
         | 
| 8 | 
            +
                redmine update 524 -d "New description"
         | 
| 9 | 
            +
                redmine update 256 --assigned_to "me"
         | 
| 10 | 
            +
                redmine update 2,3,4 --assigned_to "me"
         | 
| 11 | 
            +
                redmine list --status 1 | xargs redmine update --asigned_to "me" --status 3 -l
         | 
    
        data/Rakefile
    ADDED
    
    
    
        data/bin/redmine
    ADDED
    
    
    
        data/lib/redmine-cli.rb
    ADDED
    
    
| @@ -0,0 +1,141 @@ | |
| 1 | 
            +
            module Redmine
         | 
| 2 | 
            +
              module Cli
         | 
| 3 | 
            +
                class CLI < Thor
         | 
| 4 | 
            +
                  desc "list", "List all issues for the user"
         | 
| 5 | 
            +
                  method_option :assigned_to, :aliases => "-a",  :desc => "id or user name of person the ticket is assigned to"
         | 
| 6 | 
            +
                  method_option :status,      :aliases => "-s",  :desc => "id or name of status for ticket"
         | 
| 7 | 
            +
                  method_option :std_output,  :aliases => "-o",  :type => :boolean,
         | 
| 8 | 
            +
                                :desc => "special output for STDOUT (useful for updates)"
         | 
| 9 | 
            +
                  def list
         | 
| 10 | 
            +
                    params = {}
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                    params[:assigned_to_id] = map_user(options.assigned_to) if options.assigned_to
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    params[:status_id] = map_status(options.status) if options.status
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                    collection = Issue.all(:params => params)
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    unless options.std_output
         | 
| 19 | 
            +
                      issues = collection.collect { |issue| [link_to_issue(issue.id), issue.subject, issue.status.name] }
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                      if issues.any?
         | 
| 22 | 
            +
                        issues.insert(0, ["URL", "Subject", "Status"])
         | 
| 23 | 
            +
                        print_table(issues)
         | 
| 24 | 
            +
                      end
         | 
| 25 | 
            +
                    else
         | 
| 26 | 
            +
                      say collection.collect(&:id).join(",")
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  desc "show TICKET", "Display information of a ticket"
         | 
| 31 | 
            +
                  def show(ticket)
         | 
| 32 | 
            +
                    issue = Issue.find(ticket)
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    display_issue(issue)
         | 
| 35 | 
            +
                  rescue ActiveResource::ResourceNotFound
         | 
| 36 | 
            +
                    say "No ticket with number: #{ticket}", :red
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  method_option :assigned_to, :aliases => "-a",  :desc => "id or user name of person the ticket is assigned to"
         | 
| 40 | 
            +
                  method_option :status,      :aliases => "-s",  :desc => "id or name of status for ticket"
         | 
| 41 | 
            +
                  method_option :project,     :aliases => "-p", :desc => "project for the ticket"
         | 
| 42 | 
            +
                  desc "new SUBJECT [DESCRIPTION]", "Create a new ticket"
         | 
| 43 | 
            +
                  def new(subject, description="")
         | 
| 44 | 
            +
                    params =
         | 
| 45 | 
            +
                      Thor::CoreExt::HashWithIndifferentAccess.new(:subject => subject,
         | 
| 46 | 
            +
                                                                   :description => description,
         | 
| 47 | 
            +
                                                                   :project => Issue.config.default_project_id)
         | 
| 48 | 
            +
                    params.merge!(options)
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                    unless params.project
         | 
| 51 | 
            +
                      raise "No default project specified"
         | 
| 52 | 
            +
                    end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                    issue = Issue.create(ticket_attributes(params))
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                    say "Created ticket: #{link_to_issue(issue.id)}", :green
         | 
| 57 | 
            +
                  rescue ActiveResource::ResourceNotFound
         | 
| 58 | 
            +
                    say "Could not create ticket with: #{options.inspect}", :red
         | 
| 59 | 
            +
                  rescue RuntimeError => e
         | 
| 60 | 
            +
                    say e.message, :red
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  method_option :tickets,     :aliases => "-l",  :desc => "list of tickets"
         | 
| 64 | 
            +
                  method_option :status,      :aliases => "-s",  :desc => "id or name of status for ticket"
         | 
| 65 | 
            +
                  method_option :subject,     :aliases => "-t",  :desc => "subject for ticket (title)"
         | 
| 66 | 
            +
                  method_option :description, :aliases => "-d",  :desc => "description for ticket"
         | 
| 67 | 
            +
                  method_option :assigned_to, :aliases => "-a",  :desc => "id or user name of person the ticket is assigned to"
         | 
| 68 | 
            +
                  desc "update [TICKETS]", "Update tickets"
         | 
| 69 | 
            +
                  def update(tickets = "")
         | 
| 70 | 
            +
                    tickets = options.tickets if tickets.blank? && options.tickets.present?
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                    tickets = tickets.split(",")
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                    if tickets.empty?
         | 
| 75 | 
            +
                      say "No tickets to update", :red
         | 
| 76 | 
            +
                      exit 1
         | 
| 77 | 
            +
                    end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                    tickets.collect { |ticket| Thread.new { update_ticket(ticket, options) } }.each(&:join)
         | 
| 80 | 
            +
                  end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                  no_tasks do
         | 
| 83 | 
            +
                    def link_to_issue(id)
         | 
| 84 | 
            +
                      "#{Issue.config.url}/issues/#{id}"
         | 
| 85 | 
            +
                    end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                    def ticket_attributes(options)
         | 
| 88 | 
            +
                      attributes = {}
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                      attributes[:subject]        = options.subject               if options.subject.present?
         | 
| 91 | 
            +
                      attributes[:description]    = options.description           if options.description.present?
         | 
| 92 | 
            +
                      attributes[:project_id]     = options.project               if options.project.present?
         | 
| 93 | 
            +
                      attributes[:assigned_to_id] = map_user(options.assigned_to) if options.assigned_to.present?
         | 
| 94 | 
            +
                      attributes[:status_id]      = options.status                if options.status.present?
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                      attributes
         | 
| 97 | 
            +
                    end
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                    def display_issue(issue)
         | 
| 100 | 
            +
                      shell.print_wrapped "#{link_to_issue(issue.id)} - #{issue.status.name}"
         | 
| 101 | 
            +
                      shell.print_wrapped "Subject: #{issue.subject}"
         | 
| 102 | 
            +
                      shell.print_wrapped issue.description || "", :ident => 2
         | 
| 103 | 
            +
                    end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                    def map_user(user_name)
         | 
| 106 | 
            +
                      get_mapping(:user_mappings, user_name)
         | 
| 107 | 
            +
                    end
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                    def map_status(status_name)
         | 
| 110 | 
            +
                      get_mapping(:status_mappings, status_name)
         | 
| 111 | 
            +
                    end
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                    def get_mapping(mapping, value)
         | 
| 114 | 
            +
                      return value if value.to_i != 0
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                      if Issue.config[mapping].nil? || (mapped = Issue.config[mapping][value]).nil?
         | 
| 117 | 
            +
                        say "No #{mapping} for #{value}", :red
         | 
| 118 | 
            +
                        exit 1
         | 
| 119 | 
            +
                      end
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                      return mapped
         | 
| 122 | 
            +
                    end
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                    def update_ticket(ticket, options)
         | 
| 125 | 
            +
                      issue = Issue.find(ticket)
         | 
| 126 | 
            +
                      params = ticket_attributes(options)
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                      if issue.update_attributes(params)
         | 
| 129 | 
            +
                        say "Updated: #{ticket}. Options: #{params.inspect}", :green
         | 
| 130 | 
            +
                        display_issue(issue)
         | 
| 131 | 
            +
                      else
         | 
| 132 | 
            +
                        say "Could not update ticket with: #{params.inspect}", :red
         | 
| 133 | 
            +
                      end
         | 
| 134 | 
            +
                    rescue ActiveResource::ResourceNotFound
         | 
| 135 | 
            +
                      say "Could not find ticket: #{ticket}", :red
         | 
| 136 | 
            +
                    end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                  end
         | 
| 139 | 
            +
                end
         | 
| 140 | 
            +
              end
         | 
| 141 | 
            +
            end
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            module Redmine
         | 
| 2 | 
            +
              module Cli
         | 
| 3 | 
            +
                class Issue < ActiveResource::Base
         | 
| 4 | 
            +
                  def self.config
         | 
| 5 | 
            +
                    @config ||= Thor::CoreExt::HashWithIndifferentAccess.new(YAML.load_file(File.expand_path("~/.redmine")))
         | 
| 6 | 
            +
                  rescue Errno::ENOENT
         | 
| 7 | 
            +
                    puts "You need to create the file .redmine in your home with your username, password and url"
         | 
| 8 | 
            +
                    exit(1)
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  self.site = config.url
         | 
| 12 | 
            +
                  self.user = config.username
         | 
| 13 | 
            +
                  self.password = config.password
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
    
        data/redmine-cli.gemspec
    ADDED
    
    | @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            # -*- encoding: utf-8 -*-
         | 
| 2 | 
            +
            $:.push File.expand_path("../lib", __FILE__)
         | 
| 3 | 
            +
            require "redmine-cli/version"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Gem::Specification.new do |s|
         | 
| 6 | 
            +
              s.name        = "redmine-cli"
         | 
| 7 | 
            +
              s.version     = Redmine::Cli::VERSION
         | 
| 8 | 
            +
              s.platform    = Gem::Platform::RUBY
         | 
| 9 | 
            +
              s.authors     = ["Jorge Dias"]
         | 
| 10 | 
            +
              s.email       = ["jorge@mrdias.com"]
         | 
| 11 | 
            +
              s.homepage    = "http://rubygems.org/gems/redmine-cli"
         | 
| 12 | 
            +
              s.summary     = %q{Command line interface for redmine}
         | 
| 13 | 
            +
              s.description = %q{A simple command line interface for redmine for easy scripting}
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              s.rubyforge_project = "redmine-cli"
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              s.files         = `git ls-files`.split("\n")
         | 
| 18 | 
            +
              s.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")
         | 
| 19 | 
            +
              s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
         | 
| 20 | 
            +
              s.require_paths = ["lib"]
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              s.add_dependency "activeresource", "~>3.0.0"
         | 
| 23 | 
            +
              s.add_dependency "thor"
         | 
| 24 | 
            +
              s.add_development_dependency "ruby-debug"
         | 
| 25 | 
            +
            end
         | 
    
        metadata
    ADDED
    
    | @@ -0,0 +1,121 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification 
         | 
| 2 | 
            +
            name: redmine-cli
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            +
              hash: 29
         | 
| 5 | 
            +
              prerelease: false
         | 
| 6 | 
            +
              segments: 
         | 
| 7 | 
            +
              - 0
         | 
| 8 | 
            +
              - 0
         | 
| 9 | 
            +
              - 1
         | 
| 10 | 
            +
              version: 0.0.1
         | 
| 11 | 
            +
            platform: ruby
         | 
| 12 | 
            +
            authors: 
         | 
| 13 | 
            +
            - Jorge Dias
         | 
| 14 | 
            +
            autorequire: 
         | 
| 15 | 
            +
            bindir: bin
         | 
| 16 | 
            +
            cert_chain: []
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            date: 2010-10-30 00:00:00 +02:00
         | 
| 19 | 
            +
            default_executable: 
         | 
| 20 | 
            +
            dependencies: 
         | 
| 21 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 22 | 
            +
              name: activeresource
         | 
| 23 | 
            +
              prerelease: false
         | 
| 24 | 
            +
              requirement: &id001 !ruby/object:Gem::Requirement 
         | 
| 25 | 
            +
                none: false
         | 
| 26 | 
            +
                requirements: 
         | 
| 27 | 
            +
                - - ~>
         | 
| 28 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 29 | 
            +
                    hash: 7
         | 
| 30 | 
            +
                    segments: 
         | 
| 31 | 
            +
                    - 3
         | 
| 32 | 
            +
                    - 0
         | 
| 33 | 
            +
                    - 0
         | 
| 34 | 
            +
                    version: 3.0.0
         | 
| 35 | 
            +
              type: :runtime
         | 
| 36 | 
            +
              version_requirements: *id001
         | 
| 37 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 38 | 
            +
              name: thor
         | 
| 39 | 
            +
              prerelease: false
         | 
| 40 | 
            +
              requirement: &id002 !ruby/object:Gem::Requirement 
         | 
| 41 | 
            +
                none: false
         | 
| 42 | 
            +
                requirements: 
         | 
| 43 | 
            +
                - - ">="
         | 
| 44 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 45 | 
            +
                    hash: 3
         | 
| 46 | 
            +
                    segments: 
         | 
| 47 | 
            +
                    - 0
         | 
| 48 | 
            +
                    version: "0"
         | 
| 49 | 
            +
              type: :runtime
         | 
| 50 | 
            +
              version_requirements: *id002
         | 
| 51 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 52 | 
            +
              name: ruby-debug
         | 
| 53 | 
            +
              prerelease: false
         | 
| 54 | 
            +
              requirement: &id003 !ruby/object:Gem::Requirement 
         | 
| 55 | 
            +
                none: false
         | 
| 56 | 
            +
                requirements: 
         | 
| 57 | 
            +
                - - ">="
         | 
| 58 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 59 | 
            +
                    hash: 3
         | 
| 60 | 
            +
                    segments: 
         | 
| 61 | 
            +
                    - 0
         | 
| 62 | 
            +
                    version: "0"
         | 
| 63 | 
            +
              type: :development
         | 
| 64 | 
            +
              version_requirements: *id003
         | 
| 65 | 
            +
            description: A simple command line interface for redmine for easy scripting
         | 
| 66 | 
            +
            email: 
         | 
| 67 | 
            +
            - jorge@mrdias.com
         | 
| 68 | 
            +
            executables: 
         | 
| 69 | 
            +
            - redmine
         | 
| 70 | 
            +
            extensions: []
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            extra_rdoc_files: []
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            files: 
         | 
| 75 | 
            +
            - .gitignore
         | 
| 76 | 
            +
            - Gemfile
         | 
| 77 | 
            +
            - Gemfile.lock
         | 
| 78 | 
            +
            - README.markdown
         | 
| 79 | 
            +
            - Rakefile
         | 
| 80 | 
            +
            - bin/redmine
         | 
| 81 | 
            +
            - lib/redmine-cli.rb
         | 
| 82 | 
            +
            - lib/redmine-cli/cli.rb
         | 
| 83 | 
            +
            - lib/redmine-cli/issue.rb
         | 
| 84 | 
            +
            - lib/redmine-cli/version.rb
         | 
| 85 | 
            +
            - redmine-cli.gemspec
         | 
| 86 | 
            +
            has_rdoc: true
         | 
| 87 | 
            +
            homepage: http://rubygems.org/gems/redmine-cli
         | 
| 88 | 
            +
            licenses: []
         | 
| 89 | 
            +
             | 
| 90 | 
            +
            post_install_message: 
         | 
| 91 | 
            +
            rdoc_options: []
         | 
| 92 | 
            +
             | 
| 93 | 
            +
            require_paths: 
         | 
| 94 | 
            +
            - lib
         | 
| 95 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement 
         | 
| 96 | 
            +
              none: false
         | 
| 97 | 
            +
              requirements: 
         | 
| 98 | 
            +
              - - ">="
         | 
| 99 | 
            +
                - !ruby/object:Gem::Version 
         | 
| 100 | 
            +
                  hash: 3
         | 
| 101 | 
            +
                  segments: 
         | 
| 102 | 
            +
                  - 0
         | 
| 103 | 
            +
                  version: "0"
         | 
| 104 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement 
         | 
| 105 | 
            +
              none: false
         | 
| 106 | 
            +
              requirements: 
         | 
| 107 | 
            +
              - - ">="
         | 
| 108 | 
            +
                - !ruby/object:Gem::Version 
         | 
| 109 | 
            +
                  hash: 3
         | 
| 110 | 
            +
                  segments: 
         | 
| 111 | 
            +
                  - 0
         | 
| 112 | 
            +
                  version: "0"
         | 
| 113 | 
            +
            requirements: []
         | 
| 114 | 
            +
             | 
| 115 | 
            +
            rubyforge_project: redmine-cli
         | 
| 116 | 
            +
            rubygems_version: 1.3.7
         | 
| 117 | 
            +
            signing_key: 
         | 
| 118 | 
            +
            specification_version: 3
         | 
| 119 | 
            +
            summary: Command line interface for redmine
         | 
| 120 | 
            +
            test_files: []
         | 
| 121 | 
            +
             |