crab 0.2.10 → 0.2.11
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +44 -34
- data/features/show-from-rally.feature +0 -1
- data/features/update-story-in-rally.feature +0 -8
- data/lib/crab.rb +1 -0
- data/lib/crab/cucumber_feature.rb +1 -1
- data/lib/crab/logging.rb +12 -0
- data/lib/crab/rally_to_cucumber_adapter.rb +10 -3
- data/lib/crab/story.rb +7 -6
- data/lib/crab/testcase.rb +15 -2
- data/lib/crab/utilities.rb +6 -7
- data/lib/crab/version.rb +1 -1
- metadata +5 -4
data/README.md
CHANGED
@@ -52,6 +52,10 @@ Thankfully, that part is easy:
|
|
52
52
|
US1002: Launches Rockets Upon Command from Evil Mastermind
|
53
53
|
|
54
54
|
$ crab story show US1001
|
55
|
+
# language: en
|
56
|
+
# state: grooming
|
57
|
+
# fetched: 2011-10-04T13:32:35-03:00
|
58
|
+
# revision: 17, by cv@lixo.org
|
55
59
|
Feature: [US1001] Arms Rockets After Boot
|
56
60
|
|
57
61
|
In order to gain bargaining power with Super Hero
|
@@ -60,11 +64,16 @@ Thankfully, that part is easy:
|
|
60
64
|
|
61
65
|
...
|
62
66
|
|
67
|
+
Note the comments at the top of the file: language is relevant to
|
68
|
+
Cucumber, but all others are only to help keeping track of revisions
|
69
|
+
and changes.
|
70
|
+
|
63
71
|
If there are any test cases associated with that story, they get converted
|
64
72
|
into Cucumber scenarios:
|
65
73
|
|
66
74
|
$ crab story show US1001
|
67
75
|
...
|
76
|
+
# revision: 6, by cv@lixo.org
|
68
77
|
@critical @automated @high
|
69
78
|
Scenario: [TC10001] Rocket Silo Is Unlocked
|
70
79
|
Given a silo where the rockets are stored
|
@@ -129,6 +138,32 @@ straight from the command line:
|
|
129
138
|
There are many more switches. Try exploring `crab --help` to find
|
130
139
|
out more.
|
131
140
|
|
141
|
+
Troubleshooting
|
142
|
+
---------------
|
143
|
+
|
144
|
+
This is still very rudimentary, but you can set `CRAB_LOG_LEVEL`
|
145
|
+
to one of the constants defined in `Logger` to see more output for
|
146
|
+
diagnosis. They are:
|
147
|
+
|
148
|
+
- 0: DEBUG
|
149
|
+
- 1: INFO
|
150
|
+
- 2: WARN
|
151
|
+
- 3: ERROR
|
152
|
+
- 4: FATAL
|
153
|
+
- 5: UNKNOWN
|
154
|
+
|
155
|
+
The default is `WARN`, which should be good enough for most day-to-day
|
156
|
+
usage, but if you are having trouble and would like to submit a bug
|
157
|
+
report, please try again with `CRAB_LOG_LEVEL` set to `0` or `1`:
|
158
|
+
|
159
|
+
$ CRAB_LOG_LEVEL=0 crab story show US1001
|
160
|
+
I, [2011-10-04T02:33:22.795535 #16754] INFO -- crab: Getting credentials...
|
161
|
+
I, [2011-10-04T02:33:22.795789 #16754] INFO -- crab: Connecting to Rally as cvillela@thoughtworks.com...
|
162
|
+
I, [2011-10-04T02:33:28.343039 #16754] INFO -- crab: Looking up story with ID US1001
|
163
|
+
I, [2011-10-04T02:33:31.861501 #16754] INFO -- crab: US1001: 1 test case(s) found
|
164
|
+
I, [2011-10-04T02:33:38.681445 #16754] INFO -- crab: TC10001: 3 step(s) found
|
165
|
+
...
|
166
|
+
|
132
167
|
i18n Support
|
133
168
|
------------
|
134
169
|
|
@@ -136,6 +171,10 @@ i18n Support
|
|
136
171
|
Cucumber are also included:
|
137
172
|
|
138
173
|
$ crab story show US1001 -l ja
|
174
|
+
# language: jp
|
175
|
+
# state: grooming
|
176
|
+
# fetched: 2011-10-04T13:32:35-03:00
|
177
|
+
# revision: 17, by cv@lixo.org
|
139
178
|
機能: [US1001] Arms Rockets Upon Successful Boot
|
140
179
|
...
|
141
180
|
シナリオ: [TC1501] Rocket Silo Is Unlocked
|
@@ -170,44 +209,15 @@ If you have any problems, please let us know.
|
|
170
209
|
[4]: http://gembundler.com
|
171
210
|
[5]: https://github.com/cucumber/aruba
|
172
211
|
|
173
|
-
To do / Roadmap
|
174
|
-
|
175
|
-
|
176
|
-
### 0.2.0
|
212
|
+
To do / Roadmap / Known Bugs
|
213
|
+
----------------------------
|
177
214
|
|
178
|
-
|
179
|
-
- Recursively look for a `.crab` directory like Git does with `.git`
|
180
|
-
- Make logging verbosity level configurable using a global command line option
|
181
|
-
- Move more of the code away from the bin/ dir
|
182
|
-
- More thorough automated testing of commands
|
183
|
-
|
184
|
-
### 0.3.0
|
185
|
-
|
186
|
-
- Do not add "default" tags to scenarios (`@important`, `@medium`, `@manual` and `@acceptance`)
|
187
|
-
- Figure out how to stub or simulate Rally (tests are taking way too long already)
|
188
|
-
- Make better use of Aruba to make sure generated files are OK
|
189
|
-
- Use the Gherkin models and formatters instead of dumb string templates to generate feature files
|
190
|
-
- Add a `push` subcommand which parses a Cucumber feature and adds or updates it (and test cases) in Rally
|
191
|
-
- Add a config command + `.crab/config` file to hold settings like project, etc
|
192
|
-
- A way to work in batches, or offline -- much faster!
|
193
|
-
|
194
|
-
### 0.4.0
|
195
|
-
|
196
|
-
- Error messages are still more cryptic than we'd like
|
197
|
-
- Add a Cucumber Formatter that updates Test Runs in Rally with results from CI
|
198
|
-
- Make it possible to associate defects with Features (essentially treating defects like stories)
|
199
|
-
- Encrypt password in generated `~/.crab/credentials`
|
200
|
-
- Test in Ruby 1.9
|
201
|
-
|
202
|
-
### Before 1.0.0
|
203
|
-
|
204
|
-
- Bash completion scripts
|
205
|
-
- Man pages
|
206
|
-
- Logo
|
207
|
-
- Website
|
215
|
+
Please see the [issues page][6] page.
|
208
216
|
|
209
217
|
Suggestions? Please get in touch!
|
210
218
|
|
219
|
+
[6]: https://github.com/cv/crab/issues
|
220
|
+
|
211
221
|
Authors and Contributors
|
212
222
|
------------------------
|
213
223
|
|
@@ -15,7 +15,6 @@ Feature: Show Story From Rally
|
|
15
15
|
Scenario: Show Story With Test Cases
|
16
16
|
When I run `crab story show US5000`
|
17
17
|
Then the output should contain "Feature: [US5000] Sample Crab Parent Story"
|
18
|
-
And the output should contain "@important @medium @manual @acceptance"
|
19
18
|
And the output should contain "Scenario: [TC10388] Sample Testcase"
|
20
19
|
And the output should contain " Given Rally behaves"
|
21
20
|
And the output should contain " When I look at the test case steps"
|
@@ -19,14 +19,6 @@ Feature: Update Story in Rally
|
|
19
19
|
Then the output should contain "US4988: Sample Crab Story (grooming)"
|
20
20
|
And the story US4988 should be unblocked
|
21
21
|
|
22
|
-
Scenario: Setting Iteration
|
23
|
-
When I run `crab story update US4988 --iteration "Iteration 0"`
|
24
|
-
Then the story US4988 should be in iteration "Iteration 0"
|
25
|
-
|
26
|
-
Scenario: Setting Release
|
27
|
-
When I run `crab story update US4988 --release "Beta release"`
|
28
|
-
Then the story US4988 should be in release "Beta release"
|
29
|
-
|
30
22
|
Scenario: Setting Parent
|
31
23
|
When I run `crab story update US4988 --parent US5000`
|
32
24
|
Then the story US4988 should have US5000 as its parent
|
data/lib/crab.rb
CHANGED
@@ -16,7 +16,7 @@ module Crab
|
|
16
16
|
formatter.feature feature
|
17
17
|
|
18
18
|
if include_testcases
|
19
|
-
Array(story.test_cases).tap {|tcs| logger.info "#{tcs.size} test case(s) found" }.each do |test_case|
|
19
|
+
Array(story.test_cases).tap {|tcs| logger.info "#{story.formatted_id}: #{tcs.size} test case(s) found" }.each do |test_case|
|
20
20
|
formatter.scenario @adapter.scenario_from(test_case)
|
21
21
|
@adapter.steps_from(test_case).each do |step|
|
22
22
|
formatter.step step
|
data/lib/crab/logging.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
module Crab::Logging
|
2
|
+
|
3
|
+
def logger
|
4
|
+
$logger ||= Logger.new(STDERR)
|
5
|
+
$logger.formatter = Logger::Formatter.new
|
6
|
+
$logger.progname = 'crab'
|
7
|
+
# TODO - make this a global command-line or config option:
|
8
|
+
$logger.level = ENV['CRAB_LOG_LEVEL'].present? ? ENV['CRAB_LOG_LEVEL'].to_i : Logger::WARN
|
9
|
+
$logger
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -7,7 +7,12 @@ class Crab::RallyToCucumberAdapter
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def feature_from(story)
|
10
|
-
comments = [
|
10
|
+
comments = [
|
11
|
+
"# language: #{@language.iso_code}",
|
12
|
+
"# state: #{story.state}",
|
13
|
+
"# fetched: #{DateTime.now}",
|
14
|
+
"# revision: #{story.revision}",
|
15
|
+
].map {|c| Gherkin::Formatter::Model::Comment.new(c, 0) }
|
11
16
|
tags = []
|
12
17
|
keyword = @language.keywords('feature').last
|
13
18
|
name = "[#{story.formatted_id}] #{story.name}"
|
@@ -18,7 +23,9 @@ class Crab::RallyToCucumberAdapter
|
|
18
23
|
end
|
19
24
|
|
20
25
|
def scenario_from(test_case)
|
21
|
-
comments = [
|
26
|
+
comments = [
|
27
|
+
"# revision: #{test_case.revision}",
|
28
|
+
].map {|c| Gherkin::Formatter::Model::Comment.new(c, 0) }
|
22
29
|
tags = test_case.tags.map {|tag| Gherkin::Formatter::Model::Tag.new("@#{tag}", 0) }
|
23
30
|
keyword = @language.keywords('scenario').last
|
24
31
|
name = "[#{test_case.formatted_id}] #{test_case.name}"
|
@@ -29,7 +36,7 @@ class Crab::RallyToCucumberAdapter
|
|
29
36
|
end
|
30
37
|
|
31
38
|
def steps_from(test_case)
|
32
|
-
test_case.steps.tap {|steps| logger.info "#{steps.size} step(s) found"}.map do |step|
|
39
|
+
test_case.steps.tap {|steps| logger.info "#{test_case.formatted_id}: #{steps.size} step(s) found"}.map do |step|
|
33
40
|
step_words = step.split(' ')
|
34
41
|
comments = []
|
35
42
|
keyword = step_words.shift
|
data/lib/crab/story.rb
CHANGED
@@ -2,6 +2,8 @@ module Crab
|
|
2
2
|
|
3
3
|
class Story
|
4
4
|
|
5
|
+
include Crab::Utilities
|
6
|
+
|
5
7
|
VALID_STATES = %w{Grooming Defined In-Progress Completed Accepted Released}
|
6
8
|
|
7
9
|
def initialize(rally_story, dry_run)
|
@@ -29,6 +31,11 @@ module Crab
|
|
29
31
|
(@rally_story.schedule_state || "unknown").parameterize.underscore
|
30
32
|
end
|
31
33
|
|
34
|
+
def revision
|
35
|
+
rev = @rally_story.revision_history.revisions.first
|
36
|
+
"#{rev.revision_number}, by #{rev.user}"
|
37
|
+
end
|
38
|
+
|
32
39
|
def description
|
33
40
|
# this could use a lot of rethinking :(
|
34
41
|
# biggest problem is that Cucumber breaks if text in description looks like something
|
@@ -67,12 +74,6 @@ module Crab
|
|
67
74
|
|
68
75
|
private
|
69
76
|
|
70
|
-
# took a while to figure out that we need to remove the CSS from inside embedded <style> tags!
|
71
|
-
# Rally uses some crazy rich text editor that I'd be soooooo happy to disable, somehow. Chrome Extension, perhaps?
|
72
|
-
def sanitize(source)
|
73
|
-
Sanitize.clean source, :remove_contents => %w{style}
|
74
|
-
end
|
75
|
-
|
76
77
|
end
|
77
78
|
|
78
79
|
module DryRun
|
data/lib/crab/testcase.rb
CHANGED
@@ -2,6 +2,8 @@ module Crab
|
|
2
2
|
|
3
3
|
class TestCase
|
4
4
|
|
5
|
+
include Crab::Utilities
|
6
|
+
|
5
7
|
PRIORITIES = %w{useful important critical}
|
6
8
|
RISKS = %w{low medium high}
|
7
9
|
METHODS = %w{automated manual}
|
@@ -21,11 +23,22 @@ module Crab
|
|
21
23
|
end
|
22
24
|
|
23
25
|
def description
|
24
|
-
|
26
|
+
# this could use a lot of rethinking :(
|
27
|
+
# biggest problem is that Cucumber breaks if text in description looks like something
|
28
|
+
# it might know how to parse, but doesn't
|
29
|
+
# our feature descriptions are quite like that, so I was being ultra-conservative
|
30
|
+
sanitize(@rally_test_case.description || '').gsub(/ +/, "\n").gsub(/\n\n/, "\n").gsub(/\n/, "\n ")
|
25
31
|
end
|
26
32
|
|
27
33
|
def tags
|
28
|
-
[priority, risk, test_method, test_type].map
|
34
|
+
[priority, risk, test_method, test_type].map(&:parameterize).reject do |tag|
|
35
|
+
%w{important medium manual acceptance}.include? tag
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def revision
|
40
|
+
rev = @rally_test_case.revision_history.revisions.first
|
41
|
+
"#{rev.revision_number}, by #{rev.user}"
|
29
42
|
end
|
30
43
|
|
31
44
|
def priority
|
data/lib/crab/utilities.rb
CHANGED
@@ -1,13 +1,7 @@
|
|
1
1
|
module Crab
|
2
2
|
module Utilities
|
3
3
|
|
4
|
-
|
5
|
-
$logger ||= Logger.new(STDERR)
|
6
|
-
$logger.formatter = Logger::Formatter.new
|
7
|
-
$logger.progname = 'crab'
|
8
|
-
# TODO - make this a global command-line or config option: $logger.level = Logger::WARN
|
9
|
-
$logger
|
10
|
-
end
|
4
|
+
include Logging
|
11
5
|
|
12
6
|
def credentials_file
|
13
7
|
FileUtils.mkdir_p File.expand_path("~/.crab")
|
@@ -77,5 +71,10 @@ module Crab
|
|
77
71
|
result
|
78
72
|
end
|
79
73
|
|
74
|
+
# took a while to figure out that we need to remove the CSS from inside embedded <style> tags!
|
75
|
+
# Rally uses some crazy rich text editor that I'd be soooooo happy to disable, somehow. Chrome Extension, perhaps?
|
76
|
+
def sanitize(source)
|
77
|
+
Sanitize.clean source, :remove_contents => %w{style}
|
78
|
+
end
|
80
79
|
end
|
81
80
|
end
|
data/lib/crab/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crab
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 1
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 11
|
10
|
+
version: 0.2.11
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Carlos Villela
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-10-
|
18
|
+
date: 2011-10-04 00:00:00 -03:00
|
19
19
|
default_executable: crab
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -354,6 +354,7 @@ files:
|
|
354
354
|
- lib/crab/cucumber_feature.rb
|
355
355
|
- lib/crab/cucumber_scenario.rb
|
356
356
|
- lib/crab/cucumber_to_rally_adapter.rb
|
357
|
+
- lib/crab/logging.rb
|
357
358
|
- lib/crab/rally.rb
|
358
359
|
- lib/crab/rally_to_cucumber_adapter.rb
|
359
360
|
- lib/crab/story.rb
|