cucumber_analytics 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/History.rdoc CHANGED
@@ -1,9 +1,18 @@
1
+ === Version 0.0.8 / 2013-02-24
2
+
3
+ * Bug fix: Replaced some destructive method calls with non-destructive
4
+ equivalents.
5
+ * Bug fix: Fixed some parsing bugs based around whitespace.
6
+ * Subdirectories within a directory are now modeled.
7
+ * Directory collection added
8
+
9
+
1
10
  === Version 0.0.7 / 2013-02-01
2
11
 
3
12
  * Bug fix: Feature collection no longer returns nil values for feature files
4
13
  that do not contain features.
5
14
  * Elements now know the element that contains them.
6
- * Adjusted the default logging level so tht logging does not occur by default.
15
+ * Adjusted the default logging level so that logging does not occur by default.
7
16
 
8
17
 
9
18
  === Version 0.0.6 / 2013-01-07
@@ -0,0 +1,25 @@
1
+ Feature: Directories can be collected from arbitrary parts of the codebase.
2
+
3
+
4
+ Acceptance criteria
5
+
6
+ Directories containing feature files can be collected from:
7
+ 1. directories
8
+
9
+
10
+ Background: Setup test codebase
11
+ Given a directory "feature_directory"
12
+ And a directory "feature_directory/nested_directory_1"
13
+ And a directory "feature_directory/nested_directory_1/nested_directory_2"
14
+ When the directory "feature_directory" is read
15
+ And the directory "feature_directory/nested_directory_1" is read
16
+ And the directory "feature_directory/nested_directory_1/nested_directory_2" is read
17
+
18
+
19
+ Scenario: Directories can be collected from directories
20
+ Then the directories collected from directory "1" are as follows:
21
+ | nested_directory_1 |
22
+ | nested_directory_2 |
23
+ And the directories collected from directory "2" are as follows:
24
+ | nested_directory_2 |
25
+ And there are no directories collected from directory "3"
@@ -14,7 +14,7 @@ Feature: Background elements can be modeled.
14
14
  Feature: The test feature name.
15
15
  Some more feature description.
16
16
 
17
- Background: Some general test setup stuff.
17
+ Background:Some general test setup stuff.
18
18
  My big hunk of perfectly valid description:
19
19
  |
20
20
 
@@ -7,6 +7,7 @@ Feature: Directories can be modeled.
7
7
  1. the directory's name
8
8
  2. the directory's full path
9
9
  3. all feature files contained
10
+ 4. all directories contained
10
11
 
11
12
 
12
13
  Background: Setup test directories
@@ -68,23 +69,40 @@ Feature: Directories can be modeled.
68
69
  When the directory "feature_directory" is read
69
70
  And the directory "feature_directory/nested_directory" is read
70
71
 
72
+ Scenario: The directory's name is modeled.
73
+ Then directory "1" is found to have the following properties:
74
+ | name | feature_directory |
75
+ And directory "2" is found to have the following properties:
76
+ | name | nested_directory |
77
+
78
+ Scenario: The directory's full path is modeled.
79
+ Then directory "1" is found to have the following properties:
80
+ | path | path_to/feature_directory |
81
+ And directory "2" is found to have the following properties:
82
+ | path | path_to/feature_directory/nested_directory |
83
+
71
84
  Scenario: The directory's feature files are modeled.
72
85
  Then directory "1" is found to have the following properties:
73
- | name | feature_directory |
74
- | path | path_to/feature_directory |
75
- | feature_file_count | 3 |
86
+ | feature_file_count | 3 |
76
87
  And directory "1" feature files are as follows:
77
88
  | test_file_1.feature |
78
89
  | test_file_2.feature |
79
90
  | test_file_3.feature |
80
91
  Then directory "2" is found to have the following properties:
81
- | name | nested_directory |
82
- | path | path_to/feature_directory/nested_directory |
83
- | feature_file_count | 2 |
92
+ | feature_file_count | 2 |
84
93
  And directory "2" feature files are as follows:
85
94
  | test_file_4.feature |
86
95
  | test_file_5.feature |
87
96
 
97
+ Scenario: The directory's directories are modeled.
98
+ Then directory "1" is found to have the following properties:
99
+ | directory_count | 1 |
100
+ And directory "1" directories are as follows:
101
+ | nested_directory |
102
+ Then directory "2" is found to have the following properties:
103
+ | directory_count | 0 |
104
+ And directory "2" has no directories
105
+
88
106
  Scenario Outline: Directory models pass all other specifications
89
107
  Exact specifications detailing the API for directory models.
90
108
  Given that there are "<additional specifications>" detailing models
@@ -25,15 +25,15 @@ Feature: Example elements can be modeled.
25
25
  | <param2> |
26
26
  Then I don't really need another step
27
27
 
28
- Examples: text describing the significance of the examples
28
+ Examples:text describing the significance of the examples
29
29
  Anything besides the | that starts a row should be valid
30
30
  description at this point in the test. YMMV
31
- | param1 | param2 | extra param |
31
+ |param1| param2 | extra param |
32
32
  #A more random comment
33
- | x | y | ? |
34
- | 1 | 2 | 3 |
33
+ |x | y | ? |
34
+ |1 | 2 | 3 |
35
35
  @example_tag @another_one
36
- Examples: some examples with different significance and a tag
36
+ Examples:some examples with different significance and a tag
37
37
 
38
38
  Words, words, words, words,
39
39
 
@@ -21,7 +21,7 @@ Feature: Features can be modeled.
21
21
  #Or any line that is a comment, really.
22
22
  @a_feature_level_tag @and_another@and_another
23
23
 
24
- Feature: The test feature name.
24
+ Feature:The test feature name.
25
25
  Some more feature description.
26
26
 
27
27
  And some more.
@@ -44,7 +44,7 @@ Feature: Features can be modeled.
44
44
  # freeform text for some reason.
45
45
 
46
46
 
47
- Background: Some general test setup stuff.
47
+ Background:Some general test setup stuff.
48
48
  A little more information.
49
49
  * some setup step
50
50
 
@@ -20,7 +20,7 @@ Feature: Scenario Outline elements can be modeled.
20
20
  Some more feature description.
21
21
 
22
22
  @outline_tag
23
- Scenario Outline: The scenario outline's name.
23
+ Scenario Outline:The scenario outline's name.
24
24
  My big hunk of perfectly valid description:
25
25
  |
26
26
 
@@ -62,7 +62,7 @@ Feature: Scenario Outline elements can be modeled.
62
62
  \"\"\"
63
63
  Then *lots* *of* *parameters*
64
64
 
65
- Examples: text describing the significance of the examples
65
+ Examples:text describing the significance of the examples
66
66
  Anything besides the | that starts a row should be valid
67
67
  description at this point in the test. YMMV
68
68
  | param1 | param2 |
@@ -21,7 +21,7 @@ Feature: Scenario elements can be modeled.
21
21
  @a_tag
22
22
 
23
23
  @another_tag@yet_another_tag
24
- Scenario: The first scenario's name.
24
+ Scenario:The first scenario's name.
25
25
  My big hunk of perfectly valid description:
26
26
  |
27
27
 
@@ -18,3 +18,21 @@ When /^(?:the )?directory(?: "([^"]*)")? feature files are as follows:$/ do |dir
18
18
 
19
19
  assert actual_files.flatten.sort == files.raw.flatten.sort
20
20
  end
21
+
22
+ When /^(?:the )?directory(?: "([^"]*)")? directories are as follows:$/ do |directory, directories|
23
+ directory ||= 1
24
+
25
+ expected = directories.raw.flatten.sort
26
+ actual = @parsed_directories[directory - 1].feature_directories.collect { |sub_directory| sub_directory.name }
27
+
28
+ assert(actual == expected, "Expected: #{expected}\n but was: #{actual}")
29
+ end
30
+
31
+ When /^(?:the )?directory(?: "([^"]*)")? has no directories$/ do |directory|
32
+ directory ||= 1
33
+
34
+ expected = []
35
+ actual = @parsed_directories[directory - 1].feature_directories
36
+
37
+ assert(actual == expected, "Expected: #{expected}\n but was: #{actual}")
38
+ end
@@ -11,9 +11,10 @@ Then /^(?:the )?feature(?: "([^"]*)")? is found to have the following properties
11
11
  end
12
12
 
13
13
  Then /^the descriptive lines of feature "([^"]*)" are as follows:$/ do |file, lines|
14
- expected_description = lines.raw.flatten
14
+ expected = lines.raw.flatten
15
+ actual = @parsed_files[file - 1].feature.description
15
16
 
16
- assert @parsed_files[file - 1].feature.description == expected_description
17
+ assert(actual == expected, "Expected: #{expected}\n but was: #{actual}")
17
18
  end
18
19
 
19
20
  Then /^feature "([^"]*)" is found to have the following tags:$/ do |file, tags|
@@ -49,7 +49,10 @@ Then /^(?:the )?(?:feature "([^"]*)" )?test(?: "([^"]*)")? is found to have the
49
49
  file ||= 1
50
50
  test ||= 1
51
51
 
52
- assert @parsed_files[file - 1].feature.tests[test - 1].tags == tags.raw.flatten
52
+ expected = tags.raw.flatten
53
+ actual = @parsed_files[file - 1].feature.tests[test - 1].tags
54
+
55
+ assert(actual == expected, "Expected: #{expected}\n but was: #{actual}")
53
56
  end
54
57
 
55
58
  Then /^(?:the )?(?:feature "([^"]*)" )?test(?: "([^"]*)")? is found to have the following applied tags:$/ do |file, test, tags|
@@ -157,3 +157,20 @@ Then /^the files collected from directory "([^"]*)" are as follows:$/ do |direct
157
157
 
158
158
  assert actual_files.flatten.sort == files.raw.flatten.sort
159
159
  end
160
+
161
+ Then /^the directories collected from directory "([^"]*)" are as follows:$/ do |directory, directories|
162
+ directory ||= 1
163
+
164
+ expected = directories.raw.flatten.sort
165
+ actual = CucumberAnalytics::World.directories_in(@parsed_directories[directory - 1]).collect { |sub_directory| sub_directory.name }
166
+
167
+ assert(actual == expected, "Expected: #{expected}\n but was: #{actual}")
168
+ end
169
+
170
+ Then /^there are no directories collected from directory "([^"]*)"$/ do |directory|
171
+ directory ||= 1
172
+
173
+ actual_directories = CucumberAnalytics::World.directories_in(@parsed_directories[directory - 1])
174
+
175
+ assert actual_directories.flatten == []
176
+ end
@@ -56,7 +56,7 @@ module CucumberAnalytics
56
56
 
57
57
  # Returns all tags which are applicable to the scenario.
58
58
  def all_tags
59
- applied_tags.concat(@tags)
59
+ applied_tags + @tags
60
60
  end
61
61
 
62
62
  private
@@ -30,6 +30,11 @@ module CucumberAnalytics
30
30
  @directory
31
31
  end
32
32
 
33
+ # Returns the number of sub-directories contained in the directory.
34
+ def directory_count
35
+ @feature_directories.count
36
+ end
37
+
33
38
  # Returns the number of features files contained in the directory.
34
39
  def feature_file_count
35
40
  @feature_files.count
@@ -85,7 +85,7 @@ module CucumberAnalytics
85
85
 
86
86
  source_lines.delete_if { |line| World.ignored_line?(line) }
87
87
 
88
- until source_lines.first =~ /^\s*(?:(?:Scenario: )|(?:Scenario Outline: )|(?:Background: )|(?:@ ))/ or
88
+ until source_lines.first =~ /#{World::TEST_ELEMENT_START_PATTERN}/ or
89
89
  source_lines.empty?
90
90
 
91
91
  @description << source_lines.first.strip
@@ -52,7 +52,7 @@ module CucumberAnalytics
52
52
  File.open(@file, 'r') { |file| file_lines = file.readlines }
53
53
 
54
54
  # collect feature tag lines
