spec_producer 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e4d531faa30c2413786add89ceb1e7fd20093fcd
4
- data.tar.gz: b6b86d48100f3d9066015ed01cdd69140c4b86c3
3
+ metadata.gz: aa9471f617a4a561c9341e4499b805ac78dde481
4
+ data.tar.gz: 77191d8a8f92a2e5157839a18c19150e1c63c9dd
5
5
  SHA512:
6
- metadata.gz: f55fead5c9f34409532db1c996b979a4f81e0f877df886c6db160d788007248f9c0b45c11c3f9d635019a695bdd925811e5072c339f88eaca1b341840f2ad9e7
7
- data.tar.gz: 2680b09089dc157b18fb8c7b0fe88c97eab5076cfa8b767525ceaa44696336f95b67776c68df23f37ad92cb1b5f39d80ddcba5a53b2a4ce2fe6325a3c85fb484
6
+ metadata.gz: 38cf7383d2bb5b2fed451719d5a474d97c639d8f7ba24a7f999d7c77ae6441a875741cc4c976230c6391ef16c83650c0d8fa60ba06b67f38d8af139963a78e83
7
+ data.tar.gz: ddcf094c9e1101b5b56083c682cd5d986d92eeb6d129cebc70c190f1a30f2a044a17f42e25b62f6a8d1837aab7a64286ee6f40a439cf7b086ed0b6d3520ce29e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## 0.4.0 (2016-07-09)
2
+
3
+ Features:
4
+ * Added tests for readonly attributes
5
+ * Added more validation tests
6
+ * Added tests for db associations
7
+
8
+ Bug fixes:
9
+ * Fixes bug with naming
10
+ * Fixes bug when spec directory doesn't exist
11
+ * Fixes bug that skipped models in deeper namespace
12
+ * Code reformats and clearer output
13
+
1
14
  ## 0.3.0 (2016-06-12)
2
15
 
3
16
  Features:
data/README.md CHANGED
@@ -47,7 +47,6 @@ To produce all spec files for views, run:
47
47
  ```ruby
48
48
  SpecProducer.produce_specs_for_views
49
49
  ```
