generative 0.2.0 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 02a4f62bfe5c5c3d05c10bc1196bb33abe6ee992
4
- data.tar.gz: e692488353ac4202143d4ac3ec18597a72c5f10b
3
+ metadata.gz: 30facfd44bae285d5299ad418352db2d662b9fae
4
+ data.tar.gz: 10dd90eaf237f02a57c1087ce6287400a78427d6
5
5
  SHA512:
6
- metadata.gz: 9840d498e882fec2575c43153a6c618988b2b8931923d7645c59d46ee0b82fa37e3b1797d6e5353fb5e272d9c6e5d173d478afc15981fba0d6c832e4ca0ef8a6
7
- data.tar.gz: 4876dafd32294af5d8d74324263e84a6e840467667d7ead681dff0c68b179ace66fd585ebf5060b5a923f4eb7d704a952d59e2f41aee441f3f610def7fec49d5
6
+ metadata.gz: da448e92ce5aa862d8fe45cea577dd2682d3e9bf01cc5b169e0520a2bb8e90bdcd5a859a11fee4a14ea45de06ad68c481e1950057ccd8eaedd0395923f81c21e
7
+ data.tar.gz: 174c2dfd2ec20af6bfac7df2499afec77dbe3849ad3dd414f0837a18d9e7542220dcdbd112c20d40c2212d30a43415290c96c5cc215a39651f4680c3fc3a2b36
@@ -8,4 +8,4 @@ matrix:
8
8
  allow_failures:
9
9
  - rvm: ruby-head
10
10
  script:
11
- - rake ci
11
+ - bundle exec rake ci
data/README.md CHANGED
@@ -110,3 +110,88 @@ Given the examples above, running `rspec` will use the default "progress"
110
110
  formatter. Requiring generative will modify this formatter to output blue dots
111
111
  instead of green for generative tests. Generative also includes it's own
112
112
  formatter, which will only display generative test names once, also in blue.
113
+
114
+ ### Generators
115
+
116
+ Generative allows you to register your own custom generators for generative
117
+ tests. Registering a generator requires two thing, a name and an object that
118
+ responds to `#call`.
119
+
120
+ Whether you just want to use lambdas.
121
+
122
+ ```rb
123
+ Generative.register_generator(:full_name) { "#{Generative.generate(:string)} #{Generative.generate(:string}" }
124
+
125
+ Generative.register_generator(:user) { FactoryGirl.build(:user, id: Generative.generate(:integer)) }
126
+ ```
127
+
128
+ A class or module that responds to `#call`.
129
+
130
+ ```rb
131
+ class LameGenerator
132
+ def self.call
133
+ random_string
134
+ end
135
+ end
136
+
137
+ Generative.register_generator(:lame, LameGenerator)
138
+ ```
139
+
140
+ Or you want to use a fancy library.
141
+
142
+ ```rb
143
+ FakeTypeMappingLibrary
144
+ generator_for Bar do
145
+ initializer Float, Fixnum
146
+
147
+ accessor :baz, Float
148
+ accessor :quz, NotherClass
149
+ end
150
+ end
151
+
152
+ Generative.register_generator(:bar, Bar }
153
+ ```
154
+
155
+ You can then use your generators using the `generate` helper.
156
+
157
+ ```rb
158
+ describe String do
159
+ let(:string) { "abc" }
160
+
161
+ describe "#reverse" do
162
+ generative do
163
+ data(:string) { generate(:my_fancy_string) }
164
+
165
+ it "maintains length" do
166
+ expect(string.reverse.length).to eq(string.length)
167
+ end
168
+ end
169
+ end
170
+ end
171
+ ```
172
+
173
+ #### I heard you like generators so I put some generators in your generators...
174
+
175
+ If you want to use other generators in you registered generator do note
176
+ you have to use Generative's module level method `.generate` like so...
177
+
178
+ ```rb
179
+ Generative.register_generator :user do
180
+ User.new( first_name: Generative.generate(:string, max: 100) )
181
+ end
182
+ ```
183
+
184
+
185
+
186
+ ### Pre-made Generators
187
+
188
+ **Note**: At this time Generative provides no pre-made generators. We
189
+ encourage you to go out and seek good ways of generating
190
+ data and maybe even package them up as your own gems. If you
191
+ do, let us know and we'll link to it here.
192
+
193
+
194
+ #### Degenerate
195
+
196
+ This library has a few generators for some basic primitives... A great start if
197
+ you're looking to move quickly.
data/Rakefile CHANGED
@@ -13,10 +13,10 @@ task :acceptance do
13
13
  ENV.delete('GENERATIVE_COUNT')
14
14
 
