generator-spec 0.3.3
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/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.markdown +144 -0
- data/Rakefile +48 -0
- data/VERSION +1 -0
- data/generator-spec.gemspec +106 -0
- data/lib/generators/demo/demo_generator.rb +91 -0
- data/lib/rspec_for_generators.rb +11 -0
- data/lib/rspec_for_generators/fixtures/routes.rb +2 -0
- data/lib/rspec_for_generators/generator_spec_helper.rb +95 -0
- data/lib/rspec_for_generators/main.rb +18 -0
- data/lib/rspec_for_generators/matchers/content/have_block.rb +47 -0
- data/lib/rspec_for_generators/matchers/content/have_call.rb +42 -0
- data/lib/rspec_for_generators/matchers/content/have_class.rb +32 -0
- data/lib/rspec_for_generators/matchers/content/have_method.rb +41 -0
- data/lib/rspec_for_generators/matchers/content/have_module.rb +32 -0
- data/lib/rspec_for_generators/matchers/content/include_module.rb +32 -0
- data/lib/rspec_for_generators/matchers/content/inherit_from.rb +31 -0
- data/lib/rspec_for_generators/matchers/file/generate_directory.rb +71 -0
- data/lib/rspec_for_generators/matchers/file/generate_file.rb +71 -0
- data/lib/rspec_for_generators/matchers/file/generate_migration.rb +50 -0
- data/lib/rspec_for_generators/matchers/helpers/content.rb +18 -0
- data/lib/rspec_for_generators/matchers/helpers/file.rb +26 -0
- data/lib/rspec_for_generators/matchers/helpers/migration.rb +102 -0
- data/lib/rspec_for_generators/matchers/migration/have_column.rb +13 -0
- data/lib/rspec_for_generators/matchers/migration/have_index.rb +9 -0
- data/lib/rspec_for_generators/matchers/migration/have_migration.rb +5 -0
- data/lib/rspec_for_generators/matchers/migration/have_table.rb +18 -0
- data/lib/rspec_for_generators/matchers/migration/have_tbl_column.rb +25 -0
- data/lib/rspec_for_generators/matchers/migration/have_up_down.rb +13 -0
- data/lib/rspec_for_generators/rails_helpers/all.rb +6 -0
- data/lib/rspec_for_generators/rails_helpers/rails_app.rb +53 -0
- data/lib/rspec_for_generators/rails_helpers/rails_controller.rb +36 -0
- data/lib/rspec_for_generators/rails_helpers/rails_helper.rb +36 -0
- data/lib/rspec_for_generators/rails_helpers/rails_mailer.rb +29 -0
- data/lib/rspec_for_generators/rails_helpers/rails_model.rb +27 -0
- data/lib/rspec_for_generators/rails_helpers/rails_orm.rb +77 -0
- data/lib/rspec_for_generators/rails_helpers/rails_view.rb +29 -0
- data/lib/rspec_for_generators/rails_spec_helper.rb +35 -0
- data/lib/rspec_for_generators/rspec_test_case.rb +26 -0
- data/rspec_for_generators.gemspec +96 -0
- data/spec/rspec_for_generators/rspec_for_generators_spec.rb +41 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +6 -0
- data/wiki/Custom Rails 3 Generators.textile +110 -0
- data/wiki/rails_view_helpers.textile +167 -0
- metadata +205 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
# Asserts a given file exists. You need to supply an absolute path or a path relative
|
2
|
+
# to the configured destination:
|
3
|
+
#
|
4
|
+
# generator.should have_generated_file "app/controller/products_controller.rb"
|
5
|
+
#
|
6
|
+
|
7
|
+
module RSpec::FileMatchers
|
8
|
+
class GenerateFile
|
9
|
+
|
10
|
+
def initialize(relative_path, type = nil)
|
11
|
+
@relative_path = relative_rails_file relative_path, type
|
12
|
+
end
|
13
|
+
|
14
|
+
def matches?(generator, &block)
|
15
|
+
@expected = File.expand_path(@relative_path, generator.class.destination_root)
|
16
|
+
ex = File.exists?(@expected)
|
17
|
+
if block && ex
|
18
|
+
read = File.read(@expected)
|
19
|
+
ruby_content = read.extend(RSpec::RubyContent::Helpers)
|
20
|
+
yield ruby_content
|
21
|
+
else
|
22
|
+
ex
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def failure_message
|
27
|
+
"Expected file #{@relative_path} to have been generated, but it was not"
|
28
|
+
end
|
29
|
+
|
30
|
+
def negative_failure_message
|
31
|
+
"Did not expected file #{@relative_path} to have been generated, but it was"
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
def relative_rails_file path, type = nil
|
37
|
+
return File.join(::Rails.root, base_dir(type), folder(type), "#{path.to_s}.rb") if type
|
38
|
+
File.join(::Rails.root, path)
|
39
|
+
end
|
40
|
+
|
41
|
+
def folder type
|
42
|
+
case type
|
43
|
+
when :observer
|
44
|
+
'models'
|
45
|
+
else
|
46
|
+
type.to_s.pluralize
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def base_dir type
|
51
|
+
case type
|
52
|
+
when :model, :controller, :view, :helper, :observer
|
53
|
+
'app'
|
54
|
+
when :migration
|
55
|
+
'db'
|
56
|
+
when :javascript, :stylesheet
|
57
|
+
'public'
|
58
|
+
when :initializer, :locale
|
59
|
+
'config'
|
60
|
+
else
|
61
|
+
''
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def generate_file(relative, type = nil)
|
67
|
+
GenerateFile.new(relative, type)
|
68
|
+
end
|
69
|
+
alias_method :generate_directory, :generate_file
|
70
|
+
end
|
71
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# This method manipulates the given path and tries to find any migration which
|
2
|
+
# matches the migration name. For example, the call above is converted to:
|
3
|
+
#
|
4
|
+
# generator.should generate_migration "db/migrate/003_create_products.rb"
|
5
|
+
#
|
6
|
+
# Consequently it accepts the same arguments as the matcher have_file.
|
7
|
+
|
8
|
+
module RSpec
|
9
|
+
module FileMatchers
|
10
|
+
class GenerateMigration
|
11
|
+
|
12
|
+
def initialize(relative)
|
13
|
+
@relative = relative
|
14
|
+
end
|
15
|
+
|
16
|
+
def matches?(generator)
|
17
|
+
ex = migration_file_name(relative, generator)
|
18
|
+
if block && ex
|
19
|
+
read = File.read(@expected)
|
20
|
+
ruby_content = read.extend(RSpec::RubyContent::Helpers)
|
21
|
+
yield ruby_content
|
22
|
+
else
|
23
|
+
ex
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def failure_message
|
28
|
+
"Expected migration #{relative} to have been generated, but it was not"
|
29
|
+
end
|
30
|
+
|
31
|
+
def negative_failure_message
|
32
|
+
"Did not expect migration #{relative} to have been generated, but it was"
|
33
|
+
end
|
34
|
+
|
35
|
+
protected
|
36
|
+
|
37
|
+
def migration_file_name(relative, generator) #:nodoc:
|
38
|
+
absolute = File.expand_path(relative, generator.class.destination_root)
|
39
|
+
dirname, file_name = File.dirname(absolute), File.basename(absolute).sub(/\.rb$/, '')
|
40
|
+
Dir.glob("#{dirname}/[0-9]*_*.rb").grep(/\d+_#{file_name}.rb$/).first
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
def generate_migration(relative)
|
46
|
+
GenerateMigration.new(relative)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module RSpec::RubyContent
|
2
|
+
module Helpers
|
3
|
+
def check_matchings matchings
|
4
|
+
matchings.each do |matching|
|
5
|
+
self.should match /#{Regexp.escape(matching)}/
|
6
|
+
end
|
7
|
+
end
|
8
|
+
alias_method :matchings, :check_matchings
|
9
|
+
|
10
|
+
|
11
|
+
def check_methods methods, type=nil
|
12
|
+
methods.each do |method_name|
|
13
|
+
self.should have_method(method_name, type)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
alias_method :methods, :check_methods
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module RSpec::Generator
|
2
|
+
module Helpers
|
3
|
+
def check_file file_name, type=nil, &block
|
4
|
+
self.should generate_file(file_name, type, &block)
|
5
|
+
end
|
6
|
+
alias_method :file, :check_file
|
7
|
+
|
8
|
+
def check_view(file_name, matchings)
|
9
|
+
self.should generate_file(file_name, :view) do |content|
|
10
|
+
check_matchings matchings
|
11
|
+
end
|
12
|
+
end
|
13
|
+
alias_method :view, :check_view
|
14
|
+
|
15
|
+
def check_model(file_name, clazz, options = {})
|
16
|
+
self.should generate_file("#{file_name.underscore}.rb", :model) do |file_content|
|
17
|
+
file_content.should have_class clazz do |content|
|
18
|
+
check_matchings options[:matchings]
|
19
|
+
check_methods(options[:methods])
|
20
|
+
check_class_methods(options[:class_methods])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
alias_method :model, :check_model
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module RSpec::Generator
|
2
|
+
module Helpers
|
3
|
+
def check_migration(file_name, &block)
|
4
|
+
self.should generate_file(file_name, :migration) do |content|
|
5
|
+
yield content if block
|
6
|
+
end
|
7
|
+
end
|
8
|
+
alias_method :migration, :check_migration
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module RSpec::RubyContent
|
13
|
+
module Helpers
|
14
|
+
def check_up(&block)
|
15
|
+
self.should have_method('up', :class) do |content|
|
16
|
+
yield content if block
|
17
|
+
end
|
18
|
+
end
|
19
|
+
alias_method :up, :check_up
|
20
|
+
|
21
|
+
def check_down(&block)
|
22
|
+
self.should have_method('down', :class) do |content|
|
23
|
+
yield content if block
|
24
|
+
end
|
25
|
+
end
|
26
|
+
alias_method :down, :check_down
|
27
|
+
|
28
|
+
def check_create_table(name, &block)
|
29
|
+
self.should match /create_table\s+:#{name}\s+(.*)end/m
|
30
|
+
if block_given?
|
31
|
+
ruby_content = $2.strip.extend(RSpec::RubyContent::Helpers)
|
32
|
+
yield ruby_content
|
33
|
+
end
|
34
|
+
end
|
35
|
+
alias_method :creates_table, :check_create_table
|
36
|
+
|
37
|
+
def check_change_table(name, &block)
|
38
|
+
self.should match /change_table\s+:#{name}\s+(.*)end/m
|
39
|
+
if block_given?
|
40
|
+
ruby_content = $2.strip.extend(RSpec::RubyContent::Helpers)
|
41
|
+
yield ruby_content
|
42
|
+
end
|
43
|
+
end
|
44
|
+
alias_method :changes_table, :check_change_table
|
45
|
+
|
46
|
+
def check_drop_table name
|
47
|
+
self.should match /drop_table\s+:#{name}/
|
48
|
+
end
|
49
|
+
alias_method :drops_table, :check_drop_table
|
50
|
+
|
51
|
+
def check_rename_table name
|
52
|
+
self.should match /rename_table\s+:#{name}/
|
53
|
+
end
|
54
|
+
alias_method :renames_table, :check_rename_table
|
55
|
+
|
56
|
+
def check_remove_column name
|
57
|
+
self.should match /t.remove\s+:#{name}/
|
58
|
+
end
|
59
|
+
alias_method :removes_column, :check_remove_column
|
60
|
+
|
61
|
+
def check_add_column name, type='string'
|
62
|
+
self.should match /t.#{type}\s+:#{name}/
|
63
|
+
end
|
64
|
+
alias_method :adds_column, :check_add_column
|
65
|
+
|
66
|
+
def check_change_column name, type='string'
|
67
|
+
self.should match /t.change\s+:#{name}\s*,\s*:#{type}/
|
68
|
+
end
|
69
|
+
alias_method :changes_column, :check_change_column
|
70
|
+
|
71
|
+
def check_add_tbl_column tbl_name, name, type='string'
|
72
|
+
self.should match /add_column\s+:#{tbl_name}\s*,\s*:#{name},#{type}/
|
73
|
+
end
|
74
|
+
alias_method :adds_tbl_column, :check_add_tbl_column
|
75
|
+
|
76
|
+
def check_change_tbl_column tbl_name, name, type='string'
|
77
|
+
self.should match /change_column\s+:#{tbl_name}\s*,\s*:#{name}\s*,\s*#{type}/
|
78
|
+
end
|
79
|
+
alias_method :changes_tbl_column, :check_change_tbl_column
|
80
|
+
|
81
|
+
def check_rename_tbl_column tbl_name, new_name
|
82
|
+
self.should match /rename_column\s+:#{tbl_name}\s*,\s*:#{new_name}/
|
83
|
+
end
|
84
|
+
alias_method :renames_tbl_column, :check_rename_tbl_column
|
85
|
+
|
86
|
+
def check_remove_tbl_column tbl_name, name
|
87
|
+
self.should match /remove_column\s+:#{tbl_name}\s*,\s*:#{name}/
|
88
|
+
end
|
89
|
+
alias_method :removes_tbl_column, :check_remove_tbl_column
|
90
|
+
|
91
|
+
def check_add_tbl_index tbl_name, name
|
92
|
+
self.should match /add_index\s+:#{tbl_name}\s*,\s*:#{name}/
|
93
|
+
end
|
94
|
+
alias_method :adds_tbl_index, :check_add_tbl_index
|
95
|
+
|
96
|
+
def check_remove_tbl_index tbl_name, name
|
97
|
+
self.should match /remove_index\s+:#{tbl_name}\s*,\s*:#{name}/
|
98
|
+
end
|
99
|
+
alias_method :removes_tbl_index, :check_remove_tbl_index
|
100
|
+
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module RSpec::RubyContentMatchers
|
2
|
+
def have_remove_column(name)
|
3
|
+
HaveCall.new('t.remove', ":#{name}")
|
4
|
+
end
|
5
|
+
|
6
|
+
def have_add_column(name, type='string')
|
7
|
+
HaveCall.new("t.#{type}", ":#{name}")
|
8
|
+
end
|
9
|
+
|
10
|
+
def have_change_column(name, type='string')
|
11
|
+
HaveCall.new("t.change", ":#{name}\s*,\s*:#{type}")
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module RSpec::RubyContentMatchers
|
2
|
+
def have_create_table(name)
|
3
|
+
HaveBlock.new('create_table', :args => ":#{name}")
|
4
|
+
end
|
5
|
+
|
6
|
+
def have_change_table(name)
|
7
|
+
HaveBlock.new('change_table', :args => ":#{name}")
|
8
|
+
end
|
9
|
+
|
10
|
+
def have_drop_table(name)
|
11
|
+
HaveCall.new('drop_table', ":#{name}")
|
12
|
+
end
|
13
|
+
|
14
|
+
def have_rename_table(name)
|
15
|
+
HaveCall.new('rename_table', ":#{name}")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module RSpec::RubyContentMatchers
|
2
|
+
def have_remove_tbl_column(tbl_name, col_name)
|
3
|
+
HaveCall.new('remove_column', ":#{tbl_name}\s*,\s*:#{col_name}")
|
4
|
+
end
|
5
|
+
|
6
|
+
def have_rename_tbl_column(tbl_name, new_name)
|
7
|
+
HaveCall.new('rename_column', ":#{tbl_name}\s*,\s*:#{new_name}")
|
8
|
+
end
|
9
|
+
|
10
|
+
def have_add_tbl_column(tbl_name, col_name, type = 'string')
|
11
|
+
HaveCall.new('add_column', ":#{tbl_name}\s*,\s*:#{col_name}\s*,\s*:#{type}")
|
12
|
+
end
|
13
|
+
|
14
|
+
def have_change_tbl_column tbl_name, col_name, type='string'
|
15
|
+
HaveCall.new('change_column', ":#{tbl_name}\s*,\s*:#{col_name}\s*,\s*:#{type}")
|
16
|
+
end
|
17
|
+
|
18
|
+
def have_add_column(name, type='string')
|
19
|
+
HaveCall.new("t.#{type}", ":#{name}")
|
20
|
+
end
|
21
|
+
|
22
|
+
def have_change_column(name, type='string')
|
23
|
+
HaveCall.new("t.change", ":#{name}\s*,\s*:#{type}")
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
require 'rspec_for_generators/rails_helpers/rails_app'
|
2
|
+
require 'rspec_for_generators/rails_helpers/rails_orm'
|
3
|
+
require 'rspec_for_generators/rails_helpers/rails_controller'
|
4
|
+
require 'rspec_for_generators/rails_helpers/rails_helper'
|
5
|
+
require 'rspec_for_generators/rails_helpers/rails_view'
|
6
|
+
require 'rspec_for_generators/rails_helpers/rails_mailer'
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module RSpec::Rails
|
2
|
+
module App
|
3
|
+
def self.debug!
|
4
|
+
self.extend(Debug)
|
5
|
+
end
|
6
|
+
|
7
|
+
module Debug
|
8
|
+
def rails_files
|
9
|
+
FileList["#{::Rails.root}/**/*.rb"]
|
10
|
+
end
|
11
|
+
|
12
|
+
def rails_app_files
|
13
|
+
FileList["#{::Rails.root}/app/**/*.rb"]
|
14
|
+
end
|
15
|
+
|
16
|
+
def rails_model_files
|
17
|
+
FileList["#{::Rails.root}/app/models/**/*.rb"]
|
18
|
+
end
|
19
|
+
|
20
|
+
def rails_controller_files
|
21
|
+
FileList["#{::Rails.root}/app/controllers/**/*.rb"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def rails_helper_files
|
25
|
+
FileList["#{::Rails.root}/app/helpers/**/*.rb"]
|
26
|
+
end
|
27
|
+
|
28
|
+
def rails_view_files
|
29
|
+
FileList["#{::Rails.root}/app/views/**/*.yml"]
|
30
|
+
end
|
31
|
+
|
32
|
+
def rails_initializer_files
|
33
|
+
FileList["#{::Rails.root}/config/initializers/**/*.rb"]
|
34
|
+
end
|
35
|
+
|
36
|
+
def rails_migration_files
|
37
|
+
FileList["#{::Rails.root}/db/migration/**/*.rb"]
|
38
|
+
end
|
39
|
+
|
40
|
+
def rails_locale_files
|
41
|
+
FileList["#{::Rails.root}/config/locales/**/*.yml"]
|
42
|
+
end
|
43
|
+
|
44
|
+
def rails_javascript_files
|
45
|
+
FileList["#{::Rails.root}/public/javascripts/**/*.yml"]
|
46
|
+
end
|
47
|
+
|
48
|
+
def rails_stylesheet_files
|
49
|
+
FileList["#{::Rails.root}/public/stylesheets/**/*.yml"]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Rails
|
3
|
+
module Controller
|
4
|
+
def create_controller name, content=nil
|
5
|
+
file = controller_file_name(name)
|
6
|
+
unless File.exist?(file)
|
7
|
+
FileUtils.mkdir_p File.dirname(file)
|
8
|
+
content ||= yield if block_given?
|
9
|
+
File.open(file, 'w') do |f|
|
10
|
+
f.puts controller_content(content)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def controller_content name, content=nil
|
16
|
+
%Q{class #{name.to_s.camelize}Controller < ActionController::Base
|
17
|
+
#{content}
|
18
|
+
end}
|
19
|
+
end
|
20
|
+
|
21
|
+
def remove_controller name
|
22
|
+
file = controller_file_name(name)
|
23
|
+
FileUtils.rm_f(file) if File.exist?(file)
|
24
|
+
end
|
25
|
+
|
26
|
+
def remove_controllers *names
|
27
|
+
names.each{|name| remove_controller name }
|
28
|
+
end
|
29
|
+
|
30
|
+
def controller_file_name name
|
31
|
+
File.join(::Rails.root, "app/controllers/#{name}.rb")
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|