50
- ```
51
50
 
52
51
  To produce all spec files for helpers, run:
53
52
 
@@ -1,3 +1,3 @@
1
1
  module SpecProducer
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
data/lib/spec_producer.rb CHANGED
@@ -19,53 +19,91 @@ module SpecProducer
19
19
  final_text << "describe #{descendant.name} do\n"
20
20
 
21
21
  descendant.attribute_names.each do |attribute|
22
- final_text << "\tit { should respond_to :#{attribute}, :#{attribute}= }\n"
22
+ final_text << " it { should respond_to :#{attribute}, :#{attribute}= }\n"
23
+ end
24
+
25
+ descendant.readonly_attributes.each do |attribute|
26
+ final_text << " it { should have_readonly_attribute :#{attribute} }\n"
27
+ end
28
+
29
+ if descendant.validators.reject { |validator| validator.kind == :associated }.present?
30
+ final_text << "\n # Validators\n"
23
31
  end
24
32
 
25
33
  descendant.validators.each do |validator|
26
34
  if validator.kind == :presence
27
35
  validator.attributes.each do |attribute|
28
- final_text << "\tit { should validate_presence_of :#{attribute} }\n"
36
+ final_text << " it { should validate_presence_of :#{attribute} }\n"
29
37
  end
30
38
  elsif validator.kind == :uniqueness
31
39
  validator.attributes.each do |attribute|
32
- final_text << "\tit { should validate_uniqueness_of :#{attribute} }\n"
40
+ final_text << " it { should validate_uniqueness_of :#{attribute} }\n"
33
41
  end
34
42
  elsif validator.kind == :numericality
35
43
  validator.attributes.each do |attribute|
36
- final_text << "\tit { should validate_numericality_of :#{attribute} }\n"
44
+ final_text << " it { should validate_numericality_of :#{attribute} }\n"
37
45
  end
38
46
  elsif validator.kind == :acceptance
39
47
  validator.attributes.each do |attribute|
40
- final_text << "\tit { should validate_acceptance_of :#{attribute} }\n"
48
+ final_text << " it { should validate_acceptance_of :#{attribute} }\n"
41
49
  end
42
50
  elsif validator.kind == :confirmation
43
51
  validator.attributes.each do |attribute|
44
- final_text << "\tit { should validate_confirmation_of :#{attribute} }\n"
52
+ final_text << " it { should validate_confirmation_of :#{attribute} }\n"
53
+ end
54
+ elsif validator.kind == :length
55
+ validator.attributes.each do |attribute|
56
+ final_text << " it { should validate_length_of :#{attribute} }\n"
57
+ end
58
+ elsif validator.kind == :absence
59
+ validator.attributes.each do |attribute|
60
+ final_text << " it { should validate_absence_of :#{attribute} }\n"
45
61
  end
46
62
  end
47
63
  end
48
64
 
65
+ if descendant.column_names.present?
66
+ final_text << "\n # Columns\n"
67
+ end
68
+
49
69
  descendant.column_names.each do |column_name|
50
- final_text << "\tit { should have_db_column :#{column_name} }\n"
70
+ final_text << " it { should have_db_column :#{column_name} }\n"
71
+ end
72
+
73
+ if descendant.reflections.keys.present?
74
+ final_text << "\n # Associations\n"
75
+ end
76
+
77
+ descendant.reflections.each_pair do |key, reflection|
78
+ final_text << case reflection.macro
79
+ when :belongs_to then " it { should belong_to(:#{key})#{produce_association_options(reflection)} }\n"
80
+ when :has_one then " it { should have_one(:#{key})#{produce_association_options(reflection)} }\n"
81
+ when :has_many then " it { should have_many(:#{key})#{produce_association_options(reflection)} }\n"
82
+ when :has_and_belongs_to_many then " it { should have_and_belong_to_many(:#{key})#{produce_association_options(reflection)} }\n"
83
+ end
51
84
  end
52
85
 
53
86
  final_text << "end"
54
87
 
55
- if File.exists?(Rails.root.join("spec/models/#{descendant.name.downcase}_spec.rb"))
88
+ if File.exists?(Rails.root.join("spec/models/#{descendant.name.underscore}_spec.rb"))
56
89
  puts '#'*100
57
- puts "Please, check whether the following lines are included in: " + descendant.name.downcase + "_spec.rb\n"
90
+ puts "Please, check whether the following lines are included in: " + descendant.name.underscore + "_spec.rb\n"
58
91
  puts '#'*100
59
92
  puts "\n"
60
93
  puts final_text
61
94
  else
95
+ unless Dir.exists? Rails.root.join("spec")
96
+ puts "Generating spec directory"
97
+ Dir.mkdir(Rails.root.join("spec"))
98
+ end
99
+
62
100
  unless Dir.exists? Rails.root.join("spec/models")
63
101
  puts "Generating spec/models directory"
64
102
  Dir.mkdir(Rails.root.join("spec/models"))
65
103
  end
66
104
 
67
- path = "spec/models/#{descendant.name.downcase}_spec.rb"
68
- puts "Creating spec file for #{path}"
105
+ path = "spec/models/#{descendant.name.underscore}_spec.rb"
106
+ puts "Producing model spec file for: #{path}"
69
107
  f = File.open("#{Rails.root.join(path)}", 'wb+')
70
108
  f.write(final_text)
71
109
  f.close
@@ -92,17 +130,17 @@ module SpecProducer
92
130
  final_text << "describe '#{route_group[0]} routes' do\n"
93
131
 
94
132
  route_group[1].each do |route|
95
- final_text << "\tit \"#{route[:verb].upcase} #{route[:path]} should route to '#{route[:controller]}##{route[:action]}'\" do\n"
133
+ final_text << " it \"#{route[:verb].upcase} #{route[:path]} should route to '#{route[:controller]}##{route[:action]}'\" do\n"
96
134
 
97
- final_text << "\t\t{ :#{route[:verb]} => '#{route[:path].gsub(/:[a-zA-Z_]+/){ |param| param.gsub(':','').upcase }}'}.\n"
98
- final_text << "\t\t\tshould route_to(:controller => '#{route[:controller]}',\n"
135
+ final_text << " { :#{route[:verb]} => '#{route[:path].gsub(/:[a-zA-Z_]+/){ |param| param.gsub(':','').upcase }}'}.\n"
136
+ final_text << " should route_to(:controller => '#{route[:controller]}',\n"
99
137
 
100
138
  /:[a-zA-Z_]+/.match(route[:path]).to_a.each do |parameter|
101
- final_text << "\t\t\t\t\t\t\t#{parameter} => '#{parameter.gsub(':','').upcase}',\n"
139
+ final_text << " #{parameter} => '#{parameter.gsub(':','').upcase}',\n"
102
140
  end
103
141
 
104
- final_text << "\t\t\t\t\t:action => '#{route[:action]}')\n"
105
- final_text << "\tend\n\n"
142
+ final_text << " :action => '#{route[:action]}')\n"
143
+ final_text << " end\n\n"
106
144
  end
107
145
 
108
146
  final_text << 'end'
@@ -114,13 +152,35 @@ module SpecProducer
114
152
  puts "\n"
115
153
  puts final_text
116
154
  else
155
+ unless Dir.exists? Rails.root.join("spec")
156
+ puts "Generating spec directory"
157
+ Dir.mkdir(Rails.root.join("spec"))
158
+ end
159
+
117
160
  unless Dir.exists? Rails.root.join("spec/routing")
118
161
  puts "Generating spec/routing directory"
119
162
  Dir.mkdir(Rails.root.join("spec/routing"))
120
163
  end
121
164
 
165
+ # Check whether the route is not in top level namespace but deeper
166
+ full_path = 'spec/routing'
167
+ paths = route_group[0].split('/')
168
+
169
+ # And if it is deeper in the tree make sure to check if the related namespaces exist or create them
170
+ if paths.size > 1
171
+ paths.each do |path|
172
+ unless path == paths.last
173
+ full_path << "/#{path}"
174
+
175
+ unless Dir.exists? full_path
176
+ Dir.mkdir(Rails.root.join(full_path))
177
+ end
178
+ end
179
+ end
180
+ end
181
+
122
182
  path = "spec/routing/#{route_group[0]}_routing_spec.rb"
123
- puts "Creating spec file for #{route_group[0]}"
183
+ puts "Producing routing spec file for: #{route_group[0]}"
124
184
  f = File.open("#{Rails.root.join(path)}", 'wb+')
125
185
  f.write(final_text)
126
186
  f.close
@@ -148,13 +208,19 @@ module SpecProducer
148
208
  file_name = "#{file.gsub('app/', 'spec/')}_spec.rb"
149
209
  final_text = "require 'rails_helper'\n\n"
150
210
  final_text << "describe '#{file.gsub('app/views/', '')}' do\n"
151
- final_text << "\tbefore do\n"
152
- final_text << "\t\trender\n"
153
- final_text << "\tend\n\n"
154
- final_text << "\tpending 'view content test'\n"
211
+ final_text << " before do\n"
212
+ final_text << " render\n"
213
+ final_text << " end\n\n"
214
+ final_text << " pending 'view content test'\n"
155
215
  final_text << "end\n"
156
216
 
217
+ unless Dir.exists? Rails.root.join("spec")
218
+ puts "Generating spec directory"
219
+ Dir.mkdir(Rails.root.join("spec"))
220
+ end
221
+
157
222
  unless FileTest.exists?(file_name)
223
+ puts "Producing view spec file for: #{file_name}"
158
224
  f = File.open(file_name, 'wb+')
159
225
  f.write(final_text)
160
226
  f.close
@@ -182,10 +248,16 @@ module SpecProducer
182
248
  file_name = "#{file.gsub('app/', 'spec/').gsub('.rb', '')}_spec.rb"
183
249
  final_text = "require 'rails_helper'\n\n"
184
250
  final_text << "describe #{File.basename(file, ".rb").camelcase} do\n"
185
- final_text << "\tpending 'view helper tests'\n"
251
+ final_text << " pending 'view helper tests'\n"
186
252
  final_text << "end"
187
253
 
254
+ unless Dir.exists? Rails.root.join("spec")
255
+ puts "Generating spec directory"
256
+ Dir.mkdir(Rails.root.join("spec"))
257
+ end
258
+
188
259
  unless FileTest.exists?(file_name)
260
+ puts "Producing helper spec file for: #{file_name}"
189
261
  f = File.open(file_name, 'wb+')
190
262
  f.write(final_text)
191
263
  f.close
@@ -196,7 +268,7 @@ module SpecProducer
196
268
  end
197
269
 
198
270
  def self.produce_specs_for_controllers
199
- Dir.glob(Rails.root.join('app/controllers/*.rb')).each do |x|
271
+ Dir.glob(Rails.root.join('app/controllers/**/*.rb')).each do |x|
200
272
  require x
201
273
  end
202
274
 
@@ -222,16 +294,22 @@ module SpecProducer
222
294
  final_text << "describe #{descendant.name} do\n"
223
295
 
224
296
  descendant.action_methods.each do |method|
225
- final_text << "\tpending '##{method}'\n"
297
+ final_text << " pending '##{method}'\n"
226
298
  end
227
299
 
228
300
  unless descendant.action_methods.size > 0
229
- final_text << "\tpending 'tests'\n"
301
+ final_text << " pending 'tests'\n"
230
302
  end
231
303
 
232
304
  final_text << "end\n"
233
305
 
306
+ unless Dir.exists? Rails.root.join("spec")
307
+ puts "Generating spec directory"
308
+ Dir.mkdir(Rails.root.join("spec"))
309
+ end
310
+
234
311
  unless FileTest.exists?(file_name)
312
+ puts "Producing controller spec file for: #{file_name}"
235
313
  f = File.open(file_name, 'wb+')
236
314
  f.write(final_text)
237
315
  f.close
@@ -299,4 +377,28 @@ module SpecProducer
299
377
 
300
378
  nil
301
379
  end
380
+
381
+ #######
382
+ private
383
+ #######
384
+
385
+ def self.produce_association_options(reflection)
386
+ return if reflection.options.empty?
387
+
388
+ final_text = []
389
+
390
+ reflection.options.each_pair do |key, value|
391
+ final_text << case key
392
+ when :inverse_of then "inverse_of(:#{value})"
393
+ when :autosave then "autosave(#{value})"
394
+ when :through then "through(:#{value})"
395
+ when :class_name then "class_name('#{value}')"
396
+ when :foreign_key then "with_foreign_key('#{value}')"
397
+ when :primary_key then "with_primary_key('#{value}')"
398
+ when :source then "source(:#{value})"
399
+ when :dependent then "dependent(:#{value})"
400
+ end
401
+ end
402
+ final_text.reject(&:nil?).join('.').prepend('.')
403
+ end
302
404
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spec_producer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vasilis Kalligas
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-12 00:00:00.000000000 Z
11
+ date: 2016-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler