zapata 0.0.1

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.
Files changed (132) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +3 -0
  4. data/CONTRIBUTING.md +5 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +22 -0
  7. data/README.md +152 -0
  8. data/Rakefile +2 -0
  9. data/bin/zapata +20 -0
  10. data/lib/zapata.rb +91 -0
  11. data/lib/zapata/analyst.rb +34 -0
  12. data/lib/zapata/core/collector.rb +9 -0
  13. data/lib/zapata/core/loader.rb +38 -0
  14. data/lib/zapata/core/reader.rb +10 -0
  15. data/lib/zapata/core/writer.rb +33 -0
  16. data/lib/zapata/db.rb +32 -0
  17. data/lib/zapata/diver.rb +81 -0
  18. data/lib/zapata/predictor/args.rb +94 -0
  19. data/lib/zapata/predictor/chooser.rb +27 -0
  20. data/lib/zapata/primitive/arg.rb +24 -0
  21. data/lib/zapata/primitive/array.rb +39 -0
  22. data/lib/zapata/primitive/base.rb +28 -0
  23. data/lib/zapata/primitive/basic.rb +22 -0
  24. data/lib/zapata/primitive/casgn.rb +15 -0
  25. data/lib/zapata/primitive/const.rb +15 -0
  26. data/lib/zapata/primitive/def.rb +33 -0
  27. data/lib/zapata/primitive/defs.rb +32 -0
  28. data/lib/zapata/primitive/hash.rb +31 -0
  29. data/lib/zapata/primitive/ivar.rb +6 -0
  30. data/lib/zapata/primitive/klass.rb +34 -0
  31. data/lib/zapata/primitive/lvar.rb +24 -0
  32. data/lib/zapata/primitive/missing.rb +17 -0
  33. data/lib/zapata/primitive/modul.rb +20 -0
  34. data/lib/zapata/primitive/nil.rb +16 -0
  35. data/lib/zapata/primitive/optarg.rb +18 -0
  36. data/lib/zapata/primitive/raw.rb +16 -0
  37. data/lib/zapata/primitive/send.rb +48 -0
  38. data/lib/zapata/primitive/sklass.rb +20 -0
  39. data/lib/zapata/primitive/var.rb +25 -0
  40. data/lib/zapata/printer.rb +93 -0
  41. data/lib/zapata/rzpec/runner.rb +67 -0
  42. data/lib/zapata/rzpec/writer.rb +115 -0
  43. data/lib/zapata/version.rb +3 -0
  44. data/spec/array_spec.rb +37 -0
  45. data/spec/definition_spec.rb +43 -0
  46. data/spec/hash_spec.rb +43 -0
  47. data/spec/klass_types_spec.rb +55 -0
  48. data/spec/send_spec.rb +31 -0
  49. data/spec/simple_types_spec.rb +90 -0
  50. data/spec/spec_helper.rb +124 -0
  51. data/spec/support/rails_test_app/.gitignore +16 -0
  52. data/spec/support/rails_test_app/.rspec +3 -0
  53. data/spec/support/rails_test_app/Gemfile +45 -0
  54. data/spec/support/rails_test_app/Gemfile.lock +200 -0
  55. data/spec/support/rails_test_app/README.md +3 -0
  56. data/spec/support/rails_test_app/Rakefile +6 -0
  57. data/spec/support/rails_test_app/app/assets/images/.keep +0 -0
  58. data/spec/support/rails_test_app/app/assets/javascripts/application.js +16 -0
  59. data/spec/support/rails_test_app/app/assets/stylesheets/application.css +15 -0
  60. data/spec/support/rails_test_app/app/controllers/application_controller.rb +5 -0
  61. data/spec/support/rails_test_app/app/controllers/concerns/.keep +0 -0
  62. data/spec/support/rails_test_app/app/helpers/application_helper.rb +2 -0
  63. data/spec/support/rails_test_app/app/mailers/.keep +0 -0
  64. data/spec/support/rails_test_app/app/models/.keep +0 -0
  65. data/spec/support/rails_test_app/app/models/concerns/.keep +0 -0
  66. data/spec/support/rails_test_app/app/models/robot_to_test.rb +49 -0
  67. data/spec/support/rails_test_app/app/models/test_array.rb +34 -0
  68. data/spec/support/rails_test_app/app/models/test_const.rb +14 -0
  69. data/spec/support/rails_test_app/app/models/test_definition.rb +38 -0
  70. data/spec/support/rails_test_app/app/models/test_float.rb +14 -0
  71. data/spec/support/rails_test_app/app/models/test_hash.rb +39 -0
  72. data/spec/support/rails_test_app/app/models/test_int.rb +14 -0
  73. data/spec/support/rails_test_app/app/models/test_send.rb +75 -0
  74. data/spec/support/rails_test_app/app/models/test_str.rb +14 -0
  75. data/spec/support/rails_test_app/app/models/test_sym.rb +14 -0
  76. data/spec/support/rails_test_app/app/models/testing_module/bare.rb +6 -0
  77. data/spec/support/rails_test_app/app/models/testing_module/klass_methods.rb +47 -0
  78. data/spec/support/rails_test_app/app/models/testing_module/nested/inside.rb +8 -0
  79. data/spec/support/rails_test_app/app/views/layouts/application.html.erb +14 -0
  80. data/spec/support/rails_test_app/config.ru +4 -0
  81. data/spec/support/rails_test_app/config/application.rb +23 -0
  82. data/spec/support/rails_test_app/config/boot.rb +4 -0
  83. data/spec/support/rails_test_app/config/database.yml +25 -0
  84. data/spec/support/rails_test_app/config/environment.rb +5 -0
  85. data/spec/support/rails_test_app/config/environments/development.rb +37 -0
  86. data/spec/support/rails_test_app/config/environments/production.rb +83 -0
  87. data/spec/support/rails_test_app/config/environments/test.rb +39 -0
  88. data/spec/support/rails_test_app/config/initializers/backtrace_silencers.rb +7 -0
  89. data/spec/support/rails_test_app/config/initializers/cookies_serializer.rb +3 -0
  90. data/spec/support/rails_test_app/config/initializers/filter_parameter_logging.rb +4 -0
  91. data/spec/support/rails_test_app/config/initializers/inflections.rb +16 -0
  92. data/spec/support/rails_test_app/config/initializers/mime_types.rb +4 -0
  93. data/spec/support/rails_test_app/config/initializers/session_store.rb +3 -0
  94. data/spec/support/rails_test_app/config/initializers/wrap_parameters.rb +14 -0
  95. data/spec/support/rails_test_app/config/locales/en.yml +23 -0
  96. data/spec/support/rails_test_app/config/routes.rb +56 -0
  97. data/spec/support/rails_test_app/config/secrets.yml +22 -0
  98. data/spec/support/rails_test_app/db/seeds.rb +7 -0
  99. data/spec/support/rails_test_app/lib/assets/.keep +0 -0
  100. data/spec/support/rails_test_app/lib/tasks/.keep +0 -0
  101. data/spec/support/rails_test_app/log/.keep +0 -0
  102. data/spec/support/rails_test_app/public/404.html +67 -0
  103. data/spec/support/rails_test_app/public/422.html +67 -0
  104. data/spec/support/rails_test_app/public/500.html +66 -0
  105. data/spec/support/rails_test_app/public/favicon.ico +0 -0
  106. data/spec/support/rails_test_app/public/robots.txt +5 -0
  107. data/spec/support/rails_test_app/spec/models/robot_to_test_spec.rb +33 -0
  108. data/spec/support/rails_test_app/spec/models/test_array_spec.rb +27 -0
  109. data/spec/support/rails_test_app/spec/models/test_const_spec.rb +11 -0
  110. data/spec/support/rails_test_app/spec/models/test_definition_spec.rb +31 -0
  111. data/spec/support/rails_test_app/spec/models/test_float_spec.rb +11 -0
  112. data/spec/support/rails_test_app/spec/models/test_hash_spec.rb +31 -0
  113. data/spec/support/rails_test_app/spec/models/test_int_spec.rb +11 -0
  114. data/spec/support/rails_test_app/spec/models/test_send_spec.rb +53 -0
  115. data/spec/support/rails_test_app/spec/models/test_str_spec.rb +11 -0
  116. data/spec/support/rails_test_app/spec/models/test_sym_spec.rb +11 -0
  117. data/spec/support/rails_test_app/spec/models/testing_module/bare_spec.rb +7 -0
  118. data/spec/support/rails_test_app/spec/models/testing_module/klass_methods_spec.rb +19 -0
  119. data/spec/support/rails_test_app/spec/models/testing_module/nested/inside_spec.rb +7 -0
  120. data/spec/support/rails_test_app/spec/rails_helper.rb +43 -0
  121. data/spec/support/rails_test_app/spec/spec_helper.rb +78 -0
  122. data/spec/support/rails_test_app/test/controllers/.keep +0 -0
  123. data/spec/support/rails_test_app/test/fixtures/.keep +0 -0
  124. data/spec/support/rails_test_app/test/helpers/.keep +0 -0
  125. data/spec/support/rails_test_app/test/integration/.keep +0 -0
  126. data/spec/support/rails_test_app/test/mailers/.keep +0 -0
  127. data/spec/support/rails_test_app/test/models/.keep +0 -0
  128. data/spec/support/rails_test_app/test/test_helper.rb +13 -0
  129. data/spec/support/rails_test_app/vendor/assets/javascripts/.keep +0 -0
  130. data/spec/support/rails_test_app/vendor/assets/stylesheets/.keep +0 -0
  131. data/zapata.gemspec +34 -0
  132. metadata +446 -0
