schubert-minglr 0.1.0.3 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,8 @@
1
+ == 0.0.2 2009-04-08
2
+ * Added minglr cli tool
3
+ * Sample config file. Copy to ~/.minglrconfig
4
+
5
+ == 0.0.1 2009-01-13
6
+
7
+ * 1 major enhancement:
8
+ * Initial release
data/Manifest.txt ADDED
@@ -0,0 +1,22 @@
1
+ History.txt
2
+ Manifest.txt
3
+ PostInstall.txt
4
+ README.rdoc
5
+ Rakefile
6
+ bin/mtx
7
+ bin/minglr
8
+ lib/minglr.rb
9
+ lib/version.rb
10
+ lib/minglr/attachment.rb
11
+ lib/minglr/card.rb
12
+ lib/minglr/input_cache.rb
13
+ lib/minglr/mingle_resource.rb
14
+ lib/minglr/minglr_action.rb
15
+ lib/minglr/minglr_config_parser.rb
16
+ lib/minglr/minglr_options_parser.rb
17
+ lib/minglr/mtx_options_parser.rb
18
+ lib/minglr/property_definition.rb
19
+ lib/minglr/transition_execution.rb
20
+ lib/minglr/user.rb
21
+ tasks/commit.sample.rake
22
+ tasks/svn.sample.rake
data/PostInstall.txt ADDED
@@ -0,0 +1,12 @@
1
+
2
+ For more information:
3
+ on minglr, see http://github.com/schubert/minglr/tree/master
4
+ on Mingle, see http://mingle.thoughtworks.com/mingle-agile-project-management
5
+ on the authors (Stephen Chu), see http://www.stephenchu.com
6
+ (Michael Schubert), see http://schubert.cx/
7
+
8
+ ======================================================================================================
9
+ = Don't not forget to enable your Mingle API authentication by configuring the auth_config.yml file! =
10
+ ======================================================================================================
11
+
12
+ Happy Coding.
data/README.rdoc CHANGED
@@ -1,6 +1,6 @@
1
1
  = minglr
2
2
 
3
- * http://github.com/stephenchu/minglr/tree/master
3
+ * http://github.com/schubert/minglr/tree/master
4
4
 
5
5
  == DESCRIPTION:
6
6
 
@@ -71,7 +71,7 @@ Minglr can be used regardless your application is a Ruby on Rails web applicatio
71
71
 
72
72
  == INSTALL:
73
73
 