55
- until file_lines.first =~ /^s*Feature:/ or
55
+ until file_lines.first =~ /^\s*Feature:/ or
56
56
  file_lines.empty?
57
57
 
58
58
  feature_lines << file_lines.first
@@ -60,7 +60,7 @@ module CucumberAnalytics
60
60
  end
61
61
 
62
62
  # collect everything else until the end of the feature section
63
- until file_lines.first =~ /^\s*(?:@|Background:|Scenario:|(?:Scenario Outline:))/ or
63
+ until file_lines.first =~ /#{World::TEST_ELEMENT_START_PATTERN}/ or
64
64
  file_lines.empty?
65
65
 
66
66
  feature_lines << file_lines.first
@@ -30,7 +30,7 @@ module CucumberAnalytics
30
30
 
31
31
  # Returns all tags which are applicable to the scenario.
32
32
  def all_tags
33
- applied_tags.concat(@tags)
33
+ applied_tags + @tags
34
34
  end
35
35
 
36
36
 
@@ -37,7 +37,7 @@ module CucumberAnalytics
37
37
 
38
38
  # Returns all tags which are applicable to the scenario.
39
39
  def all_tags
40
- applied_tags.concat(@tags)
40
+ applied_tags + @tags
41
41
  end
42
42
 
43
43
 
@@ -1,3 +1,3 @@
1
1
  module CucumberAnalytics
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -4,6 +4,7 @@ module CucumberAnalytics
4
4
 
5
5
  SANITARY_STRING = '___!!!___'
6
6
  STEP_KEYWORD_PATTERN = '\s*(?:Given|When|Then|And|But|\*)\s*'
7
+ TEST_ELEMENT_START_PATTERN = '\s*(?:@|Background:|Scenario:|(?:Scenario Outline:))'
7
8
 
8
9
 
9
10
  # Returns the left delimiter, which is used to mark the beginning of a step
@@ -56,6 +57,13 @@ module CucumberAnalytics
56
57
  end
57
58
  end
58
59
 
60
+ # Returns all directories found in the passed container.
61
+ def self.directories_in(container)
62
+ Array.new.tap do |accumulated_directories|
63
+ collect_directories(accumulated_directories, container)
64
+ end
65
+ end
66
+
59
67
  # Returns all feature files found in the passed container.
60
68
  def self.files_in(container)
61
69
  Array.new.tap do |accumulated_files|
@@ -134,6 +142,17 @@ module CucumberAnalytics
134
142
  end
135
143
  end
136
144
 
145
+ # Recursively gathers all directories found in the passed container.
146
+ def self.collect_directories(accumulated_directories, container)
147
+ accumulated_directories.concat container.feature_directories if container.respond_to?(:feature_directories)
148
+
149
+ if container.respond_to?(:contains)
150
+ container.contains.each do |child_container|
151
+ collect_directories(accumulated_directories, child_container)
152
+ end
153
+ end
154
+ end
155
+
137
156
  # Recursively gathers all feature files found in the passed container.
138
157
  def self.collect_files(accumulated_files, container)
139
158
  accumulated_files.concat container.feature_files if container.respond_to?(:feature_files)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cucumber_analytics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-03 00:00:00.000000000 Z
12
+ date: 2013-02-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -90,6 +90,7 @@ files:
90
90
  - README.rdoc
91
91
  - Rakefile
92
92
  - cucumber_analytics.gemspec
93
+ - features/analysis/directory_collection.feature
93
94
  - features/analysis/feature_collection.feature
94
95
  - features/analysis/feature_file_collection.feature
95
96
  - features/analysis/step_collection.feature
@@ -164,6 +165,7 @@ specification_version: 3
164
165
  summary: This gem provides an API to programmatically break down Cucumber feature
165
166
  files so that they can be inspected and analyzed in a straightforward manner.
166
167
  test_files:
168
+ - features/analysis/directory_collection.feature
167
169
  - features/analysis/feature_collection.feature
168
170
  - features/analysis/feature_file_collection.feature
169
171
  - features/analysis/step_collection.feature