mountain_berry_fields 1.0.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 +19 -0
- data/.simplecov +12 -0
- data/Gemfile +2 -0
- data/LICENSE +22 -0
- data/Rakefile +30 -0
- data/Readme.md +184 -0
- data/Readme.md.mountain_berry_fields +197 -0
- data/bin/mountain_berry_fields +9 -0
- data/features/context_block.feature +73 -0
- data/features/cwd_is_dir_of_mbf_file.feature +16 -0
- data/features/rake_task.feature +46 -0
- data/features/setup_block.feature +36 -0
- data/features/step_definitions/steps.rb +46 -0
- data/features/support/env.rb +76 -0
- data/lib/mountain_berry_fields.rb +89 -0
- data/lib/mountain_berry_fields/command_line_interaction.rb +13 -0
- data/lib/mountain_berry_fields/evaluator.rb +90 -0
- data/lib/mountain_berry_fields/parser.rb +101 -0
- data/lib/mountain_berry_fields/rake_task.rb +12 -0
- data/lib/mountain_berry_fields/test.rb +88 -0
- data/lib/mountain_berry_fields/test/always_fail.rb +21 -0
- data/lib/mountain_berry_fields/test/always_pass.rb +19 -0
- data/lib/mountain_berry_fields/version.rb +3 -0
- data/mountain_berry_fields.gemspec +29 -0
- data/readme_helper.rb +205 -0
- data/spec/command_line_interaction_spec.rb +16 -0
- data/spec/evaluator_spec.rb +170 -0
- data/spec/mock_substitutability_spec.rb +25 -0
- data/spec/mountain_berry_fields_spec.rb +147 -0
- data/spec/parser_spec.rb +139 -0
- data/spec/ruby_syntax_checker_spec.rb +27 -0
- data/spec/spec_helper.rb +104 -0
- data/spec/test/always_fail_spec.rb +25 -0
- data/spec/test/always_pass_spec.rb +15 -0
- data/spec/test/strategy_spec.rb +48 -0
- data/spec/test/test_spec.rb +22 -0
- metadata +209 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MountainBerryFields::Test::RubySyntaxChecker do
|
4
|
+
it 'implements the SyntaxChecker interface' do
|
5
|
+
Mock::SyntaxChecker.should substitute_for described_class
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '#valid?' do
|
9
|
+
it 'returns false for invalid syntax' do
|
10
|
+
described_class.new("{").should_not be_valid
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'returns true for valid syntax' do
|
14
|
+
described_class.new("{}").should be_valid
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#invalid_message' do
|
19
|
+
it 'returns whatever Ruby gave it on the command line, followed by the original file' do
|
20
|
+
described_class.new("{").invalid_message.should ==
|
21
|
+
"-:1: syntax error, unexpected $end, expecting '}'\n"\
|
22
|
+
"\n" \
|
23
|
+
"original file:\n" \
|
24
|
+
"{"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
|
3
|
+
require 'mountain_berry_fields'
|
4
|
+
require 'mountain_berry_fields/command_line_interaction'
|
5
|
+
|
6
|
+
require 'stringio'
|
7
|
+
require 'surrogate/rspec'
|
8
|
+
|
9
|
+
|
10
|
+
RSpec::Matchers.define :pass do
|
11
|
+
match { |matcher| matcher.pass? }
|
12
|
+
end
|
13
|
+
|
14
|
+
module Mock
|
15
|
+
class SyntaxChecker
|
16
|
+
Surrogate.endow self
|
17
|
+
define(:initialize) { |syntax| }
|
18
|
+
define(:valid?) { true }
|
19
|
+
define(:invalid_message) { "shit ain't valid" }
|
20
|
+
end
|
21
|
+
|
22
|
+
class File
|
23
|
+
Surrogate.endow self do
|
24
|
+
define(:exist?) { true }
|
25
|
+
define(:write) { true }
|
26
|
+
define(:read) { "file contents" }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Dir
|
31
|
+
Surrogate.endow self do
|
32
|
+
define(:chdir) { |dir, &block| block.call }
|
33
|
+
define(:mktmpdir) { |prefix, &block| block.call }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
module Process
|
38
|
+
class Status
|
39
|
+
Surrogate.endow self
|
40
|
+
define(:success?) { true }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class Open3
|
45
|
+
Surrogate.endow self do
|
46
|
+
define(:capture3) { |invocation| ["stdout", "stderr", @exitstatus||Process::Status.new] }
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
def self.exit_with_failure!
|
51
|
+
@exitstatus = Process::Status.new.will_have_success? false
|
52
|
+
self
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.exit_with_success!
|
56
|
+
@exitstatus = Process::Status.new.will_have_success? true
|
57
|
+
self
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class Interaction
|
62
|
+
Surrogate.endow self
|
63
|
+
define(:declare_failure) { }
|
64
|
+
end
|
65
|
+
|
66
|
+
class Evaluator
|
67
|
+
Surrogate.endow self do
|
68
|
+
define(:visible_commands) { [:visible] }
|
69
|
+
define(:invisible_commands) { [:invisible] }
|
70
|
+
end
|
71
|
+
|
72
|
+
define(:initialize) { @document = '' }
|
73
|
+
define(:tests_pass?) { true }
|
74
|
+
define(:test) { |test, &block| block.call }
|
75
|
+
define(:failure_message) { 'some failure message' }
|
76
|
+
define(:failure_name) { 'failing test name' }
|
77
|
+
define(:document)
|
78
|
+
|
79
|
+
def inspect
|
80
|
+
'#<MOCK EVALUATOR>'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class Parser
|
85
|
+
Surrogate.endow self
|
86
|
+
define(:initialize) {}
|
87
|
+
define(:parse) { 'some body' }
|
88
|
+
define(:parsed) { parse }
|
89
|
+
|
90
|
+
def inspect
|
91
|
+
'#<MOCK PARSER>'
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
MountainBerryFields.override(:file_class) { Mock::File.clone }
|
97
|
+
MountainBerryFields.override(:dir_class) { Mock::Dir.clone }
|
98
|
+
MountainBerryFields.override(:interaction) { Mock::Interaction.new }
|
99
|
+
MountainBerryFields.override(:evaluator_class) { Mock::Evaluator.clone }
|
100
|
+
MountainBerryFields.override(:parser_class) { Mock::Parser.clone }
|
101
|
+
|
102
|
+
MountainBerryFields::CommandLineInteraction.override(:stderr) { StringIO.new }
|
103
|
+
MountainBerryFields::Test::RSpec.override(:syntax_checker_class) { Mock::SyntaxChecker }
|
104
|
+
MountainBerryFields::Test::MagicComments.override(:syntax_checker_class) { Mock::SyntaxChecker }
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
test_class = MountainBerryFields::Test
|
4
|
+
describe test_class::AlwaysFail do
|
5
|
+
it 'is registered it the strategy list under :always_pass' do
|
6
|
+
test_class::Strategy.for(:always_fail).should == described_class
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'evaluates the code' do
|
10
|
+
$a = nil
|
11
|
+
described_class.new('$a=1').pass?
|
12
|
+
$a.should == 1
|
13
|
+
end
|
14
|
+
|
15
|
+
specify '#pass? evaluates the code and returns false even in the face of bullshit' do
|
16
|
+
described_class.new("raise Exception, 'this will still pass'").should_not pass
|
17
|
+
$abc = ''
|
18
|
+
described_class.new("$abc=123").should_not pass
|
19
|
+
$abc.should == 123
|
20
|
+
end
|
21
|
+
|
22
|
+
specify '#failure_message returns some bullshit about failing' do
|
23
|
+
described_class.new('').failure_message.should be_a_kind_of String
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
test_class = MountainBerryFields::Test
|
4
|
+
describe test_class::AlwaysPass do
|
5
|
+
it 'is registered it the strategy list under :always_pass' do
|
6
|
+
test_class::Strategy.for(:always_pass).should == described_class
|
7
|
+
end
|
8
|
+
|
9
|
+
specify '#pass? evaluates the code and returns true even in the face of bullshit' do
|
10
|
+
described_class.new("raise Exception, 'this will still pass'").should pass
|
11
|
+
$abc = ''
|
12
|
+
described_class.new("$abc=123").should pass
|
13
|
+
$abc.should == 123
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
described_class = MountainBerryFields::Test::Strategy
|
4
|
+
|
5
|
+
describe described_class do
|
6
|
+
it 'is a module that you can mix into any class that wants to be a strategy' do
|
7
|
+
described_class.should be_a_kind_of Module
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:strategy) { 'some strategy' }
|
11
|
+
before { described_class.unregister :abc }
|
12
|
+
|
13
|
+
describe 'registration' do
|
14
|
+
specify 'a strategy can register itself with the .register method' do
|
15
|
+
described_class.register :abc, strategy
|
16
|
+
described_class.should be_registered :abc
|
17
|
+
described_class.should be_registered 'abc'
|
18
|
+
end
|
19
|
+
|
20
|
+
specify 'a strategy can unregister itself with the .unregister method' do
|
21
|
+
described_class.register :abc, strategy
|
22
|
+
described_class.unregister 'abc'
|
23
|
+
expect { described_class.for :abc }.to raise_error NameError, /abc/
|
24
|
+
end
|
25
|
+
|
26
|
+
specify 'a strategy can be retrieved with the .for method' do
|
27
|
+
described_class.register 'abc', strategy
|
28
|
+
described_class.for(:abc).should == strategy
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
context 'when mixing into a class' do
|
34
|
+
let(:klass) { Class.new { include described_class } }
|
35
|
+
|
36
|
+
it 'is initialized with the code to test, and stores it' do
|
37
|
+
klass.new("abc").code_to_test.should == "abc"
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'raises "unimplemented" when #pass? is invoked -- you should overwrite this method' do
|
41
|
+
expect { klass.new('').pass? }.to raise_error "unimplemented"
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'raises "unimplemented" when #failure_message is invoked -- you should overwrite this method' do
|
45
|
+
expect { klass.new('').failure_message }.to raise_error "unimplemented"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class MountainBerryFields
|
4
|
+
describe Test do
|
5
|
+
let(:name) { 'Some name' }
|
6
|
+
let(:code) { 'Some code' }
|
7
|
+
let(:strategy_name) { :always_pass }
|
8
|
+
let(:test) { described_class.new name, code: code, with: strategy_name }
|
9
|
+
|
10
|
+
context 'the :strategy option' do
|
11
|
+
it 'tells it the name of its strategy' do
|
12
|
+
test.strategy.should == strategy_name
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'the :code option' do
|
17
|
+
it 'provides the code that it is testing' do
|
18
|
+
test.code.should == code
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,209 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mountain_berry_fields
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Josh Cheek
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-07-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: erubis
|
16
|
+
requirement: &70327682095500 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - =
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.7.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70327682095500
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: deject
|
27
|
+
requirement: &70327682094500 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.2.2
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70327682094500
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: mountain_berry_fields-magic_comments
|
38
|
+
requirement: &70327682093580 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 1.0.0
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70327682093580
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: mountain_berry_fields-rspec
|
49
|
+
requirement: &70327682092780 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.0
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70327682092780
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: surrogate
|
60
|
+
requirement: &70327682092320 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 0.5.1
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70327682092320
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: &70327682091860 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ~>
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 2.10.0
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70327682091860
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: cucumber
|
82
|
+
requirement: &70327682107760 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ~>
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: 1.2.0
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *70327682107760
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: simplecov
|
93
|
+
requirement: &70327682107280 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ~>
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: 0.6.4
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: *70327682107280
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: rake
|
104
|
+
requirement: &70327682106900 !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: *70327682106900
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: pry
|
115
|
+
requirement: &70327682106440 !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ! '>='
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
type: :development
|
122
|
+
prerelease: false
|
123
|
+
version_requirements: *70327682106440
|
124
|
+
description: Test code samples embedded in files like readmes
|
125
|
+
email:
|
126
|
+
- josh.cheek@gmail.com
|
127
|
+
executables:
|
128
|
+
- mountain_berry_fields
|
129
|
+
extensions: []
|
130
|
+
extra_rdoc_files: []
|
131
|
+
files:
|
132
|
+
- .gitignore
|
133
|
+
- .simplecov
|
134
|
+
- Gemfile
|
135
|
+
- LICENSE
|
136
|
+
- Rakefile
|
137
|
+
- Readme.md
|
138
|
+
- Readme.md.mountain_berry_fields
|
139
|
+
- bin/mountain_berry_fields
|
140
|
+
- features/context_block.feature
|
141
|
+
- features/cwd_is_dir_of_mbf_file.feature
|
142
|
+
- features/rake_task.feature
|
143
|
+
- features/setup_block.feature
|
144
|
+
- features/step_definitions/steps.rb
|
145
|
+
- features/support/env.rb
|
146
|
+
- lib/mountain_berry_fields.rb
|
147
|
+
- lib/mountain_berry_fields/command_line_interaction.rb
|
148
|
+
- lib/mountain_berry_fields/evaluator.rb
|
149
|
+
- lib/mountain_berry_fields/parser.rb
|
150
|
+
- lib/mountain_berry_fields/rake_task.rb
|
151
|
+
- lib/mountain_berry_fields/test.rb
|
152
|
+
- lib/mountain_berry_fields/test/always_fail.rb
|
153
|
+
- lib/mountain_berry_fields/test/always_pass.rb
|
154
|
+
- lib/mountain_berry_fields/version.rb
|
155
|
+
- mountain_berry_fields.gemspec
|
156
|
+
- readme_helper.rb
|
157
|
+
- spec/command_line_interaction_spec.rb
|
158
|
+
- spec/evaluator_spec.rb
|
159
|
+
- spec/mock_substitutability_spec.rb
|
160
|
+
- spec/mountain_berry_fields_spec.rb
|
161
|
+
- spec/parser_spec.rb
|
162
|
+
- spec/ruby_syntax_checker_spec.rb
|
163
|
+
- spec/spec_helper.rb
|
164
|
+
- spec/test/always_fail_spec.rb
|
165
|
+
- spec/test/always_pass_spec.rb
|
166
|
+
- spec/test/strategy_spec.rb
|
167
|
+
- spec/test/test_spec.rb
|
168
|
+
homepage: ''
|
169
|
+
licenses: []
|
170
|
+
post_install_message:
|
171
|
+
rdoc_options: []
|
172
|
+
require_paths:
|
173
|
+
- lib
|
174
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
175
|
+
none: false
|
176
|
+
requirements:
|
177
|
+
- - ! '>='
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '0'
|
180
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
181
|
+
none: false
|
182
|
+
requirements:
|
183
|
+
- - ! '>='
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: '0'
|
186
|
+
requirements: []
|
187
|
+
rubyforge_project:
|
188
|
+
rubygems_version: 1.8.17
|
189
|
+
signing_key:
|
190
|
+
specification_version: 3
|
191
|
+
summary: Test code samples embedded in files like readmes
|
192
|
+
test_files:
|
193
|
+
- features/context_block.feature
|
194
|
+
- features/cwd_is_dir_of_mbf_file.feature
|
195
|
+
- features/rake_task.feature
|
196
|
+
- features/setup_block.feature
|
197
|
+
- features/step_definitions/steps.rb
|
198
|
+
- features/support/env.rb
|
199
|
+
- spec/command_line_interaction_spec.rb
|
200
|
+
- spec/evaluator_spec.rb
|
201
|
+
- spec/mock_substitutability_spec.rb
|
202
|
+
- spec/mountain_berry_fields_spec.rb
|
203
|
+
- spec/parser_spec.rb
|
204
|
+
- spec/ruby_syntax_checker_spec.rb
|
205
|
+
- spec/spec_helper.rb
|
206
|
+
- spec/test/always_fail_spec.rb
|
207
|
+
- spec/test/always_pass_spec.rb
|
208
|
+
- spec/test/strategy_spec.rb
|
209
|
+
- spec/test/test_spec.rb
|