74
- * sudo gem install stephenchu-minglr
74
+ * sudo gem install schubert-minglr
75
75
  * Preferably install rb-password (http://www.caliban.org/ruby/ruby-password.shtml), through Macports (sudo port install rb-password)
76
76
  * Enable Mingle API basic authentication in auth_config.yml, then restart it.
77
77
  * Copy over the "path-to-minglr/tasks/*.sample.rake" files and start customizing for your check-in needs.
@@ -80,6 +80,7 @@ Minglr can be used regardless your application is a Ruby on Rails web applicatio
80
80
 
81
81
  (The MIT License)
82
82
 
83
+ Copyright (c) 2009 Michael Schubert
83
84
  Copyright (c) 2009 Stephen Chu
84
85
 
85
86
  Permission is hereby granted, free of charge, to any person obtaining
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ require File.dirname(__FILE__) + '/lib/minglr'
4
4
  # Generate all the Rake tasks
5
5
  # Run 'rake -T' to see list of generated tasks (from gem root directory)
6
6
  $hoe = Hoe.new('minglr', Minglr::VERSION) do |p|
7
- p.developer('Stephen Chu', 'minglr@stephenchu.com')
7
+ p.developer('Michael Schubert', 'michael@schubert.cx')
8
8
  p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
9
9
  p.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
10
10
  p.rubyforge_name = p.name # TODO this is default value
data/lib/minglr.rb ADDED
@@ -0,0 +1,24 @@
1
+ require 'rubygems'
2
+ require 'activesupport'
3
+ require 'activeresource'
4
+ require 'optparse'
5
+
6
+ require File.dirname(__FILE__) + '/minglr/mingle_resource'
7
+ require File.dirname(__FILE__) + '/minglr/mtx_options_parser'
8
+ require File.dirname(__FILE__) + '/minglr/minglr_options_parser'
9
+ require File.dirname(__FILE__) + '/minglr/minglr_config_parser'
10
+ require File.dirname(__FILE__) + '/minglr/card'
11
+ require File.dirname(__FILE__) + '/minglr/user'
12
+ require File.dirname(__FILE__) + '/minglr/property_definition'
13
+ require File.dirname(__FILE__) + '/minglr/attachment'
14
+ require File.dirname(__FILE__) + '/minglr/transition_execution'
15
+ require File.dirname(__FILE__) + '/minglr/input_cache'
16
+ require File.dirname(__FILE__) + "/version"
17
+
18
+ $:.unshift(File.dirname(__FILE__)) unless
19
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
20
+
21
+ module Minglr
22
+ VERSION = MINGLR_VERSION
23
+ ROOT = File.expand_path File.join(File.dirname(__FILE__), '..')
24
+ end
@@ -0,0 +1,7 @@
1
+ class Attachment < MingleResource
2
+
3
+ def self.configure
4
+ self.prefix += "cards/:card_number/"
5
+ end
6
+
7
+ end
@@ -0,0 +1,2 @@
1
+ class Card < MingleResource
2
+ end
@@ -0,0 +1,22 @@
1
+ class InputCache
2
+ class << self
3
+ def put(key, content)
4
+ File.open(file_pathname(key), File::CREAT | File::WRONLY | File::TRUNC) { |file| file.write content }
5
+ end
6
+
7
+ def get(key)
8
+ if content = File.read(file_pathname(key))
9
+ return nil if content.blank?
10
+ content
11
+ end
12
+ rescue
13
+ nil
14
+ end
15
+
16
+ protected
17
+
18
+ def file_pathname(key)
19
+ File.join(Dir::tmpdir, "#{key.to_s.gsub(/[^\w]/, '')}.entry")
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ class MingleResource < ActiveResource::Base
2
+ def self.configure(uri_options)
3
+ self.site = "http://#{uri_options[:username]}:#{uri_options[:password]}@#{uri_options[:host_and_port]}/projects/#{uri_options[:project]}"
4
+ end
5
+ end
@@ -0,0 +1,200 @@
1
+ class MinglrAction
2
+
3
+ ACTIONS = ["cards", "card", "create", "update", "move", "users", "attach", "fetch"].sort!
4
+
5
+ def self.execute(action, options = [], flag_options = {}, config = {})
6
+ MinglrAction.new(action.to_sym, options, flag_options, config)
7
+ end
8
+
9
+ attr_reader :action, :options, :flag_options, :config
10
+
11
+ def initialize(action, options, flag_options, config)
12
+ @action = action
13
+ if action == options[0].to_sym
14
+ options.shift
15
+ else
16
+ options.shift; options.shift
17
+ end
18
+ @options = options
19
+ @flag_options = flag_options
20
+ @config = config
21
+ begin
22
+ self.send(action)
23
+ rescue ActiveResource::ResourceNotFound => error
24
+ puts error.message + " for URL #{MingleResource.site}..."
25
+ end
26
+ end
27
+
28
+ def cards
29
+ attributes = [:number, :card_type_name, @config[:status_property].to_sym, :name]
30
+ cards = Card.find(:all)
31
+ cards = filter_collection(cards, attributes, @options)
32
+ print_collection(cards, attributes)
33
+ end
34
+
35
+ def users
36
+ attributes = [:login, :name, :email]
37
+ users = User.find(:all).collect! { |user| user.user }
38
+ users = filter_collection(users, attributes, @options)
39
+ print_collection(users, attributes, "right")
40
+ end
41
+
42
+ def card
43
+ card_number = @options.first
44
+ attributes = [:number, :card_type_name, @config[:status_property].to_sym, :name, :description]
45
+ card = card_by_number(card_number)
46
+ attachments = Attachment.find(:all, :params => { :card_number => card_number })
47
+ attachments = attachments.collect do |attachment|
48
+ "* #{attachment.file_name}: #{MingleResource.site + attachment.url}"
49
+ end
50
+ output = <<-EOS
51
+ Number: #{card.number}
52
+ Name: #{card.name}
53
+ Type: #{card.card_type_name}
54
+ Status: #{card.send(@config[:status_property].to_sym)}
55
+ Description: #{card.description}
56
+
57
+ Attachments:
58
+ #{attachments.join("\n")}
59
+ EOS
60
+ puts output
61
+ end
62
+
63
+ def attach
64
+ card_number = @options.first
65
+ if card_to_update = card_by_number(card_number)
66
+ url = Attachment.site
67
+ url = (url.to_s.gsub(/#{url.path}$/, '')) + Attachment.collection_path(:card_number => card_number)
68
+ file_name = @flag_options[:file_attachment]
69
+ require 'httpclient'
70
+ if File.exist?(file_name)
71
+ File.open(file_name) do |file|
72
+ body = { 'file' => file, "filename" => file_name }
73
+ client = HTTPClient.new
74
+ client.set_auth(nil, @config[:username], @config[:password])
75
+ res = client.post(url, body)
76
+ if res.status_code == 201
77
+ puts "File '#{file_name}' attached to card #{card_number}"
78
+ else
79
+ puts "Error attaching file '#{file_name}' to card #{card_number} (Got back HTTP code #{res.status_code})"
80
+ end
81
+ end
82
+ else
83
+ puts "Unable to open file '#{file_name}'"
84
+ end
85
+ end
86
+ end
87
+
88
+ def fetch
89
+ card_number = @options.first
90
+ if card_to_update = card_by_number(card_number)
91
+ attachments = Attachment.find(:all, :params => { :card_number => card_number })
92
+ attachments.each do |attachment|
93
+ url = MingleResource.site + attachment.url
94
+ url.userinfo = nil, nil
95
+ puts "Downloading #{url.to_s}:"
96
+ `curl --insecure --progress-bar --output #{attachment.file_name} --user #{@config[:username]}:#{@config[:password]} #{url}`
97
+ end
98
+ end
99
+ end
100
+
101
+ def create
102
+ @flag_options.merge!({ @config[:status_property].to_sym => "New", :cp_owner_user_id => owner_id })
103
+ card = Card.new(@flag_options)
104
+ card.save
105
+ card.reload
106
+ puts "Card #{card.number} created"
107
+ end
108
+
109
+ def update
110
+ @flag_options.merge!({ :cp_owner_user_id => owner_id })
111
+ card_number = @options.first
112
+ card_to_update = card_by_number(card_number)
113
+ @flag_options.each do |attribute, value|
114
+ card_to_update.send("#{attribute.to_s}=".to_sym, value)
115
+ end
116
+ card_to_update.save
117
+ puts "Card #{card_to_update.number} updated\n\n"
118
+ card
119
+ end
120
+
121
+ def move
122
+ card_number = @options.first
123
+ card_to_move = card_by_number(card_number)
124
+ transition_options = { :card => card_number }
125
+ transition_options.merge!({ :comment => @flag_options[:comment]}) if @flag_options[:comment]
126
+ current_status = card_to_move.send(@config[:status_property])
127
+ next_transition = nil
128
+
129
+ case card_to_move.card_type_name.downcase
130
+ when /task/
131
+ status_states = @config.select do |key, value|
132
+ key.to_s =~ /^task_state_/
133
+ end
134
+ when /story/
135
+ status_states = @config.select do |key, value|
136
+ key.to_s =~ /^story_state/
137
+ end
138
+ else
139
+ puts "No transitions defined for card of type #{card_to_move.card_type_name}"
140
+ end
141
+ status_states = status_states.collect {|state| state.last }.collect {|state| state.split(">").collect { |value| value.strip } }
142
+ next_transition = status_states.select {|state| state.first.downcase == current_status.downcase }.first.last
143
+ transition_options.merge!({ :transition => next_transition })
144
+
145
+ if response = TransitionExecution.create(transition_options)
146
+ if response.attributes["status"] == "completed"
147
+ puts "Moved card from #{current_status} to #{next_transition}"
148
+ end
149
+ end
150
+ end
151
+
152
+ def pickup
153
+ raise "not implemented yet"
154
+ end
155
+
156
+ private
157
+
158
+ def filter_collection(collection, attributes, words)
159
+ words.each do |word|
160
+ collection = collection.select do |element|
161
+ output = ""
162
+ attributes.each { |attribute| output << element.send(attribute).to_s + " " }
163
+ output =~ /#{word}/i
164
+ end
165
+ end
166
+ collection
167
+ end
168
+
169
+ def print_collection(collection, attributes, align = "left")
170
+ output = []
171
+ longest_attributes = Array.new(attributes.length, 0)
172
+ alignment = (align == "left" ? :ljust : :rjust)
173
+ collection.each do |element|
174
+ entry = []
175
+ attributes.each_with_index do |attribute, index|
176
+ attribute_value = element.send(attribute).to_s
177
+ longest_attributes[index] = attribute_value.length if attribute_value.length > longest_attributes[index]
178
+ entry << attribute_value
179
+ end
180
+ output << entry
181
+ end
182
+ output.each do |entry|
183
+ row = []
184
+ entry.each_with_index do |part, index|
185
+ row << [part.send(alignment, longest_attributes[index])]
186
+ end
187
+ puts row.join(" - ")
188
+ end
189
+ end
190
+
191
+ def card_by_number(number)
192
+ Card.find(number)
193
+ end
194
+
195
+ def owner_id
196
+ user = User.find(:all).select { |user| user.user.login == @config[:username] }.first
197
+ user.user_id
198
+ end
199
+
200
+ end
@@ -0,0 +1,44 @@
1
+ class MinglrConfigParser
2
+ CONFIG_FILE = ".minglrconfig"
3
+ attr_reader :config
4
+
5
+ def self.parse
6
+ config_files = [File.join(ENV["HOME"], CONFIG_FILE), File.join(ENV["PWD"], CONFIG_FILE)]
7
+ config_files.each do |config_file_name|
8
+ if File.exist?(config_file_name)
9
+ return self.new(File.read(config_file_name)).config
10
+ end
11
+ end
12
+ puts "Unable to find #{CONFIG_FILE} in #{config_files.join(", ")}"
13
+ end
14
+
15
+ def initialize(config_contents)
16
+ @config = {}
17
+ @current_section = nil
18
+ config_contents.each_line do |line|
19
+ line = line.strip!
20
+ case line
21
+ when ""
22
+ next
23
+ when /\[(.*)\]/
24
+ define_section($1.to_s)
25
+ else
26
+ define_var(line)
27
+ end
28
+ end
29
+ @config
30
+ end
31
+
32
+ def define_section(section_name)
33
+ @config[section_name.to_sym] = {} unless @config.has_key?(section_name.to_sym)
34
+ @current_section = section_name.to_sym
35
+ end
36
+
37
+ def define_var(line)
38
+ key, value = line.split("=")
39
+ key.strip!
40
+ value.strip!
41
+ @config[@current_section][key.to_sym] = value
42
+ end
43
+
44
+ end
@@ -0,0 +1,70 @@
1
+ class MinglrOptionsParser
2
+ def self.parse(args, *required_by_command)
3
+ project_options = []
4
+
5
+ if MingleResource.site
6
+ properties = PropertyDefinition.find(:all)
7
+ project_options = properties.collect do |property|
8
+ [property.column_name.to_sym, property.name]
9
+ end
10
+ end
11
+ command_options = {}
12
+ parser = OptionParser.new do |opts|
13
+ opts.banner = "Usage: minglr [action] [options]"
14
+ opts.separator ""
15
+ opts.separator "Valid Commands Are: #{MinglrAction::ACTIONS.join(", ")}"
16
+
17
+ opts.on("-n NAME", String, "Short name of card") do |card_name|
18
+ command_options[:name] = card_name
19
+ end
20
+
21
+ opts.on("-d DESCRIPTION", String, "Description of card") do |card_description|
22
+ command_options[:description] = card_description
23
+ end
24
+
25
+ opts.on("-t TYPE", String, "Type of card") do |card_type|
26
+ command_options[:card_type_name] = card_type
27
+ end
28
+
29
+ opts.on("-c COMMENT", String, "Comment") do |comment|
30
+ command_options[:comment] = comment
31
+ end
32
+
33
+ opts.on("-f FILE", String, "File to attach") do |file|
34
+ command_options[:file_attachment] = file
35
+ end
36
+
37
+ unless project_options.empty?
38
+ opts.separator ""
39
+ opts.separator "Project Specific Options"
40
+
41
+ project_options.each do |option_pair|
42
+ option_switch = option_pair[1].downcase.gsub(/\s|_/, "-").gsub(/--|---/, '-').gsub(/--/, '-')
43
+ opts.on("--#{option_switch}", String, "Set the #{option_pair[1]} for a card") do |option|
44
+ command_options[option_pair[0]] = option
45
+ end
46
+ end
47
+
48
+ opts.separator ""
49
+ end
50
+
51
+ opts.on_tail("-h", "--help", "Show this help message.") do |help|
52
+ puts opts
53
+ exit
54
+ end
55
+
56
+ opts.on_tail("--version", "Show version") do
57
+ puts Minglr::VERSION
58
+ exit
59
+ end
60
+
61
+ if args.empty?
62
+ puts opts
63
+ exit
64
+ end
65
+ end
66
+
67
+ parser.parse! args
68
+ command_options
69
+ end
70
+ end
@@ -0,0 +1,53 @@
1
+ class MtxOptionsParser
2
+ def self.parse(args, *required_by_command)
3
+ uri_options = {}
4
+ command_options = {}
5
+
6
+ parser = OptionParser.new do |opts|
7
+ opts.banner = "Usage: mtx [options]"
8
+ opts.on("--transition TRANSITION", "Transition name.") do |transition|
9
+ command_options[:transition] = transition
10
+ end
11
+
12
+ opts.on("--card CARD", "Card number.") do |card|
13
+ command_options[:card] = card
14
+ end
15
+
16
+ opts.on("--properties ARGS", Array, "User-entered properties and values for the transition in array format. Must be an even number of comma-delimited values, like \"A,B,'C with spaces','D with spaces'\".") do |args|
17
+ command_options[:properties] = args.in_groups_of(2).map { |key, value| {'name' => key, 'value' => value} }
18
+ end
19
+
20
+ opts.on("--comment COMMENT", "Transition comment. This may be required depending on your transition settings.") do |comment|
21
+ command_options[:comment] = comment
22
+ end
23
+
24
+ opts.on("--username USERNAME", "Mingle username.") do |username|
25
+ uri_options[:username] = username
26
+ end
27
+
28
+ opts.on("--password PASSWORD", "Mingle password.") do |password|
29
+ uri_options[:password] = password
30
+ end
31
+
32
+ opts.on("--host_port HOST_PORT", "Host and port.") do |host_and_port|
33
+ uri_options[:host_and_port] = host_and_port
34
+ end
35
+
36
+ opts.on("--project PROJECT", "Project name.") do |project|
37
+ uri_options[:project] = project
38
+ end
39
+ end
40
+
41
+ parser.parse! args
42
+
43
+ ([:project, :host_and_port] | required_by_command).each do |arg|
44
+ unless command_options[arg] || uri_options[arg]
45
+ # TODO: let commands handle their own errors
46
+ $stderr.puts "Missing command-line argument --#{arg.to_s}, use --help for command-line options."
47
+ exit 1
48
+ end
49
+ end
50
+
51
+ [uri_options, command_options]
52
+ end
53
+ end
@@ -0,0 +1,2 @@
1
+ class PropertyDefinition < MingleResource
2
+ end
@@ -0,0 +1,2 @@
1
+ class TransitionExecution < MingleResource
2
+ end
@@ -0,0 +1,2 @@
1
+ class User < MingleResource
2
+ end
data/lib/version.rb ADDED
@@ -0,0 +1 @@
1
+ MINGLR_VERSION = "1.0.6"
@@ -0,0 +1,86 @@
1
+ require 'minglr'
2
+
3
+ desc "Run this if you have new code to check in"
4
+ task :check_in => %w( minglr:dev_complete:prepare
5
+ svn:add
6
+ svn:rm
7
+ svn:up
8
+ svn:conflict_check
9
+ db:migrate
10
+ test
11
+ svn:ci
12
+ minglr:dev_complete:transition )
13
+
14
+ namespace :minglr do
15
+ task :prepare do
16
+ @host_port = 'mingle-host:8080' # REPLACE WITH YOUR MINGLE HOST AND PORT
17
+ @project = 'project_4808' # REPLACE WITH YOUR MINGLE PROJECT IDENTIFIER
18
+ end
19
+
20
+ namespace :dev_complete do
21
+ desc "Gather inputs to execute a 'Development Complete' card transition."
22
+ task :prepare => 'minglr:prepare' do
23
+ @transition = 'Transition Uno' # REPLACE WITH THE TRANSITION YOU WANT TO EXECUTE
24
+ @username = prompt 'Please enter your Mingle username', :cache_key => 'username'
25
+ @password = prompt 'Please enter your Mingle password', :secure => true
26
+ @card = prompt 'Please enter a Mingle card number', :cache_key => 'card'
27
+ @commit_message = prompt 'Please enter a commit message', :cache_key => 'commit_message'
28
+ @comment = prompt 'Please enter a comment for the transition', :cache_key => 'transition_comment'
29
+ @properties = ['Actual Effort', 'Property Dos'].inject([]) do |memo, property_name|
30
+ memo << [ %Q|"#{escape(property_name)}"|,
31
+ %Q|"#{prompt(%Q{Please enter the value for the property "#{property_name}"}, :cache_key => property_name)}"|]
32
+ memo
33
+ end.flatten.join(',')
34
+ @story_complete = prompt('Is the story complete? (y/N)', :cache_key => 'story_complete').to_s.downcase == 'y'
35
+ end
36
+
37
+ desc "Executes a 'Development Complete' card transition."
38
+ task :transition => 'minglr:dev_complete:prepare' do
39
+ if @story_complete
40
+ cmd = %Q|#{Minglr::ROOT}/bin/mtx --username "#{@username}" --password "#{@password}" --card "#{@card}" --comment "#{@comment}" --transition "#{@transition}" --properties #{@properties} --host_port "#{@host_port}" --project "#{@project}"|
41
+ `#{cmd}`
42
+ raise "Minglr transition failed with exit status #{$?}." unless $?.success?
43
+ end
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def prompt(message, options = { :secure => false })
50
+ require 'rubygems'
51
+ begin
52
+ require 'password' rescue Exception
53
+ rescue Exception
54
+ @clear_text_password = true
55
+ end
56
+
57
+ user_input = if options[:secure]
58
+ if @clear_text_password
59
+ puts "NOTE: You do not have the 'rb-password' port installed. Perform 'sudo port install rb-password' to avoid your password shown in clear text as you type below."
60
+ print "#{message}: "
61
+ $stdin.gets.chop
62
+ else
63
+ Password.get "#{message}: "
64
+ end
65
+ else
66
+ print "#{message}"
67
+ if cache = InputCache.get(options[:cache_key])
68
+ print " [#{cache}]"
69
+ end
70
+ print ": "
71
+ $stdin.gets.chop
72
+ end
73
+
74
+ if !options[:secure] && cache_key = options.delete(:cache_key)
75
+ user_input = InputCache.get(cache_key) if user_input.blank?
76
+ InputCache.put(cache_key, user_input)
77
+ end
78
+
79
+ user_input = escape(user_input)
80
+ end
81
+
82
+ def escape(user_input)
83
+ user_input.gsub(/["]/, %q{\"}) if user_input
84
+ end
85
+
86
+ end
@@ -0,0 +1,27 @@
1
+ namespace :svn do
2
+ desc "Updates your local WC"
3
+ task :up do
4
+ `svn up`
5
+ end
6
+
7
+ desc "Adds new local WC files"
8
+ task :add do
9
+ `svn st | grep '^?' | xargs svn add`
10
+ end
11
+
12
+ desc "Removes deleted local WC files"
13
+ task :rm do
14
+ `svn st | grep '^!' | xargs svn rm`
15
+ end
16
+
17
+ desc "Check-in your local WC changes"
18
+ task :ci do
19
+ `svn ci -m "#{@commit_message || ENV['commit_message']}"`
20
+ end
21
+
22
+ desc "Checks if your WC has merge conflicts."
23
+ task :conflict_check do
24
+ `svn st | awk '{ if( $1 == "C" ) exit 1}'`
25
+ raise 'You have conflicts!' unless $?.success?
26
+ end
27
+ end
metadata CHANGED
@@ -1,39 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schubert-minglr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.3
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
- - Stephen Chu
8
- - Chris O'Meara
9
7
  - Michael Schubert
10
8
  autorequire:
11
9
  bindir: bin
12
10
  cert_chain: []
13
11
 
14
- date: 2009-06-01 00:00:00 -07:00
12
+ date: 2009-06-02 00:00:00 -07:00
15
13
  default_executable:
16
- dependencies: []
17
-
18
- description: Mingle command line tool
19
- email: michael@schubert.cx
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activesupport
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.1.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: activeresource
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.1.0
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: newgem
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 1.4.1
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: hoe
47
+ type: :development
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 1.8.0
54
+ version:
55
+ description: "* This gem provides two executable binaries to interact with Mingle (http://mingle.thoughtworks.com/mingle-agile-project-management) through its API. It also has sample interactive Rake task on how to facilitate easy card movements when a card enters/exits the development queue. * mtx is a binary that facilities transition changes for use on rake tasks * minglr is a more interactive tool that provides a quick interface for many common uses"
56
+ email:
57
+ - michael@schubert.cx
20
58
  executables:
21
- - minglr
22
59
  - mtx
60
+ - minglr
23
61
  extensions: []
24
62
 
25
- extra_rdoc_files: []
26
-
63
+ extra_rdoc_files:
64
+ - History.txt
65
+ - Manifest.txt
66
+ - PostInstall.txt
67
+ - README.rdoc
27
68
  files:
28
- - minglr.gemspec
29
- - Rakefile
69
+ - History.txt
70
+ - Manifest.txt
71
+ - PostInstall.txt
30
72
  - README.rdoc
31
- - minglrconfig.sample
32
- has_rdoc: false
73
+ - Rakefile
74
+ - bin/mtx
75
+ - bin/minglr
76
+ - lib/minglr.rb
77
+ - lib/version.rb
78
+ - lib/minglr/attachment.rb
79
+ - lib/minglr/card.rb
80
+ - lib/minglr/input_cache.rb
81
+ - lib/minglr/mingle_resource.rb
82
+ - lib/minglr/minglr_action.rb
83
+ - lib/minglr/minglr_config_parser.rb
84
+ - lib/minglr/minglr_options_parser.rb
85
+ - lib/minglr/mtx_options_parser.rb
86
+ - lib/minglr/property_definition.rb
87
+ - lib/minglr/transition_execution.rb
88
+ - lib/minglr/user.rb
89
+ - tasks/commit.sample.rake
90
+ - tasks/svn.sample.rake
91
+ has_rdoc: true
33
92
  homepage: http://github.com/schubert/minglr/tree/master
34
- post_install_message:
35
- rdoc_options: []
36
-
93
+ post_install_message: PostInstall.txt
94
+ rdoc_options:
95
+ - --main
96
+ - README.rdoc
37
97
  require_paths:
38
98
  - lib
39
99
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -50,10 +110,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
50
110
  version:
51
111
  requirements: []
52
112
 
53
- rubyforge_project:
113
+ rubyforge_project: minglr
54
114
  rubygems_version: 1.2.0
55
115
  signing_key:
56
116
  specification_version: 2
57
- summary: Mingle command line tool
117
+ summary: "* This gem provides two executable binaries to interact with Mingle (http://mingle.thoughtworks.com/mingle-agile-project-management) through its API"
58
118
  test_files: []
59
119
 
data/minglr.gemspec DELETED
@@ -1,14 +0,0 @@
1
- Gem::Specification.new do |s|
2
- s.name = "minglr"
3
- s.version = "0.1.0.3"
4
- s.date = "2009-06-01"
5
- s.bindir = 'bin'
6
- s.executables << 'minglr'
7
- s.executables << 'mtx'
8
- s.summary = "Mingle command line tool"
9
- s.email = "michael@schubert.cx"
10
- s.homepage = "http://github.com/schubert/minglr/tree/master"
11
- s.description = "Mingle command line tool"
12
- s.authors = ["Stephen Chu", "Chris O'Meara", "Michael Schubert"]
13
- s.files = Dir["bin/*"] + Dir["*.txt"] + Dir["lib/minglr/*.rb"] + Dir["lib/*.rb"] + ["minglr.gemspec", "Rakefile", "README.rdoc", "minglrconfig.sample"] + Dir["tasks/*"]
14
- end
data/minglrconfig.sample DELETED
@@ -1,18 +0,0 @@
1
- [global]
2
- default = someproject
3
- username = yourusername
4
-
5
- [someproject]
6
- url = http://your.mingle.host.com/mingle/projects/someproject
7
- username = yourusername
8
- password = YOURMINGLEPASSWORD
9
- delete_property = cp_story_status
10
- delete_state = Deleted
11
- status_property = cp_story_status
12
- story_state_1 = Ready For Development > Sign Up for Story
13
- story_state_2 = Dev In Progress > Dev Complete
14
- task_state_1 = New > New to ready for Dev for Task
15
- task_state_2 = Ready for Development > Dev in Progress
16
- task_state_3 = Dev In Progress > Story from Dev in Progress to Dev Complete
17
- story_checkout = story_state_1
18
- task_checkout = story_state_2