schubert-minglr 1.2.0 → 1.3.0
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 +2 -0
- data/Rakefile +16 -3
- data/VERSION.yml +2 -2
- data/bin/mtx +3 -3
- data/cucumber.yml +2 -0
- data/features/cards.feature +27 -0
- data/features/step_definitions/minglr_steps.rb +34 -0
- data/features/step_definitions/shared_steps.rb +69 -0
- data/features/users.feature +6 -0
- data/lib/minglr.rb +6 -2
- data/lib/minglr/action.rb +2 -2
- data/lib/minglr/mtx/input_cache.rb +24 -0
- data/lib/minglr/mtx/options_parser.rb +58 -0
- data/lib/minglr/options_parser.rb +13 -10
- data/lib/minglr/resources/attachment.rb +6 -1
- data/lib/minglr/resources/card.rb +26 -16
- data/lib/minglr/resources/user.rb +0 -6
- data/minglr.gemspec +31 -9
- data/tasks/commit.sample.rake +3 -3
- data/test/action_test.rb +75 -0
- data/test/commands_test.rb +111 -0
- data/test/config_parser_test.rb +113 -0
- data/test/options_parser_test.rb +74 -0
- data/test/resources/attachment_test.rb +53 -3
- data/test/resources/base_test.rb +15 -2
- data/test/resources/card_test.rb +119 -9
- data/test/resources/project_test.rb +18 -0
- data/test/resources/user_test.rb +0 -7
- data/test/test_helper.rb +2 -0
- metadata +21 -7
- data/lib/minglr/input_cache.rb +0 -22
- data/lib/minglr/mtx_options_parser.rb +0 -53
@@ -5,7 +5,7 @@ module Resources
|
|
5
5
|
class AttachmentTest < Test::Unit::TestCase
|
6
6
|
|
7
7
|
context Attachment do
|
8
|
-
|
8
|
+
|
9
9
|
context "configure" do
|
10
10
|
|
11
11
|
should "append to the site url" do
|
@@ -21,14 +21,64 @@ module Resources
|
|
21
21
|
|
22
22
|
context "fetch" do
|
23
23
|
|
24
|
-
|
24
|
+
should "download all found attachments for a given card number" do
|
25
|
+
card = Card.new
|
26
|
+
card.stubs(:number).returns(1)
|
27
|
+
|
28
|
+
attachment1 = Attachment.new
|
29
|
+
attachment1.stubs(:url).returns("http://attachment1.url")
|
30
|
+
attachment1.stubs(:file_name).returns("attachment1.txt")
|
31
|
+
attachment2 = Attachment.new
|
32
|
+
attachment2.stubs(:url).returns("http://attachment2.url")
|
33
|
+
attachment2.stubs(:file_name).returns("attachment2.txt")
|
34
|
+
|
35
|
+
Attachment.stubs(:puts)
|
36
|
+
Card.expects(:find).with(1).returns(card)
|
37
|
+
Attachment.expects(:find).with(:all, :params => { :card_number => 1 }).returns([attachment1, attachment2])
|
38
|
+
Attachment.expects(:curl).with("curl --insecure --progress-bar --output attachment1.txt --user username:password http://attachment1.url")
|
39
|
+
Attachment.expects(:curl).with("curl --insecure --progress-bar --output attachment2.txt --user username:password http://attachment2.url")
|
40
|
+
|
41
|
+
Attachment.fetch(1, "username", "password")
|
25
42
|
end
|
26
43
|
|
27
44
|
end
|
28
45
|
|
29
46
|
context "attach" do
|
30
47
|
|
31
|
-
|
48
|
+
setup do
|
49
|
+
options = { :username => "user",
|
50
|
+
:password => "pass",
|
51
|
+
:url => "proto://somehost.com:1234/projects/my_project" }
|
52
|
+
Base.configure(options)
|
53
|
+
end
|
54
|
+
|
55
|
+
should "upload file for a given card number" do
|
56
|
+
file_name = File.join(File.dirname(__FILE__), "..", "..", "Rakefile")
|
57
|
+
|
58
|
+
card = Card.new
|
59
|
+
card.stubs(:number).returns(1)
|
60
|
+
|
61
|
+
fake_response = stub("Response", :status_code => 201)
|
62
|
+
fake_client = mock("HTTPClient")
|
63
|
+
fake_client.expects(:post).returns(fake_response)
|
64
|
+
fake_client.expects(:set_auth).with(nil, "username", "password")
|
65
|
+
|
66
|
+
Card.expects(:find).with(1).returns(card)
|
67
|
+
HTTPClient.expects(:new).returns(fake_client)
|
68
|
+
Attachment.expects(:puts).with("File '#{file_name}' attached to card 1")
|
69
|
+
|
70
|
+
Attachment.attach(1, file_name, "username", "password")
|
71
|
+
end
|
72
|
+
|
73
|
+
should "warn for invalid file" do
|
74
|
+
card = Card.new
|
75
|
+
card.stubs(:number).returns(1)
|
76
|
+
|
77
|
+
Card.expects(:find).with(1).returns(card)
|
78
|
+
File.expects(:exist?).with("myfile.txt").returns(false)
|
79
|
+
Attachment.expects(:warn).with("Unable to open file 'myfile.txt'")
|
80
|
+
|
81
|
+
Attachment.attach(1, "myfile.txt", "username", "password")
|
32
82
|
end
|
33
83
|
|
34
84
|
end
|
data/test/resources/base_test.rb
CHANGED
@@ -30,10 +30,23 @@ module Resources
|
|
30
30
|
|
31
31
|
context "print_collection" do
|
32
32
|
|
33
|
-
|
33
|
+
setup do
|
34
|
+
@object1 = stub("Object", :name => "Foo", :description => "Bar")
|
35
|
+
@object2 = stub("Object", :name => "Bar", :description => "Frobble")
|
36
|
+
@collection = [@object1, @object2]
|
37
|
+
@attributes = [:name, :description]
|
34
38
|
end
|
35
39
|
|
36
|
-
|
40
|
+
should "print values of attributes of objects separated by dashes and aligning columns of values" do
|
41
|
+
Base.expects(:puts).with("Foo - Bar ")
|
42
|
+
Base.expects(:puts).with("Bar - Frobble")
|
43
|
+
Base.print_collection(@collection, @attributes)
|
44
|
+
end
|
45
|
+
|
46
|
+
should "allow for right adjusted values" do
|
47
|
+
Base.expects(:puts).with("Foo - Bar")
|
48
|
+
Base.expects(:puts).with("Bar - Frobble")
|
49
|
+
Base.print_collection(@collection, @attributes, :right)
|
37
50
|
end
|
38
51
|
|
39
52
|
end
|
data/test/resources/card_test.rb
CHANGED
@@ -5,16 +5,33 @@ module Resources
|
|
5
5
|
class CardTest < Test::Unit::TestCase
|
6
6
|
|
7
7
|
context Card do
|
8
|
-
|
8
|
+
|
9
9
|
context "create" do
|
10
10
|
|
11
|
-
|
11
|
+
should "create a card with options passed in" do
|
12
|
+
card = Card.new
|
13
|
+
card.stubs(:number).returns(1)
|
14
|
+
Card.expects(:new).with(:name => "Name").returns(card)
|
15
|
+
Card.any_instance.expects(:save).returns(true)
|
16
|
+
Card.any_instance.expects(:reload)
|
17
|
+
Card.expects(:puts).with("Card #1 created")
|
18
|
+
Card.create({:name => "Name"})
|
12
19
|
end
|
13
20
|
|
14
|
-
|
21
|
+
should "create a card with the status of new if status property is available" do
|
22
|
+
card = Card.new
|
23
|
+
card.stubs(:number).returns(1)
|
24
|
+
Card.expects(:new).with(:some_option => "value", :cp_status => "New").returns(card)
|
25
|
+
Card.any_instance.expects(:save).returns(true)
|
26
|
+
Card.any_instance.expects(:reload)
|
27
|
+
Card.expects(:puts).with("Card #1 created")
|
28
|
+
Card.create({:some_option => "value"}, "cp_status")
|
15
29
|
end
|
16
30
|
|
17
|
-
|
31
|
+
should "warn if it is unable to create the card" do
|
32
|
+
Card.any_instance.expects(:save).returns(false)
|
33
|
+
Card.expects(:warn).with("Unable to create card")
|
34
|
+
Card.create
|
18
35
|
end
|
19
36
|
|
20
37
|
end
|
@@ -22,9 +39,44 @@ module Resources
|
|
22
39
|
context "move" do
|
23
40
|
|
24
41
|
should "move card from one state to the next as defined" do
|
42
|
+
card = Card.new
|
43
|
+
card.stubs(:card_type_name).returns("story")
|
44
|
+
card.stubs(:status).returns("New")
|
45
|
+
config = { :story_state_1 => "New > Dev", :status_property => "status"}
|
46
|
+
response = stub("Response", :attributes => { "status" => "completed" })
|
47
|
+
|
48
|
+
Card.expects(:find).with(1).returns(card)
|
49
|
+
TransitionExecution.expects(:create).with(:transition => 'Dev', :card => 1).returns(response)
|
50
|
+
Card.expects(:puts).with("Moved card from New to Dev")
|
51
|
+
Card.move(1, {}, config)
|
52
|
+
end
|
53
|
+
|
54
|
+
should "warn if no matching card type is found" do
|
55
|
+
card = Card.new
|
56
|
+
card.stubs(:card_type_name).returns("someothertype")
|
57
|
+
card.stubs(:status).returns("New")
|
58
|
+
config = { :story_state_1 => "New > Dev", :status_property => "status"}
|
59
|
+
|
60
|
+
Card.expects(:find).with(1).returns(card)
|
61
|
+
Card.expects(:warn).with("No transitions defined for card of type someothertype")
|
62
|
+
Card.move(1, {}, config)
|
63
|
+
end
|
64
|
+
|
65
|
+
should "warn if card has no status property" do
|
66
|
+
card = Card.new
|
67
|
+
card.stubs(:card_type_name).returns("story")
|
68
|
+
card.stubs(:current_status).returns("New")
|
69
|
+
config = { :story_state_1 => "New > Dev"}
|
70
|
+
|
71
|
+
Card.expects(:find).with(1).returns(card)
|
72
|
+
Card.expects(:warn).with("No known status of card #1, cannot move!")
|
73
|
+
Card.move(1, {}, config)
|
25
74
|
end
|
26
75
|
|
27
76
|
should "warn if card cannot be found" do
|
77
|
+
Card.expects(:find).with(0).returns(nil)
|
78
|
+
Card.expects(:warn).with("No card #0 found to move")
|
79
|
+
Card.move(0)
|
28
80
|
end
|
29
81
|
|
30
82
|
end
|
@@ -57,27 +109,85 @@ module Resources
|
|
57
109
|
|
58
110
|
context "print_card" do
|
59
111
|
|
60
|
-
|
112
|
+
should "print the details for a given card" do
|
113
|
+
status_property = "cp_status"
|
114
|
+
card = Card.new
|
115
|
+
card.expects(:to_s).with(status_property)
|
116
|
+
Card.expects(:find).with(1).returns(card)
|
117
|
+
Card.stubs(:puts)
|
118
|
+
Card.print_card(1, status_property)
|
119
|
+
end
|
120
|
+
|
121
|
+
should "warn if it is not able to find the card" do
|
122
|
+
Card.expects(:find).with(0).returns(nil)
|
123
|
+
Card.expects(:warn).with("No card #0 found")
|
124
|
+
Card.print_card(0)
|
61
125
|
end
|
62
126
|
|
63
127
|
end
|
64
128
|
|
65
129
|
context "update" do
|
66
130
|
|
67
|
-
|
131
|
+
should "update a card with the options passed in" do
|
132
|
+
card = mock("Card")
|
133
|
+
card.stubs(:number).returns(1)
|
134
|
+
card.expects(:foo=).with("bar")
|
135
|
+
card.expects(:baz=).with("frobble")
|
136
|
+
card.expects(:save)
|
137
|
+
Card.stubs(:puts)
|
138
|
+
Card.expects(:find).with(1).returns(card)
|
139
|
+
|
140
|
+
Card.update(1, {:foo => "bar", :baz => "frobble"})
|
68
141
|
end
|
69
142
|
|
70
|
-
|
143
|
+
should "print out the details of the card after updating" do
|
144
|
+
card = mock("Card")
|
145
|
+
card.stubs(:number).returns(1)
|
146
|
+
card.stubs(:foo=)
|
147
|
+
card.stubs(:baz=)
|
148
|
+
card.stubs(:save)
|
149
|
+
Card.stubs(:find).with(1).returns(card)
|
150
|
+
|
151
|
+
Card.expects(:puts).with("Card #1 updated\n\n")
|
152
|
+
Card.expects(:puts).with(card.to_s)
|
153
|
+
Card.update(1, {:foo => "bar", :baz => "frobble"})
|
71
154
|
end
|
72
155
|
|
73
|
-
|
156
|
+
should "warn if it is not able to find the card" do
|
157
|
+
Card.expects(:find).with(0).returns(nil)
|
158
|
+
Card.expects(:warn).with("Unable to update card #0")
|
159
|
+
Card.update(0)
|
74
160
|
end
|
75
161
|
|
76
162
|
end
|
77
163
|
|
78
164
|
context "to_s" do
|
79
165
|
|
80
|
-
|
166
|
+
should "format the details of a given card including attachments" do
|
167
|
+
Resources::Base.site = "http://foo.bar"
|
168
|
+
|
169
|
+
attachment = Attachment.new
|
170
|
+
attachment.stubs(:file_name).returns("My File Name")
|
171
|
+
attachment.stubs(:url).returns("http://some.url")
|
172
|
+
Attachment.expects(:find).with(:all, :params => { :card_number => 1 }).returns([attachment])
|
173
|
+
|
174
|
+
card = Card.new
|
175
|
+
card.stubs(:number).returns(1)
|
176
|
+
card.stubs(:name).returns("My Name")
|
177
|
+
card.stubs(:card_type_name).returns("My Type")
|
178
|
+
card.stubs(:description).returns("My Description")
|
179
|
+
|
180
|
+
expected_output = <<-EOS
|
181
|
+
Number: 1
|
182
|
+
Name: My Name
|
183
|
+
Type: My Type
|
184
|
+
Status:
|
185
|
+
Description: My Description
|
186
|
+
|
187
|
+
Attachments:
|
188
|
+
* My File Name: http://some.url
|
189
|
+
EOS
|
190
|
+
assert_equal expected_output, card.to_s
|
81
191
|
end
|
82
192
|
|
83
193
|
end
|
@@ -18,6 +18,24 @@ module Resources
|
|
18
18
|
end
|
19
19
|
|
20
20
|
end
|
21
|
+
|
22
|
+
context "print_all" do
|
23
|
+
|
24
|
+
should "print list of all projects" do
|
25
|
+
project1 = Project.new
|
26
|
+
project2 = Project.new
|
27
|
+
Project.expects(:find).with(:all).returns([project1, project2])
|
28
|
+
Project.expects(:print_collection).with([project1, project2], [:name, :description])
|
29
|
+
Project.print_all
|
30
|
+
end
|
31
|
+
|
32
|
+
should "print warning if no projects are found" do
|
33
|
+
Project.expects(:find).with(:all).returns([])
|
34
|
+
Project.expects(:warn).with("No projects found")
|
35
|
+
Project.print_all
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
21
39
|
|
22
40
|
end
|
23
41
|
|
data/test/resources/user_test.rb
CHANGED
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schubert-minglr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Schubert
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2009-07-
|
14
|
+
date: 2009-07-27 00:00:00 -07:00
|
15
15
|
default_executable:
|
16
16
|
dependencies: []
|
17
17
|
|
@@ -35,12 +35,17 @@ files:
|
|
35
35
|
- VERSION.yml
|
36
36
|
- bin/minglr
|
37
37
|
- bin/mtx
|
38
|
+
- cucumber.yml
|
39
|
+
- features/cards.feature
|
40
|
+
- features/step_definitions/minglr_steps.rb
|
41
|
+
- features/step_definitions/shared_steps.rb
|
42
|
+
- features/users.feature
|
38
43
|
- lib/minglr.rb
|
39
44
|
- lib/minglr/action.rb
|
40
45
|
- lib/minglr/config_parser.rb
|
41
46
|
- lib/minglr/extensions/array.rb
|
42
|
-
- lib/minglr/input_cache.rb
|
43
|
-
- lib/minglr/
|
47
|
+
- lib/minglr/mtx/input_cache.rb
|
48
|
+
- lib/minglr/mtx/options_parser.rb
|
44
49
|
- lib/minglr/options_parser.rb
|
45
50
|
- lib/minglr/resources/attachment.rb
|
46
51
|
- lib/minglr/resources/base.rb
|
@@ -53,7 +58,11 @@ files:
|
|
53
58
|
- minglrconfig.sample
|
54
59
|
- tasks/commit.sample.rake
|
55
60
|
- tasks/svn.sample.rake
|
61
|
+
- test/action_test.rb
|
62
|
+
- test/commands_test.rb
|
63
|
+
- test/config_parser_test.rb
|
56
64
|
- test/extensions/array_test.rb
|
65
|
+
- test/options_parser_test.rb
|
57
66
|
- test/resources/attachment_test.rb
|
58
67
|
- test/resources/base_test.rb
|
59
68
|
- test/resources/card_test.rb
|
@@ -61,8 +70,9 @@ files:
|
|
61
70
|
- test/resources/property_definition_test.rb
|
62
71
|
- test/resources/user_test.rb
|
63
72
|
- test/test_helper.rb
|
64
|
-
has_rdoc:
|
73
|
+
has_rdoc: false
|
65
74
|
homepage: http://github.com/schubert/minglr
|
75
|
+
licenses:
|
66
76
|
post_install_message: PostInstall.txt
|
67
77
|
rdoc_options:
|
68
78
|
- --charset=UTF-8
|
@@ -83,12 +93,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
93
|
requirements: []
|
84
94
|
|
85
95
|
rubyforge_project:
|
86
|
-
rubygems_version: 1.
|
96
|
+
rubygems_version: 1.3.5
|
87
97
|
signing_key:
|
88
|
-
specification_version:
|
98
|
+
specification_version: 3
|
89
99
|
summary: command line user tool for Mingle (http://mingle.thoughtworks.com/mingle-agile-project-management)
|
90
100
|
test_files:
|
101
|
+
- test/action_test.rb
|
102
|
+
- test/commands_test.rb
|
103
|
+
- test/config_parser_test.rb
|
91
104
|
- test/extensions/array_test.rb
|
105
|
+
- test/options_parser_test.rb
|
92
106
|
- test/resources/attachment_test.rb
|
93
107
|
- test/resources/base_test.rb
|
94
108
|
- test/resources/card_test.rb
|
data/lib/minglr/input_cache.rb
DELETED
@@ -1,22 +0,0 @@
|
|
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
|
@@ -1,53 +0,0 @@
|
|
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
|