15
15
  [
16
- ['rspec', '13'],
17
- ['rake spec', '13'],
18
- ['rake generative', '30000'],
19
- ['bin/generative', '30000']
16
+ ['rspec', '22'], # can we do this some other way
17
+ ['rake spec', '22'], # sucks to bump as we add tests...
18
+ ['rake generative', '40000'],
19
+ ['bin/generative', '40000']
20
20
  ].each do |command, expected_example_count|
21
21
  puts "Checking output of `#{command}`"
22
22
  output = %x{#{command}}
@@ -13,7 +13,7 @@ command = %w[
13
13
  --tag generative
14
14
  ].join(' ')
15
15
 
16
- command = "GENERATIVE_COUNT=#{ENV['GENERATIVE_COUNT']} #{command}"
16
+ command = "export GENERATIVE_COUNT=#{ENV['GENERATIVE_COUNT']}; #{command}; unset GENERATIVE_COUNT"
17
17
 
18
18
  puts command
19
19
  system command
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |gem|
6
6
  gem.name = 'generative'
7
- gem.version = '0.2.0'
7
+ gem.version = '0.2.2'
8
8
  gem.authors = ["Justin Campbell", "Dan McClory"]
9
9
  gem.email = ["justin@justincampbell.me", "danmcclory@gmail.com"]
10
10
  gem.description = "Generative testing for RSpec"
@@ -1,8 +1,28 @@
1
1
  require 'rspec/core'
2
2
 
3
3
  module Generative
4
+
4
5
  DEFAULT_COUNT = '10_000'
5
6
 
7
+ class << self
8
+ extend Forwardable
9
+ def_delegators :manager, :register_generator, :find_and_call
10
+ end
11
+
12
+ def self.generate(generator_name, *args)
13
+ find_and_call(generator_name, *args)
14
+ end
15
+
16
+ def self.manager
17
+ @manager ||= GeneratorManager.new(preregistered_generators)
18
+ end
19
+
20
+ def self.preregistered_generators
21
+ {
22
+ # nothing to see here yet
23
+ }
24
+ end
25
+
6
26
  def self.running?
7
27
  !!ENV['GENERATIVE_COUNT']
8
28
  end
@@ -11,3 +31,4 @@ end
11
31
  require 'generative/dsl'
12
32
  require 'generative/formatters'
13
33
  require 'generative/ordering'
34
+ require 'generative/generator_manager'
@@ -4,5 +4,10 @@ class RSpec::Core::ExampleGroup
4
4
 
5
5
  class << self
6
6
  alias_method :data, :let
7
+ alias_method :for_every, :let
8
+ end
9
+
10
+ def generate(generator_name, *args)
11
+ Generative.generate(generator_name, *args)
7
12
  end
8
13
  end
@@ -72,7 +72,7 @@ module Generative
72
72
  example = notification.example
73
73
 
74
74
  if generative?(example)
75
- RSpec.wants_to_quit = true
75
+ RSpec.world.wants_to_quit = true
76
76
  end
77
77
 
78
78
  super
@@ -0,0 +1,32 @@
1
+ module Generative
2
+ class InvalidGenerator < StandardError; end
3
+ class UnregisteredGenerator < StandardError; end
4
+
5
+ class GeneratorManager
6
+
7
+ attr_reader :generators
8
+
9
+ def initialize(preregistered_generators={})
10
+ @generators = Hash.new(preregistered_generators)
11
+ end
12
+
13
+ def register_generator(name, factory=nil, &generator)
14
+ registerable = block_given? ? generator : factory
15
+ msg = "#{registerable} must respond to :call"
16
+ raise InvalidGenerator, msg unless generator_valid?(registerable)
17
+ @generators.merge!(name => registerable)
18
+ end
19
+
20
+ def find_and_call(name, *args)
21
+ begin
22
+ generators[name].call(*args)
23
+ rescue NoMethodError
24
+ raise UnregisteredGenerator, "#{name} generator not registered"
25
+ end
26
+ end
27
+
28
+ def generator_valid?(generator)
29
+ generator.respond_to?(:call)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe Generative::GeneratorManager do
4
+
5
+ subject { Generative::GeneratorManager.new }
6
+
7
+ describe "#register_generator_generator" do
8
+ it "throws an exception if a block or a factory object isn't given" do
9
+ expect { subject.register_generator(:test) }.to raise_error(Generative::InvalidGenerator)
10
+ end
11
+
12
+ it "registers a new generator when given a generator block" do
13
+ name, generator = :test, lambda { "hi" }
14
+ expect(subject.generators).not_to include(name)
15
+ expect(subject.register_generator(name) { "hi" }).to include(name)
16
+ expect(subject.generators[name].call).to eq("hi")
17
+ end
18
+
19
+ it "registers a new generator when given a factory object" do
20
+ name, factory = :test, OpenStruct.new(call: true)
21
+ expect(subject.generators).not_to include(name)
22
+ expect(subject.register_generator(name, factory)).to include(name)
23
+ expect(subject.generators[name].call).to be_truthy
24
+ end
25
+ end
26
+
27
+ describe "#find_and_call" do
28
+ it "calls a specific generator passing in it's arguments" do
29
+ name, generator = :test, lambda { |arg| arg }
30
+ subject.register_generator(name, &generator)
31
+ expect(subject.find_and_call(name, "hi")).to eq("hi")
32
+ end
33
+
34
+ it "raises an error fo ran unregistered generator" do
35
+ expect { subject.find_and_call(:nope) }
36
+ .to raise_error(Generative::UnregisteredGenerator)
37
+ end
38
+
39
+ describe "#generator_valid?" do
40
+ it "returns false if an object doesn't respond to :call or :build" do
41
+ expect(subject.generator_valid?(nil)).to be_falsey
42
+ end
43
+
44
+ it "returns true if an object doesn't respond to :call" do
45
+ generator = OpenStruct.new(call: true)
46
+ expect(subject.generator_valid?(generator)).to be_truthy
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,5 +1,7 @@
1
1
  require 'generative'
2
2
 
3
+ Generative.register_generator(:string) { "a" * rand(255) }
4
+
3
5
  describe String do
4
6
  let(:string) { "abc" }
5
7
 
@@ -17,6 +19,16 @@ describe String do
17
19
  expect(string.length).to be >= 0
18
20
  end
19
21
  end
22
+
23
+ xit "uses registered generators"
24
+
25
+ generative do
26
+ data(:string) { generate(:string) }
27
+
28
+ it "is never negative" do
29
+ expect(string.length).to be >= 0
30
+ end
31
+ end
20
32
  end
21
33
 
22
34
  describe "#reverse" do
metadata CHANGED
@@ -1,44 +1,44 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: generative
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Campbell
8
8
  - Dan McClory
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-08-12 00:00:00.000000000 Z
12
+ date: 2014-12-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: !ruby/object:Gem::Requirement
16
+ version_requirements: !ruby/object:Gem::Requirement
17
17
  requirements:
18
18
  - - '>='
19
19
  - !ruby/object:Gem::Version
20
20
  version: '3.0'
21
- type: :runtime
22
- prerelease: false
23
- version_requirements: !ruby/object:Gem::Requirement
21
+ requirement: !ruby/object:Gem::Requirement
24
22
  requirements:
25
23
  - - '>='
26
24
  - !ruby/object:Gem::Version
27
25
  version: '3.0'
26
+ prerelease: false
27
+ type: :runtime
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
- requirement: !ruby/object:Gem::Requirement
30
+ version_requirements: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - '>='
33
33
  - !ruby/object:Gem::Version
34
34
  version: '0'
35
- type: :development
36
- prerelease: false
37
- version_requirements: !ruby/object:Gem::Requirement
35
+ requirement: !ruby/object:Gem::Requirement
38
36
  requirements:
39
37
  - - '>='
40
38
  - !ruby/object:Gem::Version
41
39
  version: '0'
40
+ prerelease: false
41
+ type: :development
42
42
  description: Generative testing for RSpec
43
43
  email:
44
44
  - justin@justincampbell.me
@@ -61,9 +61,11 @@ files:
61
61
  - lib/generative.rb
62
62
  - lib/generative/dsl.rb
63
63
  - lib/generative/formatters.rb
64
+ - lib/generative/generator_manager.rb
64
65
  - lib/generative/ordering.rb
65
66
  - lib/generative/rake_task.rb
66
67
  - lib/generative/version.rb
68
+ - spec/generative/generator_manager_spec.rb
67
69
  - spec/generative/ordering_spec.rb
68
70
  - spec/generative/rake_task_spec.rb
69
71
  - spec/generative_spec.rb
@@ -72,7 +74,7 @@ homepage: https://github.com/justincampbell/generative
72
74
  licenses:
73
75
  - MIT
74
76
  metadata: {}
75
- post_install_message:
77
+ post_install_message:
76
78
  rdoc_options: []
77
79
  require_paths:
78
80
  - lib
@@ -87,14 +89,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
89
  - !ruby/object:Gem::Version
88
90
  version: '0'
89
91
  requirements: []
90
- rubyforge_project:
91
- rubygems_version: 2.0.14
92
- signing_key:
92
+ rubyforge_project:
93
+ rubygems_version: 2.1.9
94
+ signing_key:
93
95
  specification_version: 4
94
96
  summary: Generative testing for RSpec
95
97
  test_files:
98
+ - spec/generative/generator_manager_spec.rb
96
99
  - spec/generative/ordering_spec.rb
97
100
  - spec/generative/rake_task_spec.rb
98
101
  - spec/generative_spec.rb
99
102
  - spec/spec_helper.rb
100
- has_rdoc: