spec_producer 0.11.0 → 0.13.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/.ruby-version +1 -0
- data/CHANGELOG.md +15 -0
- data/README.md +73 -24
- data/lib/configuration.rb +41 -0
- data/lib/generators/spec_producer/install/install_generator.rb +13 -0
- data/lib/generators/spec_producer/install/templates/spec_producer +1 -0
- data/lib/spec_producer.rb +140 -47
- data/lib/spec_producer/factories_production_module.rb +17 -11
- data/lib/spec_producer/missing_files_module.rb +104 -41
- data/lib/spec_producer/missing_gems_module.rb +77 -0
- data/lib/spec_producer/producers.rb +10 -0
- data/lib/spec_producer/producers/base.rb +129 -0
- data/lib/spec_producer/producers/controllers_producer.rb +31 -0
- data/lib/spec_producer/producers/helpers_producer.rb +26 -0
- data/lib/spec_producer/producers/jobs_producer.rb +34 -0
- data/lib/spec_producer/producers/mailers_producer.rb +24 -0
- data/lib/spec_producer/producers/models_producer.rb +89 -0
- data/lib/spec_producer/producers/registry.rb +66 -0
- data/lib/spec_producer/producers/routes_producer.rb +44 -0
- data/lib/spec_producer/producers/serializers_producer.rb +46 -0
- data/lib/spec_producer/producers/views_producer.rb +25 -0
- data/lib/spec_producer/railtie.rb +13 -0
- data/lib/spec_producer/rspec_builders.rb +1 -0
- data/lib/spec_producer/rspec_builders/base.rb +148 -0
- data/lib/spec_producer/rspec_builders/builder.rb +220 -0
- data/lib/spec_producer/rspec_builders/matchers.rb +256 -0
- data/lib/spec_producer/spec_production_module.rb +80 -331
- data/lib/spec_producer/spec_runner.rb +14 -0
- data/lib/spec_producer/utils.rb +1 -0
- data/lib/spec_producer/utils/file_utils.rb +69 -0
- data/lib/spec_producer/version.rb +1 -1
- data/lib/tasks/spec_producer_tasks.rake +103 -0
- data/spec_producer.gemspec +6 -0
- metadata +111 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99eb0473031f263db6636d226b5fccf77a457642
|
4
|
+
data.tar.gz: 5659f755c10d008827383066296556a862abb626
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db4f51442225f9e5939e6391abfe21abc8622406264781e3058beb44c1b4f488d3aedac6715f4ce202b1545167314d4159f7d135567ead401021f3becd97f9c1
|
7
|
+
data.tar.gz: c5619012c248e4c808545bf54ab223be438ae45e7bbbc3eefbb666fc53752ce29660b2cb49f1e713ae7ccc3902ecaceda24b4e0f80e79964ec9014c788029d77
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.2.5
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
## 0.13.0 (2017-01-05)
|
2
|
+
|
3
|
+
Features:
|
4
|
+
* Major refactoring on how specs are produced (some previous functionality may not be supported here)
|
5
|
+
* Add rake tasks for each functionality supported
|
6
|
+
|
7
|
+
## 0.12.0 (2016-11-8)
|
8
|
+
|
9
|
+
Features:
|
10
|
+
* Cover more characteristics through static analysis
|
11
|
+
* Update serializer specs
|
12
|
+
* Colorized responses
|
13
|
+
* Run specs after production
|
14
|
+
* Initial attempt for command line runs
|
15
|
+
|
1
16
|
## 0.11.0 (2016-10-18)
|
2
17
|
|
3
18
|
Features:
|
data/README.md
CHANGED
@@ -3,15 +3,17 @@
|
|
3
3
|
[](https://travis-ci.org/arcanoid/spec_producer)
|
4
4
|
[](https://badge.fury.io/rb/spec_producer)
|
5
5
|
|
6
|
-
SpecProducer is a
|
7
|
-
|
6
|
+
SpecProducer is a library that is meant to assist users in skipping the tedious work of creating spec tests for basic
|
7
|
+
Rails applications. It reads through Active Record subclasses of the project and prepares some of the basic spec tests for you.
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
11
11
|
Add this line to your application's Gemfile:
|
12
12
|
|
13
13
|
```ruby
|
14
|
-
|
14
|
+
group :development do
|
15
|
+
gem 'spec_producer'
|
16
|
+
end
|
15
17
|
```
|
16
18
|
|
17
19
|
And then execute:
|
@@ -24,83 +26,130 @@ Or install it yourself as:
|
|
24
26
|
|
25
27
|
## Usage
|
26
28
|
|
27
|
-
Currently this gem supports the production of spec tests for
|
28
|
-
If the spec file already exists then it prints
|
29
|
+
Currently this gem supports the production of spec tests for active record models.
|
30
|
+
If the spec file already exists then it prints out the contents it would generated
|
31
|
+
for a model.
|
29
32
|
|
30
|
-
To produce all possible tests
|
33
|
+
To produce all possible tests you can run the public API methods directly from a Rails console
|
34
|
+
or use the rake tasks provided by the gem (run rake -T | grep spec_producer for all available rake tasks)
|
35
|
+
on a rails project.
|
31
36
|
|
32
37
|
```ruby
|
33
|
-
|
34
|
-
|
38
|
+
# Using a rake task (currently supports producing only model specs)
|
39
|
+
bundle exec rake spec_producer:all
|
35
40
|
|
36
|
-
|
41
|
+
#or produce all tests for models:
|
37
42
|
|
38
|
-
|
39
|
-
SpecProducer.produce_specs_for_models
|
43
|
+
bundle exec rake spec_producer:models
|
40
44
|
```
|
41
45
|
|
42
46
|
To produce all tests for routes, run:
|
43
47
|
|
44
48
|
```ruby
|
45
|
-
|
49
|
+
bundle exec rake spec_producer:routes
|
46
50
|
```
|
47
51
|
|
48
52
|
To produce all spec files for views, run:
|
49
53
|
|
50
54
|
```ruby
|
51
|
-
|
55
|
+
bundle exec rake spec_producer:views
|
52
56
|
```
|
53
57
|
|
54
58
|
To produce all spec files for helpers, run:
|
55
59
|
|
56
60
|
```ruby
|
57
|
-
|
61
|
+
bundle exec rake spec_producer:helpers
|
58
62
|
```
|
59
63
|
|
60
64
|
To produce all spec files for controllers, run:
|
61
65
|
|
62
66
|
```ruby
|
63
|
-
|
67
|
+
bundle exec rake spec_producer:controllers
|
68
|
+
```
|
69
|
+
|
70
|
+
To produce all spec files for jobs, run:
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
bundle exec rake spec_producer:jobs
|
74
|
+
```
|
75
|
+
|
76
|
+
To produce all spec files for mailers, run:
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
bundle exec rake spec_producer:mailers
|
80
|
+
```
|
81
|
+
|
82
|
+
To produce all spec files for serializers, run:
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
bundle exec rake spec_producer:serializers
|
86
|
+
```
|
87
|
+
|
88
|
+
In case you have factory_girl gem installed, to produce a list of sample factory files for your models, run:
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
bundle exec rake spec_producer:factories
|
64
92
|
```
|
65
93
|
|
66
94
|
Additionally this gem (from version 0.2.0) allows users to print all their missing spec files by reading all
|
67
|
-
directories for Views, Models, Controllers
|
95
|
+
directories for Views, Models, Controllers, Helpers etc.
|
68
96
|
|
69
97
|
To print all types of missing tests, run:
|
70
98
|
|
71
99
|
```ruby
|
72
|
-
|
100
|
+
bundle exec rake missing_specs_printer:all
|
73
101
|
```
|
74
102
|
|
75
103
|
To print all missing model tests, run:
|
76
104
|
|
77
105
|
```ruby
|
78
|
-
|
106
|
+
bundle exec rake missing_specs_printer:models
|
79
107
|
```
|
80
108
|
|
81
109
|
To print all missing controller tests, run:
|
82
110
|
|
83
111
|
```ruby
|
84
|
-
|
112
|
+
bundle exec rake missing_specs_printer:controllers
|
85
113
|
```
|
86
114
|
|
87
115
|
To print all missing helper tests, run:
|
88
116
|
|
89
117
|
```ruby
|
90
|
-
|
118
|
+
bundle exec rake missing_specs_printer:helpers
|
91
119
|
```
|
92
120
|
|
93
121
|
To print all missing view tests, run:
|
94
122
|
|
95
123
|
```ruby
|
96
|
-
|
124
|
+
bundle exec rake missing_specs_printer:views
|
97
125
|
```
|
98
126
|
|
99
|
-
|
127
|
+
To print all missing job tests, run:
|
128
|
+
|
129
|
+
```ruby
|
130
|
+
bundle exec rake missing_specs_printer:jobs
|
131
|
+
```
|
132
|
+
|
133
|
+
To print all missing mailer tests, run:
|
134
|
+
|
135
|
+
```ruby
|
136
|
+
bundle exec rake missing_specs_printer:mailers
|
137
|
+
```
|
100
138
|
|
101
|
-
|
139
|
+
To print all missing route tests, run:
|
102
140
|
|
103
|
-
|
141
|
+
```ruby
|
142
|
+
bundle exec rake missing_specs_printer:routes
|
143
|
+
```
|
144
|
+
|
145
|
+
To print all missing serializer tests, run:
|
146
|
+
|
147
|
+
```ruby
|
148
|
+
bundle exec rake missing_specs_printer:serializers
|
149
|
+
```
|
150
|
+
|
151
|
+
## Development
|
152
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests.
|
104
153
|
|
105
154
|
## Contributing
|
106
155
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module SpecProducer
|
2
|
+
module Configuration
|
3
|
+
CURRENT_ATTRS = [:raise_errors].freeze
|
4
|
+
DEPRECATED_ATTRS = [].freeze
|
5
|
+
CONFIG_ATTRS = (CURRENT_ATTRS + DEPRECATED_ATTRS).freeze
|
6
|
+
|
7
|
+
def configure
|
8
|
+
return unless block_given?
|
9
|
+
yield config
|
10
|
+
end
|
11
|
+
|
12
|
+
def configuration
|
13
|
+
config
|
14
|
+
end
|
15
|
+
|
16
|
+
def config
|
17
|
+
@config ||= Configuration.new
|
18
|
+
end
|
19
|
+
private :config
|
20
|
+
|
21
|
+
class Configuration < Struct.new(*CONFIG_ATTRS)
|
22
|
+
def initialize
|
23
|
+
super
|
24
|
+
|
25
|
+
set_default_values
|
26
|
+
end
|
27
|
+
|
28
|
+
def options
|
29
|
+
Hash[ * CONFIG_ATTRS.map { |key| [key, send(key)] }]
|
30
|
+
end
|
31
|
+
|
32
|
+
#######
|
33
|
+
private
|
34
|
+
#######
|
35
|
+
|
36
|
+
def set_default_values
|
37
|
+
self.raise_errors = true
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module SpecProducer
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < ::Rails::Generators::Base
|
4
|
+
desc "Adds spec_generator in bin/ folder"
|
5
|
+
source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
6
|
+
|
7
|
+
def copy_executable
|
8
|
+
template "spec_producer", "bin/spec_producer.rb"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# Basic bin/generator to add
|
data/lib/spec_producer.rb
CHANGED
@@ -1,82 +1,147 @@
|
|
1
1
|
require "spec_producer/version"
|
2
|
+
|
3
|
+
require 'spec_producer/railtie'
|
4
|
+
|
2
5
|
require "spec_producer/missing_files_module"
|
6
|
+
require "spec_producer/missing_gems_module"
|
3
7
|
require "spec_producer/spec_production_module"
|
4
8
|
require "spec_producer/factories_production_module"
|
5
9
|
|
10
|
+
require 'active_support/core_ext/module/delegation'
|
11
|
+
|
12
|
+
require 'spec_producer/producers'
|
13
|
+
require 'spec_producer/rspec_builders'
|
14
|
+
require 'spec_producer/spec_runner'
|
15
|
+
|
16
|
+
require 'configuration'
|
17
|
+
|
6
18
|
module SpecProducer
|
19
|
+
extend Configuration
|
20
|
+
# == Spec \Producer
|
21
|
+
# Produces specs for the given type(s)
|
22
|
+
#
|
23
|
+
# To produce all spec you simply run:
|
24
|
+
# SpecProducer.produce
|
25
|
+
#
|
26
|
+
# You can provide some options to tell the producer to include or exclude some specs
|
27
|
+
# Example with <tt>:include</tt> option
|
28
|
+
#
|
29
|
+
# SpecProducer.produce(only: [:models, :controllers])
|
30
|
+
#
|
31
|
+
# Example with <tt>exclude</tt> option
|
32
|
+
# SpecProducer.produce(except: :views)
|
33
|
+
#
|
34
|
+
#
|
35
|
+
# We can produce specs for a single type by calling
|
36
|
+
#
|
37
|
+
# SpecProducer.produce_spec(:models)
|
38
|
+
#
|
39
|
+
#
|
40
|
+
# To add a new type of a Producer (Concrete class under spec_producer/producers) for a given type
|
41
|
+
# we need to register it in this class. For example if we want to implement ControllersProducer
|
42
|
+
# we would register it as follows:
|
43
|
+
#
|
44
|
+
# register(:models, Producers::ControllersProducer)
|
45
|
+
#
|
46
|
+
# This gives as the convention to lookup producers using a symbol and later on we can add
|
47
|
+
# extra functionality when registering a producer (optional params, init with lambdas etc.)
|
48
|
+
#
|
49
|
+
|
50
|
+
@registry = Producers::Registry.new
|
51
|
+
|
52
|
+
class << self
|
53
|
+
attr_reader :registry
|
54
|
+
delegate :run, to: SpecRunner
|
55
|
+
|
56
|
+
def produce(*args)
|
57
|
+
opts = args.extract_options!
|
58
|
+
spec_types = registry.types
|
59
|
+
|
60
|
+
if only = opts[:only]
|
61
|
+
spec_types &= Array(only).map(&:to_sym)
|
62
|
+
elsif except = opts[:except]
|
63
|
+
spec_types -= Array(except).map(&:to_sym)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Produce the specs
|
67
|
+
spec_types.each { |t| produce_spec(t) }
|
68
|
+
|
69
|
+
# Run the specs
|
70
|
+
run(spec_types) if opts[:run_specs]
|
71
|
+
end
|
72
|
+
|
73
|
+
def register(type_name, klass)
|
74
|
+
registry.register(type_name, klass)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Produces a single spec type. For example
|
78
|
+
#
|
79
|
+
# SpecProducer.produce_spec(:models)
|
80
|
+
#
|
81
|
+
# Will fetch and execute the Producers::ModelsSpecProducer
|
82
|
+
#
|
83
|
+
def produce_spec(spec_type)
|
84
|
+
lookup!(spec_type)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Fetches the producer from the registry. Note: that the #lookup method
|
88
|
+
# on registry instantiates and executes the producer to start generating
|
89
|
+
# the spec files. This execution is hidden in repository and the client
|
90
|
+
# is not aware of what is going on underneath. TODO: Refactor this so
|
91
|
+
# registry#lookup! does not executes the regitered Producer.
|
92
|
+
#
|
93
|
+
# If no Producer is Found an ArgumentError exception is thown.
|
94
|
+
#
|
95
|
+
def lookup!(spec_type)
|
96
|
+
registry.lookup!(spec_type)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Register new producers
|
101
|
+
register(:models, Producers::ModelsProducer)
|
102
|
+
register(:views, Producers::ViewsProducer)
|
103
|
+
register(:controllers, Producers::ControllersProducer)
|
104
|
+
register(:helpers, Producers::HelpersProducer)
|
105
|
+
register(:routes, Producers::RoutesProducer)
|
106
|
+
register(:mailers, Producers::MailersProducer)
|
107
|
+
register(:jobs, Producers::JobsProducer)
|
108
|
+
register(:serializers, Producers::SerializersProducer)
|
109
|
+
|
7
110
|
def self.produce_specs_for_all_types
|
8
|
-
set_up_necessities
|
9
|
-
SpecProductionModule.produce_specs_for_models
|
10
111
|
SpecProductionModule.produce_specs_for_routes
|
11
112
|
SpecProductionModule.produce_specs_for_views
|
12
|
-
SpecProductionModule.produce_specs_for_controllers
|
13
|
-
SpecProductionModule.produce_specs_for_helpers
|
14
113
|
SpecProductionModule.produce_specs_for_mailers
|
15
114
|
SpecProductionModule.produce_specs_for_jobs
|
16
|
-
SpecProductionModule.produce_specs_for_serializers
|
17
|
-
end
|
18
115
|
|
19
|
-
|
20
|
-
SpecProductionModule.produce_specs_for_models
|
116
|
+
run_spec_tests
|
21
117
|
end
|
22
118
|
|
23
119
|
def self.produce_specs_for_routes
|
24
120
|
SpecProductionModule.produce_specs_for_routes
|
121
|
+
|
122
|
+
run_spec_tests 'routes'
|
25
123
|
end
|
26
124
|
|
27
125
|
def self.produce_specs_for_views
|
28
126
|
SpecProductionModule.produce_specs_for_views
|
29
|
-
end
|
30
127
|
|
31
|
-
|
32
|
-
SpecProductionModule.produce_specs_for_controllers
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.produce_specs_for_helpers
|
36
|
-
SpecProductionModule.produce_specs_for_helpers
|
128
|
+
run_spec_tests 'views'
|
37
129
|
end
|
38
130
|
|
39
131
|
def self.produce_specs_for_mailers
|
40
132
|
SpecProductionModule.produce_specs_for_mailers
|
133
|
+
|
134
|
+
run_spec_tests 'mailers'
|
41
135
|
end
|
42
136
|
|
43
137
|
def self.produce_specs_for_jobs
|
44
138
|
SpecProductionModule.produce_specs_for_jobs
|
45
|
-
end
|
46
139
|
|
47
|
-
|
48
|
-
SpecProductionModule.produce_specs_for_serializers
|
140
|
+
run_spec_tests 'jobs'
|
49
141
|
end
|
50
142
|
|
51
143
|
def self.set_up_necessities
|
52
|
-
|
53
|
-
|
54
|
-
if gemfiles.size > 0
|
55
|
-
contents = File.read(gemfiles.first)
|
56
|
-
gems = contents.scan(/gem \'(?<gem>\S*)\'/).flatten.uniq
|
57
|
-
missing_gems = []
|
58
|
-
|
59
|
-
missing_gems << 'rspec-rails' unless (gems.include? 'rspec-rails')
|
60
|
-
missing_gems << 'factory_girl_rails' unless (gems.include? 'factory_girl_rails')
|
61
|
-
missing_gems << 'shoulda-matchers' unless (gems.include? 'shoulda-matchers')
|
62
|
-
missing_gems << 'capybara' unless (gems.include? 'capybara')
|
63
|
-
|
64
|
-
if missing_gems.size > 0
|
65
|
-
contents << "\ngroup :test do\n"
|
66
|
-
|
67
|
-
missing_gems.each do |gem|
|
68
|
-
contents << " gem '#{gem}'\n"
|
69
|
-
end
|
70
|
-
|
71
|
-
contents << "end"
|
72
|
-
end
|
73
|
-
|
74
|
-
f = File.open(gemfiles.first, 'wb+')
|
75
|
-
f.write(contents)
|
76
|
-
f.close
|
77
|
-
else
|
78
|
-
puts "We couldn't find a Gemfile and setting up halted!"
|
79
|
-
end
|
144
|
+
MissingGemsModule.set_up_necessities
|
80
145
|
end
|
81
146
|
|
82
147
|
def self.produce_factories
|
@@ -90,6 +155,8 @@ module SpecProducer
|
|
90
155
|
MissingFilesModule.print_missing_view_specs(options)
|
91
156
|
MissingFilesModule.print_missing_mailer_specs(options)
|
92
157
|
MissingFilesModule.print_missing_job_specs(options)
|
158
|
+
MissingFilesModule.print_missing_serializer_specs(options)
|
159
|
+
MissingFilesModule.print_missing_route_specs(options)
|
93
160
|
end
|
94
161
|
|
95
162
|
def self.print_missing_model_specs(options = {})
|
@@ -115,4 +182,30 @@ module SpecProducer
|
|
115
182
|
def self.print_missing_job_specs(options = {})
|
116
183
|
MissingFilesModule.print_missing_job_specs(options)
|
117
184
|
end
|
118
|
-
|
185
|
+
|
186
|
+
def self.print_missing_serializer_specs(options = {})
|
187
|
+
MissingFilesModule.print_missing_serializer_specs(options)
|
188
|
+
end
|
189
|
+
|
190
|
+
def self.print_missing_route_specs(options = {})
|
191
|
+
MissingFilesModule.print_missing_route_specs(options)
|
192
|
+
end
|
193
|
+
|
194
|
+
def self.run_spec_tests(type = nil)
|
195
|
+
puts "\nRunning related spec tests...\n"
|
196
|
+
|
197
|
+
if type.nil?
|
198
|
+
system 'bundle exec rake'
|
199
|
+
else
|
200
|
+
command = case type
|
201
|
+
when 'views' then 'bundle exec rspec spec/views'
|
202
|
+
when 'mailers' then 'bundle exec rspec spec/mailers'
|
203
|
+
when 'jobs' then 'bundle exec rspec spec/jobs'
|
204
|
+
when 'routes' then 'bundle exec rspec spec/routes'
|
205
|
+
else 'bundle exec rspec'
|
206
|
+
end
|
207
|
+
|
208
|
+
system command
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|