@@ -0,0 +1,115 @@
1
+ module Zapata
2
+ module RZpec
3
+ class Writer
4
+ class << self
5
+ attr_accessor :ivars
6
+
7
+ def reset_ivars
8
+ @ivars = []
9
+ end
10
+ end
11
+
12
+ def initialize(file, code, subject_analysis, whole_analysis, spec_analysis = nil)
13
+ self.class.reset_ivars
14
+ @subject_analysis = subject_analysis
15
+ @whole_analysis = whole_analysis
16
+ @spec_analysis = spec_analysis
17
+ @writer = Core::Writer.new(file)
18
+ @result = {}
19
+
20
+ write_require
21
+
22
+ klasses.each do |klass|
23
+ write_class(klass)
24
+ end
25
+
26
+ self.class.reset_ivars
27
+ end
28
+
29
+ def write_require
30
+ @writer.append_line("require '#{Core::Loader.helper_name}'")
31
+ end
32
+
33
+ def klasses
34
+ @subject_analysis.select { |obj| obj.is_a?(Primitive::Klass) }
35
+ end
36
+
37
+ def klass_defs(klass)
38
+ @subject_analysis.select do |method|
39
+ [Primitive::Def, Primitive::Defs].include?(method.class) and
40
+ method.public? and method.klass.name == klass.name
41
+ end
42
+ end
43
+
44
+ def initialize_def(klass)
45
+ klass_defs(klass).detect { |method| method.name == :initialize }
46
+ end
47
+
48
+ def write_class(klass)
49
+ @writer.append_line
50
+ @writer.append_line("describe #{klass.name} do")
51
+
52
+ write_instance_let(klass)
53
+
54
+ klass_defs(klass).each do |primitive_def|
55
+ write_method(primitive_def)
56
+ end
57
+
58
+ self.class.ivars.each do |ivar|
59
+ predicted_value = Predictor::Args.choose_value(ivar.value, ivar)
60
+ literal_predicted_value = Printer.print(predicted_value.to_raw)
61
+ write_let(ivar.value, literal_predicted_value)
62
+ end
63
+
64
+ @writer.append_line('end')
65
+ end
66
+
67
+ def write_instance_let(klass)
68
+ if initialize_def = initialize_def(klass)
69
+ write_let_from_initialize(initialize_def)
70
+ else
71
+ write_let(klass.name, "#{klass.name}.new")
72
+ end
73
+ end
74
+
75
+ def write_let(name, block)
76
+ @writer.append_line("let(:#{Printer.to_var_name(name)}) do")
77
+ @writer.append_line(block)
78
+ @writer.append_line('end')
79
+ end
80
+
81
+ def write_let_from_initialize(initialize_def)
82
+ block = "#{initialize_def.klass.name}.new#{initialize_def.literal_predicted_args}"
83
+ write_let(initialize_def.klass.name, block)
84
+ end
85
+
86
+ def write_method(primitive_def)
87
+ return unless primitive_def.node.body
88
+ return if primitive_def.name == :initialize
89
+
90
+ @writer.append_line
91
+ @writer.append_line("it '##{primitive_def.name}' do")
92
+
93
+ receiver = if primitive_def.self?
94
+ primitive_def.klass.name
95
+ else
96
+ Printer.to_var_name(primitive_def.klass.name)
97
+ end
98
+
99
+ @writer.append_line(
100
+ "expect(#{receiver}.#{primitive_def.name}#{primitive_def.literal_predicted_args}).to eq(#{write_equal(primitive_def.name)})"
101
+ )
102
+
103
+ @writer.append_line('end')
104
+ end
105
+
106
+ def write_equal(method_name)
107
+ if @spec_analysis
108
+ Printer.print(Primitive::Raw.new(:literal, @spec_analysis.expected(method_name)))
109
+ else
110
+ Printer.print(Primitive::Raw.new(:str, 'Fill this in by hand'))
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,3 @@
1
+ module Zapata
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Zapata::Revolutionist do
4
+ before(:all) do
5
+ @generated = exec_generation('app/models/test_array.rb')
6
+ end
7
+
8
+ it '#test_in_arg' do
9
+ has_block('#test_in_arg', %Q{
10
+ expect(test_array.test_in_arg([2, 7.1, 8])).to eq([2, 7.1, 8])
11
+ })
12
+ end
13
+
14
+ it '#test_nested_one_level' do
15
+ has_block('#test_nested_one_level', %Q{
16
+ expect(test_array.test_nested_one_level([[2, 7.1, 8], :mexico])).to eq([[2, 7.1, 8], :mexico])
17
+ })
18
+ end
19
+
20
+ it '#test_nested_two_levels' do
21
+ has_block('#test_nested_two_levels', %Q{
22
+ expect(test_array.test_nested_two_levels([[[2, 7.1, 8], :mexico], [2, 7.1, 8], :mexico])).to eq([[[2, 7.1, 8], :mexico], [2, 7.1, 8], :mexico])
23
+ })
24
+ end
25
+
26
+ it '#test_nested_three_levels' do
27
+ has_block('#test_nested_three_levels', %Q{
28
+ expect(test_array.test_nested_three_levels([[[[2, 7.1, 8], :mexico], [2, 7.1, 8], :mexico], [[2, 7.1, 8], :mexico], [2, 7.1, 8], :mexico])).to eq([[[[2, 7.1, 8], :mexico], [2, 7.1, 8], :mexico], [[2, 7.1, 8], :mexico], [2, 7.1, 8], :mexico])
29
+ })
30
+ end
31
+
32
+ it '#test_hash_nested' do
33
+ has_block('#test_hash_nested', %Q{
34
+ expect(test_array.test_hash_nested([{ emiliano: [2, 7.1, 8] }])).to eq([{ emiliano: [2, 7.1, 8] }])
35
+ })
36
+ end
37
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe Zapata::Revolutionist do
4
+ before(:all) do
5
+ @generated = exec_generation('app/models/test_definition.rb')
6
+ end
7
+
8
+ it '#in_optional_args' do
9
+ has_block('#in_optional_args', %Q{
10
+ expect(test_definition.in_optional_args(:audioslave)).to eq(:audioslave)
11
+ })
12
+ end
13
+
14
+ it '#use_optional' do
15
+ has_block('#use_optional', %Q{
16
+ expect(test_definition.use_optional(:audioslave)).to eq(:audioslave)
17
+ })
18
+ end
19
+
20
+ it '#var_in_optional_args' do
21
+ has_block('#var_in_optional_args', %Q{
22
+ expect(test_definition.var_in_optional_args('Chuck')).to eq('Chuck')
23
+ })
24
+ end
25
+
26
+ it '#method_in_optional_args' do
27
+ has_block('#method_in_optional_args', %Q{
28
+ expect(test_definition.method_in_optional_args('I am falling')).to eq('I am falling')
29
+ })
30
+ end
31
+
32
+ it '#call_method_result_in_optional_args' do
33
+ has_block('#call_method_result_in_optional_args', %Q{
34
+ expect(test_definition.call_method_result_in_optional_args('Missing "complex_method"')).to eq('Missing "complex_method"')
35
+ })
36
+ end
37
+
38
+ it '#resursive_method' do
39
+ has_block('#recursive_method', %Q{
40
+ expect(test_definition.recursive_method).to eq('Exception in RSpec')
41
+ })
42
+ end
43
+ end
data/spec/hash_spec.rb ADDED
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe Zapata::Revolutionist do
4
+ before(:all) do
5
+ @generated = exec_generation('app/models/test_hash.rb')
6
+ end
7
+
8
+ it '#test_in_arg' do
9
+ has_block('#test_in_arg', %Q{
10
+ expect(test_hash.test_in_arg({ 1 => :one, TestHash => 2.718 })).to eq({ 1 => :one, TestHash => 2.718 })
11
+ })
12
+ end
13
+
14
+ it '#test_nested_one_level' do
15
+ has_block('#test_nested_one_level', %Q{
16
+ expect(test_hash.test_nested_one_level({ first_level: { 1 => :one, TestHash => 2.718 } })).to eq({ first_level: { 1 => :one, TestHash => 2.718 } })
17
+ })
18
+ end
19
+
20
+ it '#test_nested_two_levels' do
21
+ has_block('#test_nested_two_levels', %Q{
22
+ expect(test_hash.test_nested_two_levels({ second_level: { first_level: { 1 => :one, TestHash => 2.718 } } })).to eq({ second_level: { first_level: { 1 => :one, TestHash => 2.718 } } })
23
+ })
24
+ end
25
+
26
+ it '#test_nested_three_levels' do
27
+ has_block('#test_nested_three_levels', %Q{
28
+ expect(test_hash.test_nested_three_levels({ third_level: { second_level: { first_level: { 1 => :one, TestHash => 2.718 } } } })).to eq({ third_level: { second_level: { first_level: { 1 => :one, TestHash => 2.718 } } } })
29
+ })
30
+ end
31
+
32
+ it '#test_key_as_another_hash' do
33
+ has_block('#test_key_as_another_hash', %Q{
34
+ expect(test_hash.test_key_as_another_hash({ { 1 => :one, TestHash => 2.718 } => :ratm })).to eq({ { 1 => :one, TestHash => 2.718 } => :ratm })
35
+ })
36
+ end
37
+
38
+ it '#test_keys_are_symbols' do
39
+ has_block('#test_keys_are_symbols', %Q{
40
+ expect(test_hash.test_keys_are_symbols({ this: 'should', be: 'pretty' })).to eq({ this: 'should', be: 'pretty' })
41
+ })
42
+ end
43
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe Zapata::Revolutionist do
4
+ context 'it should work with' do
5
+ it 'bare module' do
6
+ generated = exec_generation('app/models/testing_module/bare.rb')
7
+ expected = expected(%Q{require 'rails_helper'
8
+
9
+ describe TestingModule::Bare do
10
+ let(:bare) do
11
+ TestingModule::Bare.new
12
+ end
13
+ end})
14
+
15
+ expect(generated).to eq(expected)
16
+ end
17
+
18
+ it 'nested module' do
19
+ generated = exec_generation('app/models/testing_module/nested/inside.rb')
20
+ expected = expected(%Q{require 'rails_helper'
21
+
22
+ describe TestingModule::Nested::Inside do
23
+ let(:inside) do
24
+ TestingModule::Nested::Inside.new
25
+ end
26
+ end})
27
+
28
+ expect(generated).to eq(expected)
29
+ end
30
+
31
+ context 'klass methods' do
32
+ before(:all) do
33
+ @generated = exec_generation('app/models/testing_module/klass_methods.rb')
34
+ end
35
+
36
+ it '#defined_with_self' do
37
+ has_block('#defined_with_self', %Q{
38
+ expect(TestingModule::KlassMethods.defined_with_self(5)).to eq(5)
39
+ })
40
+ end
41
+
42
+ it '#defined_with_back_back_self' do
43
+ has_block('#defined_with_back_back_self', %Q{
44
+ expect(TestingModule::KlassMethods.defined_with_back_back_self(5)).to eq(5)
45
+ })
46
+ end
47
+
48
+ it '#back_to_public_defined_with_self' do
49
+ has_block('#back_to_public_defined_with_self', %Q{
50
+ expect(TestingModule::KlassMethods.back_to_public_defined_with_self(5)).to eq(5)
51
+ })
52
+ end
53
+ end
54
+ end
55
+ end
data/spec/send_spec.rb ADDED
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Zapata::Revolutionist do
4
+ before(:all) do
5
+ @generated = exec_generation('app/models/test_send.rb')
6
+ end
7
+
8
+ it '#another_method_as_arg' do
9
+ has_block('#another_method_as_arg', %Q{
10
+ expect(test_send.another_method_as_arg('Help method')).to eq('Help method')
11
+ })
12
+ end
13
+
14
+ it '#second_level_method_chain' do
15
+ has_block('#second_level_method_chain', %Q{
16
+ expect(test_send.second_level_method_chain('Help method')).to eq('Help method')
17
+ })
18
+ end
19
+
20
+ it '#third_level_method_chain' do
21
+ has_block('#third_level_method_chain', %Q{
22
+ expect(test_send.third_level_method_chain('Help method')).to eq('Help method')
23
+ })
24
+ end
25
+
26
+ it '#method_with_calculated_value' do
27
+ has_block('#method_with_calculated_value', %Q{
28
+ expect(test_send.method_with_calculated_value('Missing "calculated_value"')).to eq('Missing "calculated_value"')
29
+ })
30
+ end
31
+ end
@@ -0,0 +1,90 @@
1
+ require 'spec_helper'
2
+
3
+ describe Zapata::Revolutionist do
4
+ context 'it should work with' do
5
+ it 'ints' do
6
+ generated = exec_generation('app/models/test_int.rb')
7
+ expected = expected(%Q{require 'rails_helper'
8
+
9
+ describe TestInt do
10
+ let(:test_int) do
11
+ TestInt.new
12
+ end
13
+
14
+ it '#test_int_in_arg' do
15
+ expect(test_int.test_int_in_arg(1)).to eq(1)
16
+ end
17
+ end})
18
+
19
+ expect(generated).to eq(expected)
20
+ end
21
+
22
+ it 'symbols' do
23
+ generated = exec_generation('app/models/test_sym.rb')
24
+ expected = expected(%Q{require 'rails_helper'
25
+
26
+ describe TestSym do
27
+ let(:test_sym) do
28
+ TestSym.new
29
+ end
30
+
31
+ it '#test_sym_in_arg' do
32
+ expect(test_sym.test_sym_in_arg(:rock)).to eq(:rock)
33
+ end
34
+ end})
35
+
36
+ expect(generated).to eq(expected)
37
+ end
38
+
39
+ it 'strings' do
40
+ generated = exec_generation('app/models/test_str.rb')
41
+ expected = expected(%Q{require 'rails_helper'
42
+
43
+ describe TestStr do
44
+ let(:test_str) do
45
+ TestStr.new
46
+ end
47
+
48
+ it '#test_str_in_arg' do
49
+ expect(test_str.test_str_in_arg('audioslave')).to eq('audioslave')
50
+ end
51
+ end})
52
+
53
+ expect(generated).to eq(expected)
54
+ end
55
+
56
+ it 'floats' do
57
+ generated = exec_generation('app/models/test_float.rb')
58
+ expected = expected(%Q{require 'rails_helper'
59
+
60
+ describe TestFloat do
61
+ let(:test_float) do
62
+ TestFloat.new
63
+ end
64
+
65
+ it '#test_float_in_arg' do
66
+ expect(test_float.test_float_in_arg(2.718)).to eq(2.718)
67
+ end
68
+ end})
69
+
70
+ expect(generated).to eq(expected)
71
+ end
72
+
73
+ it 'consts' do
74
+ generated = exec_generation('app/models/test_const.rb')
75
+ expected = expected(%Q{require 'rails_helper'
76
+
77
+ describe TestConst do
78
+ let(:test_const) do
79
+ TestConst.new
80
+ end
81
+
82
+ it '#test_const_in_arg' do
83
+ expect(test_const.test_const_in_arg(TestConst)).to eq(TestConst)
84
+ end
85
+ end})
86
+
87
+ expect(generated).to eq(expected)
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,124 @@
1
+ require 'zapata'
2
+ # This file was generated by the `rspec --init` command. Conventionally, all
3
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
4
+ # The generated `.rspec` file contains `--require spec_helper` which will cause this
5
+ # file to always be loaded, without a need to explicitly require it in any files.
6
+ #
7
+ # Given that it is always loaded, you are encouraged to keep this file as
8
+ # light-weight as possible. Requiring heavyweight dependencies from this file
9
+ # will add to the boot time of your test suite on EVERY test run, even for an
10
+ # individual file that may not need all of that loaded. Instead, make a
11
+ # separate helper file that requires this one and then use it only in the specs
12
+ # that actually need it.
13
+ #
14
+ # The `.rspec` file also contains a few flags that are not defaults but that
15
+ # users commonly want.
16
+ #
17
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
18
+ RSpec.configure do |config|
19
+ # The settings below are suggested to provide a good initial experience
20
+ # with RSpec, but feel free to customize to your heart's content.
21
+ =begin
22
+ # These two settings work together to allow you to limit a spec run
23
+ # to individual examples or groups you care about by tagging them with
24
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
25
+ # get run.
26
+ config.filter_run :focus
27
+ config.run_all_when_everything_filtered = true
28
+
29
+ # Many RSpec users commonly either run the entire suite or an individual
30
+ # file, and it's useful to allow more verbose output when running an
31
+ # individual spec file.
32
+ if config.files_to_run.one?
33
+ # Use the documentation formatter for detailed output,
34
+ # unless a formatter has already been configured
35
+ # (e.g. via a command-line flag).
36
+ config.default_formatter = 'doc'
37
+ end
38
+
39
+ # Print the 10 slowest examples and example groups at the
40
+ # end of the spec run, to help surface which specs are running
41
+ # particularly slow.
42
+ config.profile_examples = 10
43
+
44
+ # Run specs in random order to surface order dependencies. If you find an
45
+ # order dependency and want to debug it, you can fix the order by providing
46
+ # the seed, which is printed after each run.
47
+ # --seed 1234
48
+ config.order = :random
49
+
50
+ # Seed global randomization in this process using the `--seed` CLI option.
51
+ # Setting this allows you to use `--seed` to deterministically reproduce
52
+ # test failures related to randomization by passing the same `--seed` value
53
+ # as the one that triggered the failure.
54
+ Kernel.srand config.seed
55
+
56
+ # rspec-expectations config goes here. You can use an alternate
57
+ # assertion/expectation library such as wrong or the stdlib/minitest
58
+ # assertions if you prefer.
59
+ config.expect_with :rspec do |expectations|
60
+ # Enable only the newer, non-monkey-patching expect syntax.
61
+ # For more details, see:
62
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
63
+ expectations.syntax = :expect
64
+ end
65
+
66
+ # rspec-mocks config goes here. You can use an alternate test double
67
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
68
+ config.mock_with :rspec do |mocks|
69
+ # Enable only the newer, non-monkey-patching expect syntax.
70
+ # For more details, see:
71
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
72
+ mocks.syntax = :expect
73
+
74
+ # Prevents you from mocking or stubbing a method that does not exist on
75
+ # a real object. This is generally recommended.
76
+ mocks.verify_partial_doubles = true
77
+ end
78
+ =end
79
+ end
80
+
81
+ # Helper methods
82
+ RAILS_TEST_APP_DIR = "#{Dir.pwd}/spec/support/rails_test_app"
83
+
84
+ def clean(string)
85
+ string.split(/\n/).map(&:strip).join("\n")
86
+ end
87
+
88
+ def expected(code)
89
+ clean(
90
+ <<-EXPECTED
91
+ #{code}
92
+ EXPECTED
93
+ )
94
+ end
95
+
96
+ def exec_generation(generate_for)
97
+ stdin, stdout, stderr = Bundler.with_clean_env do
98
+ Open3.popen3(
99
+ "cd #{RAILS_TEST_APP_DIR} && bundle exec zapata generate #{generate_for}"
100
+ )
101
+ end
102
+
103
+ output = stdout.readlines
104
+ generated_filename = output.last.match(/File\ (.+)\ was/)[1]
105
+ spec_path = "#{RAILS_TEST_APP_DIR}/#{generated_filename}"
106
+
107
+ clean(
108
+ <<-ACTUAL
109
+ #{File.read(spec_path)}
110
+ ACTUAL
111
+ )
112
+ end
113
+
114
+ def has_block(name, expected_content)
115
+ generated_lines = @generated.split("\n")
116
+ it_starts = generated_lines.index { |line| line == "it '#{name}' do" }
117
+ raise 'No such block' unless it_starts
118
+
119
+ might_match_lines = generated_lines[it_starts..-1]
120
+ it_ends = might_match_lines.index { |line| line == 'end' }
121
+
122
+ block = might_match_lines[1...it_ends].first
123
+ expect(block).to eq(expected_content.strip)
124
+ end