mortadella 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +7 -0
- data/.ruby-version +1 -1
- data/Gemfile.lock +27 -25
- data/README.md +49 -2
- data/features/horizontal_tables/basic_usage.feature +19 -0
- data/features/{drying_up_fields.feature → horizontal_tables/drying_up_fields.feature} +2 -2
- data/features/{emptiness.feature → horizontal_tables/emptiness.feature} +2 -2
- data/features/step_definitions/steps.rb +1 -2
- data/features/support/env.rb +2 -1
- data/features/vertical_tables/basic_usage.feature +18 -0
- data/lib/mortadella/horizontal.rb +54 -0
- data/lib/mortadella/vertical.rb +26 -0
- data/mortadella.gemspec +1 -1
- metadata +10 -11
- data/features/basic_usage.feature +0 -19
- data/lib/mortadella.rb +0 -48
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dcb0135d2cd6149ea0a5e5f0a27eae2050372ec3
|
4
|
+
data.tar.gz: c03efef5ceb407af06e1f4919f832add627348d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7b5aa25740a8721fa811fb717d9958c8e2bd40b9dc3123adcdc9fdcb928d7739bb48f13af20d6baa9425e85c0531af16662abc9d3b3f3f9fe206d61f1036e5d
|
7
|
+
data.tar.gz: d7111ad812fb2f701ebe03d580ee4f1e77ebfdf52a70ad72c48ee50c86f73800c15daa65a98aa2b12c2dcb83da64a04090d6177479e9470d6c93f420b90f4b59
|
data/.rubocop.yml
CHANGED
@@ -9,6 +9,13 @@ Metrics/LineLength:
|
|
9
9
|
Style/EmptyLines:
|
10
10
|
Enabled: false
|
11
11
|
|
12
|
+
Style/EmptyLinesAroundClassBody:
|
13
|
+
EnforcedStyle: empty_lines
|
14
|
+
|
15
|
+
Style/EmptyLinesAroundModuleBody:
|
16
|
+
EnforcedStyle: empty_lines
|
17
|
+
|
18
|
+
|
12
19
|
|
13
20
|
Style/MethodDefParentheses:
|
14
21
|
EnforcedStyle: require_no_parentheses
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.2.
|
1
|
+
2.2.3
|
data/Gemfile.lock
CHANGED
@@ -1,48 +1,47 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
mortadella (0.0
|
4
|
+
mortadella (0.2.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
-
ast (2.
|
10
|
-
astrolabe (1.3.
|
11
|
-
parser (
|
9
|
+
ast (2.1.0)
|
10
|
+
astrolabe (1.3.1)
|
11
|
+
parser (~> 2.2)
|
12
12
|
builder (3.2.2)
|
13
|
-
cucumber (2.
|
13
|
+
cucumber (2.1.0)
|
14
14
|
builder (>= 2.1.2)
|
15
|
-
cucumber-core (~> 1.
|
15
|
+
cucumber-core (~> 1.3.0)
|
16
16
|
diff-lcs (>= 1.1.3)
|
17
|
-
|
17
|
+
gherkin3 (~> 3.1.0)
|
18
18
|
multi_json (>= 1.7.5, < 2.0)
|
19
19
|
multi_test (>= 0.1.2)
|
20
|
-
cucumber-core (1.
|
21
|
-
|
20
|
+
cucumber-core (1.3.0)
|
21
|
+
gherkin3 (~> 3.1.0)
|
22
22
|
diff-lcs (1.2.5)
|
23
|
-
|
24
|
-
|
25
|
-
multi_json (1.11.1)
|
23
|
+
gherkin3 (3.1.2)
|
24
|
+
multi_json (1.11.2)
|
26
25
|
multi_test (0.1.2)
|
27
|
-
parser (2.2.
|
26
|
+
parser (2.2.3.0)
|
28
27
|
ast (>= 1.1, < 3.0)
|
29
28
|
powerpack (0.1.1)
|
30
29
|
rainbow (2.0.0)
|
31
30
|
rake (10.4.2)
|
32
|
-
rspec (3.
|
33
|
-
rspec-core (~> 3.
|
34
|
-
rspec-expectations (~> 3.
|
35
|
-
rspec-mocks (~> 3.
|
36
|
-
rspec-core (3.2
|
37
|
-
rspec-support (~> 3.
|
38
|
-
rspec-expectations (3.
|
31
|
+
rspec (3.3.0)
|
32
|
+
rspec-core (~> 3.3.0)
|
33
|
+
rspec-expectations (~> 3.3.0)
|
34
|
+
rspec-mocks (~> 3.3.0)
|
35
|
+
rspec-core (3.3.2)
|
36
|
+
rspec-support (~> 3.3.0)
|
37
|
+
rspec-expectations (3.3.1)
|
39
38
|
diff-lcs (>= 1.2.0, < 2.0)
|
40
|
-
rspec-support (~> 3.
|
41
|
-
rspec-mocks (3.2
|
39
|
+
rspec-support (~> 3.3.0)
|
40
|
+
rspec-mocks (3.3.2)
|
42
41
|
diff-lcs (>= 1.2.0, < 2.0)
|
43
|
-
rspec-support (~> 3.
|
44
|
-
rspec-support (3.
|
45
|
-
rubocop (0.
|
42
|
+
rspec-support (~> 3.3.0)
|
43
|
+
rspec-support (3.3.0)
|
44
|
+
rubocop (0.34.2)
|
46
45
|
astrolabe (~> 1.3)
|
47
46
|
parser (>= 2.2.2.5, < 3.0)
|
48
47
|
powerpack (~> 0.1)
|
@@ -60,3 +59,6 @@ DEPENDENCIES
|
|
60
59
|
rake
|
61
60
|
rspec
|
62
61
|
rubocop
|
62
|
+
|
63
|
+
BUNDLED WITH
|
64
|
+
1.10.6
|
data/README.md
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
# Delicious Mock Ruby Tables
|
2
2
|
|
3
3
|
[](https://circleci.com/gh/Originate/mortadella)
|
4
|
+
[](https://gemnasium.com/Originate/mortadella)
|
4
5
|
[](LICENSE.txt)
|
5
6
|
|
7
|
+
|
6
8
|
Mortadella makes it easy to programmatically build data tables
|
7
9
|
that can be compared to Cucumber tables
|
8
10
|
through `cucumber_table.diff! mortadella_table`.
|
@@ -23,6 +25,11 @@ _Oh no, our algorithm selected too many apples!_
|
|
23
25
|
|
24
26
|
## Usage
|
25
27
|
|
28
|
+
Mortadella supports horizontal and vertical Cucumber tables.
|
29
|
+
|
30
|
+
|
31
|
+
### Horizontal Tables
|
32
|
+
|
26
33
|
* In your cucumber spec, define the expected data in table form
|
27
34
|
|
28
35
|
```cucumber
|
@@ -30,6 +37,7 @@ _Oh no, our algorithm selected too many apples!_
|
|
30
37
|
| INGREDIENT | AMOUNT |
|
31
38
|
| flour | 12 oz |
|
32
39
|
| butter | 2 oz |
|
40
|
+
| apples | 3 pc |
|
33
41
|
```
|
34
42
|
|
35
43
|
* in the step definition for this, build an equivalent Mortadella table with the actual data,
|
@@ -37,11 +45,50 @@ _Oh no, our algorithm selected too many apples!_
|
|
37
45
|
|
38
46
|
```ruby
|
39
47
|
Then /^I have these ingredients$/ do |expected_ingredients|
|
40
|
-
actual_ingredients = Mortadella.new headers: ['INGREDIENT', 'AMOUNT']
|
48
|
+
actual_ingredients = Mortadella::Horizontal.new headers: ['INGREDIENT', 'AMOUNT']
|
41
49
|
actual_ingredients << ['flour', '12 oz'] # This data should come from your app
|
42
50
|
actual_ingredients << ['butter', '2 oz'] # This data should come from your app
|
51
|
+
actual_ingredients << ['apples', '3 pc'] # This data should come from your app
|
43
52
|
expected_ingredients.diff! actual_ingredients.table
|
44
53
|
end
|
45
54
|
```
|
46
55
|
|
47
|
-
* you can also
|
56
|
+
* you can also
|
57
|
+
[dry up repetitive fields](https://github.com/Originate/mortadella/blob/master/features/horizontal_tables/drying_up_fields.feature)
|
58
|
+
for better readability
|
59
|
+
|
60
|
+
|
61
|
+
### Vertical Tables
|
62
|
+
|
63
|
+
* In your cucumber spec, define the expected data in table form
|
64
|
+
|
65
|
+
```cucumber
|
66
|
+
Then my pie conforms to these specs:
|
67
|
+
| WEIGHT | 2 lbs |
|
68
|
+
| PORTIONS | 8 |
|
69
|
+
| CALORIES | 500 |
|
70
|
+
```
|
71
|
+
|
72
|
+
* in the step definition for this, build an equivalent Mortadella table with the actual data,
|
73
|
+
and diff the Cucumber table with the expected data against it.
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
Then /^My pie has these metrics:$/ do |expected_metrics|
|
77
|
+
actual_metrics = Mortadella::Vertical.new
|
78
|
+
actual_metrics['WEIGHT'] = '2 lbs' # This data should come from your app
|
79
|
+
actual_metrics['PORTIONS'] = 8 # This data should come from your app
|
80
|
+
actual_metrics['CALORIES'] = 500 # This data should come from your app
|
81
|
+
expected_metrics.diff! actual_metrics.table
|
82
|
+
end
|
83
|
+
```
|
84
|
+
|
85
|
+
|
86
|
+
## Development
|
87
|
+
|
88
|
+
* set up local environment: `bundle install`
|
89
|
+
* run all tests: `bundle exec rake`
|
90
|
+
* run linter only: `rake lint`
|
91
|
+
* run tests only: `rake features`
|
92
|
+
* publish a new gem:
|
93
|
+
* update the version in [mortadella.gemspec](mortadella.gemspec)
|
94
|
+
* `rake release`
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Feature: Creating mock data tables
|
2
|
+
|
3
|
+
As a Cucumber user
|
4
|
+
I want to programmatically create horizontal mock data tables from application data
|
5
|
+
So that I can use Cucumber's built-in table diffing to verify my application data ergonomically.
|
6
|
+
|
7
|
+
|
8
|
+
Scenario: Creating a simple data table
|
9
|
+
Given I create a horizontal Mortadella instance: "m = Mortadella::Horizontal.new headers: ['DAY', 'ACTIVITY']"
|
10
|
+
And I add a data row: "m << ['Monday', 'mowing']"
|
11
|
+
And I add another data row: "m << ['Tuesday', 'tutoring']"
|
12
|
+
And I add another data row: "m << ['Wednesday', 'welcoming']"
|
13
|
+
When I request the instance data table "m.table"
|
14
|
+
Then Mortadella returns an object that matches this Cucumber table
|
15
|
+
| DAY | ACTIVITY |
|
16
|
+
| Monday | mowing |
|
17
|
+
| Tuesday | tutoring |
|
18
|
+
| Wednesday | welcoming |
|
19
|
+
|
@@ -6,7 +6,7 @@ Feature: Drying up repetitive fields
|
|
6
6
|
|
7
7
|
|
8
8
|
Scenario: drying up repetitive columns
|
9
|
-
Given I have a Mortadella instance with a DRY column: "m = Mortadella.new headers: ['DAY', 'ACTIVITY'], dry: ['DAY']"
|
9
|
+
Given I have a Mortadella instance with a DRY column: "m = Mortadella::Horizontal.new headers: ['DAY', 'ACTIVITY'], dry: ['DAY']"
|
10
10
|
|
11
11
|
And I add an activity for Monday: "m << ['Monday', 'mowing']"
|
12
12
|
And I add another activity for Monday: "m << ['Monday', 'musing']"
|
@@ -17,7 +17,7 @@ Feature: Drying up repetitive fields
|
|
17
17
|
And I add another activity for Tuesday: "m << ['Tuesday', 'throwing']"
|
18
18
|
|
19
19
|
When I request the instance data table "m.table"
|
20
|
-
Then
|
20
|
+
Then Mortadella returns a table with repeated day names cleared out for better readability
|
21
21
|
| DAY | ACTIVITY |
|
22
22
|
| Monday | mowing |
|
23
23
|
| | musing |
|
@@ -6,13 +6,13 @@ Feature: Verifying emptiness
|
|
6
6
|
|
7
7
|
|
8
8
|
Scenario: an empty table
|
9
|
-
Given I have a Mortadella instance: "m = Mortadella.new headers: ['foo']"
|
9
|
+
Given I have a Mortadella instance: "m = Mortadella::Horizontal.new headers: ['foo']"
|
10
10
|
When I ask it whether it is empty: "m.empty?"
|
11
11
|
Then it responds with true
|
12
12
|
|
13
13
|
|
14
14
|
Scenario: a non-empty table
|
15
|
-
Given I have a Mortadella instance: "m = Mortadella.new headers: ['foo']"
|
15
|
+
Given I have a Mortadella instance: "m = Mortadella::Horizontal.new headers: ['foo']"
|
16
16
|
And I add a data row: "m << ['bar']"
|
17
17
|
When I ask it whether it is empty: "m.empty?"
|
18
18
|
Then it responds with false
|
data/features/support/env.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
Feature: Creating vertical mock data tables
|
2
|
+
|
3
|
+
As a Cucumber user
|
4
|
+
I want to programmatically create vertical mock data tables from application data
|
5
|
+
So that I can use Cucumber's built-in table diffing to verify my application data ergonomically.
|
6
|
+
|
7
|
+
|
8
|
+
Scenario: Creating a simple data table
|
9
|
+
Given I create a vertical Mortadella instance: "m = Mortadella::Vertical.new"
|
10
|
+
And I add a data row: "m['NAME'] = 'Mortadella'"
|
11
|
+
And I add another data row: "m['TYPE'] = 'Ruby Gem'"
|
12
|
+
And I add another data row: "m['AUTHOR'] = 'Kevin Goslar'"
|
13
|
+
When I request the instance data table "m.table"
|
14
|
+
Then Mortadella returns an object that matches this Cucumber table
|
15
|
+
| NAME | Mortadella |
|
16
|
+
| TYPE | Ruby Gem |
|
17
|
+
| AUTHOR | Kevin Goslar |
|
18
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Mortadella
|
2
|
+
|
3
|
+
# Makes it easy to build DRY horizontal Cucumber-compatible tables
|
4
|
+
class Horizontal
|
5
|
+
|
6
|
+
attr_reader :table
|
7
|
+
|
8
|
+
|
9
|
+
def initialize headers:, dry: []
|
10
|
+
@headers = headers
|
11
|
+
|
12
|
+
@dry = dry
|
13
|
+
|
14
|
+
# The resulting Cucumber-compatible table structure
|
15
|
+
@table = [headers]
|
16
|
+
|
17
|
+
# The previously added row
|
18
|
+
@previous_row = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
# Adds the given row to the table
|
23
|
+
def << row
|
24
|
+
@table << dry_up(row)
|
25
|
+
@previous_row = row
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# Returns a dried up version of the given row
|
30
|
+
# based on the row that came before in the table
|
31
|
+
#
|
32
|
+
# In a dried up row, any values that match the previous row are removed,
|
33
|
+
# stopping on the first difference
|
34
|
+
def dry_up row
|
35
|
+
return row unless @previous_row
|
36
|
+
result = row.clone
|
37
|
+
@previous_row.each_with_index do |previous_value, i|
|
38
|
+
if @dry.include?(@headers[i]) && row[i] == previous_value
|
39
|
+
result[i] = ''
|
40
|
+
else
|
41
|
+
break
|
42
|
+
end
|
43
|
+
end
|
44
|
+
result
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
def empty?
|
49
|
+
@table.size == 1
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Mortadella
|
2
|
+
|
3
|
+
# Makes it easy to build DRY horizontal Cucumber-compatible tables
|
4
|
+
class Vertical
|
5
|
+
|
6
|
+
attr_reader :table
|
7
|
+
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@table = []
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
# Adds the given row to the table
|
15
|
+
def []= header, row
|
16
|
+
@table << [header, row]
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def empty?
|
21
|
+
@table.size == 1
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/mortadella.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = 'mortadella'
|
7
|
-
s.version = '0.
|
7
|
+
s.version = '0.2.0'
|
8
8
|
s.authors = ['Kevin Goslar']
|
9
9
|
s.email = ['kevin.goslar@gmail.com']
|
10
10
|
s.summary = %s(Mock Ruby Table Delivery)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mortadella
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Goslar
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -96,12 +96,14 @@ files:
|
|
96
96
|
- README.md
|
97
97
|
- Rakefile
|
98
98
|
- circle.yml
|
99
|
-
- features/basic_usage.feature
|
100
|
-
- features/drying_up_fields.feature
|
101
|
-
- features/emptiness.feature
|
99
|
+
- features/horizontal_tables/basic_usage.feature
|
100
|
+
- features/horizontal_tables/drying_up_fields.feature
|
101
|
+
- features/horizontal_tables/emptiness.feature
|
102
102
|
- features/step_definitions/steps.rb
|
103
103
|
- features/support/env.rb
|
104
|
-
-
|
104
|
+
- features/vertical_tables/basic_usage.feature
|
105
|
+
- lib/mortadella/horizontal.rb
|
106
|
+
- lib/mortadella/vertical.rb
|
105
107
|
- mortadella.gemspec
|
106
108
|
homepage: https://github.com/Originate/mortadella
|
107
109
|
licenses:
|
@@ -123,11 +125,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
125
|
version: '0'
|
124
126
|
requirements: []
|
125
127
|
rubyforge_project:
|
126
|
-
rubygems_version: 2.4.5
|
128
|
+
rubygems_version: 2.4.5.1
|
127
129
|
signing_key:
|
128
130
|
specification_version: 4
|
129
131
|
summary: Mock Ruby Table Delivery
|
130
|
-
test_files:
|
131
|
-
- features/basic_usage.feature
|
132
|
-
- features/drying_up_fields.feature
|
133
|
-
- features/emptiness.feature
|
132
|
+
test_files: []
|
@@ -1,19 +0,0 @@
|
|
1
|
-
Feature: Creating mock data tables
|
2
|
-
|
3
|
-
As a Cucumber user
|
4
|
-
I want to programmatically create mock data tables from application data
|
5
|
-
So that I can use Cucumber's built-in table diffing functionality to verify my application behavior ergonomically.
|
6
|
-
|
7
|
-
|
8
|
-
Scenario: Creating a simple data table
|
9
|
-
Given I create a Mortadella instance: "m = Mortadella.new headers: ['DAY', 'ACTIVITY']"
|
10
|
-
And I add a data row: "m << ['Monday', 'mowing']"
|
11
|
-
And I add another data row: "m << ['Tuesday', 'tutoring']"
|
12
|
-
And I add another data row: "m << ['Wednesday', 'welcoming']"
|
13
|
-
When I request the instance data table "m.table"
|
14
|
-
Then I receive an object that matches this Cucumber table
|
15
|
-
| DAY | ACTIVITY |
|
16
|
-
| Monday | mowing |
|
17
|
-
| Tuesday | tutoring |
|
18
|
-
| Wednesday | welcoming |
|
19
|
-
|
data/lib/mortadella.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
# Makes it easy to build DRY Cucumber-compatible tables
|
2
|
-
class Mortadella
|
3
|
-
attr_reader :table
|
4
|
-
|
5
|
-
|
6
|
-
def initialize headers:, dry: []
|
7
|
-
@headers = headers
|
8
|
-
|
9
|
-
@dry = dry
|
10
|
-
|
11
|
-
# The resulting Cucumber-compatible table structure
|
12
|
-
@table = [headers]
|
13
|
-
|
14
|
-
# The previously added row
|
15
|
-
@previous_row = nil
|
16
|
-
end
|
17
|
-
|
18
|
-
|
19
|
-
# Adds the given row to the table
|
20
|
-
def << row
|
21
|
-
@table << dry_up(row)
|
22
|
-
@previous_row = row
|
23
|
-
end
|
24
|
-
|
25
|
-
|
26
|
-
# Returns a dried up version of the given row
|
27
|
-
# based on the row that came before in the table
|
28
|
-
#
|
29
|
-
# In a dried up row, any values that match the previous row are removed,
|
30
|
-
# stopping on the first difference
|
31
|
-
def dry_up row
|
32
|
-
return row unless @previous_row
|
33
|
-
result = row.clone
|
34
|
-
@previous_row.each_with_index do |previous_value, i|
|
35
|
-
if @dry.include?(@headers[i]) && row[i] == previous_value
|
36
|
-
result[i] = ''
|
37
|
-
else
|
38
|
-
break
|
39
|
-
end
|
40
|
-
end
|
41
|
-
result
|
42
|
-
end
|
43
|
-
|
44
|
-
|
45
|
-
def empty?
|
46
|
-
@table.size == 1
|
47
|
-
end
|
48
|
-
end
|