riveter 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 (174) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.rspec +2 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +17 -0
  7. data/Gemfile +4 -0
  8. data/Gemfile.lock +147 -0
  9. data/LICENSE.txt +23 -0
  10. data/README.md +77 -0
  11. data/Rakefile +7 -0
  12. data/app/helpers/riveter/command_form_helper.rb +15 -0
  13. data/app/helpers/riveter/enquiry_form_helper.rb +16 -0
  14. data/app/helpers/riveter/query_filter_form_helper.rb +16 -0
  15. data/config/locales/forms.en.yml +25 -0
  16. data/config/locales/validators.en.yml +26 -0
  17. data/init.rb +25 -0
  18. data/lib/generators/erb/TODO +1 -0
  19. data/lib/generators/haml/command_controller/USAGE +0 -0
  20. data/lib/generators/haml/command_controller/command_controller_generator.rb +56 -0
  21. data/lib/generators/haml/command_controller/templates/new.html.haml +26 -0
  22. data/lib/generators/haml/enquiry_controller/USAGE +0 -0
  23. data/lib/generators/haml/enquiry_controller/enquiry_controller_generator.rb +56 -0
  24. data/lib/generators/haml/enquiry_controller/templates/index.html.haml +57 -0
  25. data/lib/generators/riveter/command/USAGE +0 -0
  26. data/lib/generators/riveter/command/command_generator.rb +55 -0
  27. data/lib/generators/riveter/command/templates/command.rb +40 -0
  28. data/lib/generators/riveter/command/templates/commands.en.yml +57 -0
  29. data/lib/generators/riveter/command/templates/module.rb +4 -0
  30. data/lib/generators/riveter/command_controller/USAGE +0 -0
  31. data/lib/generators/riveter/command_controller/command_controller_generator.rb +40 -0
  32. data/lib/generators/riveter/command_controller/templates/command_controller.rb +18 -0
  33. data/lib/generators/riveter/command_controller/templates/module.rb +4 -0
  34. data/lib/generators/riveter/enquiry/USAGE +0 -0
  35. data/lib/generators/riveter/enquiry/enquiry_generator.rb +29 -0
  36. data/lib/generators/riveter/enquiry/templates/enquiry.rb +11 -0
  37. data/lib/generators/riveter/enquiry/templates/module.rb +4 -0
  38. data/lib/generators/riveter/enquiry_controller/USAGE +0 -0
  39. data/lib/generators/riveter/enquiry_controller/enquiry_controller_generator.rb +34 -0
  40. data/lib/generators/riveter/enquiry_controller/templates/enquiry_controller.rb +9 -0
  41. data/lib/generators/riveter/enquiry_controller/templates/module.rb +4 -0
  42. data/lib/generators/riveter/enum/USAGE +41 -0
  43. data/lib/generators/riveter/enum/enum_generator.rb +51 -0
  44. data/lib/generators/riveter/enum/templates/enum.rb +17 -0
  45. data/lib/generators/riveter/enum/templates/enums.en.yml +35 -0
  46. data/lib/generators/riveter/enum/templates/module.rb +4 -0
  47. data/lib/generators/riveter/install/USAGE +0 -0
  48. data/lib/generators/riveter/install/install_generator.rb +14 -0
  49. data/lib/generators/riveter/presenter/USAGE +0 -0
  50. data/lib/generators/riveter/presenter/presenter_generator.rb +20 -0
  51. data/lib/generators/riveter/presenter/templates/module.rb +4 -0
  52. data/lib/generators/riveter/presenter/templates/presenter.rb +7 -0
  53. data/lib/generators/riveter/query/USAGE +22 -0
  54. data/lib/generators/riveter/query/query_generator.rb +20 -0
  55. data/lib/generators/riveter/query/templates/module.rb +4 -0
  56. data/lib/generators/riveter/query/templates/query.rb +31 -0
  57. data/lib/generators/riveter/query_filter/USAGE +0 -0
  58. data/lib/generators/riveter/query_filter/query_filter_generator.rb +52 -0
  59. data/lib/generators/riveter/query_filter/templates/module.rb +4 -0
  60. data/lib/generators/riveter/query_filter/templates/query_filter.rb +40 -0
  61. data/lib/generators/riveter/query_filter/templates/query_filters.en.yml +49 -0
  62. data/lib/generators/riveter/service/USAGE +0 -0
  63. data/lib/generators/riveter/service/service_generator.rb +20 -0
  64. data/lib/generators/riveter/service/templates/module.rb +4 -0
  65. data/lib/generators/riveter/service/templates/service.rb +12 -0
  66. data/lib/generators/riveter/worker/USAGE +0 -0
  67. data/lib/generators/riveter/worker/templates/module.rb +4 -0
  68. data/lib/generators/riveter/worker/templates/worker.rb +7 -0
  69. data/lib/generators/riveter/worker/worker_generator.rb +20 -0
  70. data/lib/generators/rspec/command/USAGE +0 -0
  71. data/lib/generators/rspec/command/command_generator.rb +11 -0
  72. data/lib/generators/rspec/command/templates/command_spec.rb +8 -0
  73. data/lib/generators/rspec/command_controller/USAGE +0 -0
  74. data/lib/generators/rspec/command_controller/command_controller_generator.rb +21 -0
  75. data/lib/generators/rspec/command_controller/templates/command_controller_spec.rb +70 -0
  76. data/lib/generators/rspec/enquiry/USAGE +0 -0
  77. data/lib/generators/rspec/enquiry/enquiry_generator.rb +11 -0
  78. data/lib/generators/rspec/enquiry/templates/enquiry_spec.rb +69 -0
  79. data/lib/generators/rspec/enquiry_controller/USAGE +0 -0
  80. data/lib/generators/rspec/enquiry_controller/enquiry_controller_generator.rb +16 -0
  81. data/lib/generators/rspec/enquiry_controller/templates/enquiry_controller_spec.rb +32 -0
  82. data/lib/generators/rspec/enum/USAGE +0 -0
  83. data/lib/generators/rspec/enum/enum_generator.rb +11 -0
  84. data/lib/generators/rspec/enum/templates/enum_spec.rb +8 -0
  85. data/lib/generators/rspec/presenter/USAGE +0 -0
  86. data/lib/generators/rspec/presenter/presenter_generator.rb +11 -0
  87. data/lib/generators/rspec/presenter/templates/presenter_spec.rb +8 -0
  88. data/lib/generators/rspec/query/USAGE +0 -0
  89. data/lib/generators/rspec/query/query_generator.rb +11 -0
  90. data/lib/generators/rspec/query/templates/query_spec.rb +41 -0
  91. data/lib/generators/rspec/query_filter/USAGE +0 -0
  92. data/lib/generators/rspec/query_filter/query_filter_generator.rb +11 -0
  93. data/lib/generators/rspec/query_filter/templates/query_filter_spec.rb +8 -0
  94. data/lib/generators/rspec/service/USAGE +0 -0
  95. data/lib/generators/rspec/service/service_generator.rb +11 -0
  96. data/lib/generators/rspec/service/templates/service_spec.rb +8 -0
  97. data/lib/generators/rspec/worker/USAGE +0 -0
  98. data/lib/generators/rspec/worker/templates/worker_spec.rb +8 -0
  99. data/lib/generators/rspec/worker/worker_generator.rb +11 -0
  100. data/lib/generators/test_unit/TODO +1 -0
  101. data/lib/riveter/associated_type_registry.rb +63 -0
  102. data/lib/riveter/attribute_default_values.rb +67 -0
  103. data/lib/riveter/attributes.rb +443 -0
  104. data/lib/riveter/booleaness_validator.rb +20 -0
  105. data/lib/riveter/command.rb +59 -0
  106. data/lib/riveter/command_controller.rb +93 -0
  107. data/lib/riveter/command_routes.rb +73 -0
  108. data/lib/riveter/core_extensions.rb +246 -0
  109. data/lib/riveter/email_validator.rb +20 -0
  110. data/lib/riveter/enquiry.rb +137 -0
  111. data/lib/riveter/enquiry_controller.rb +80 -0
  112. data/lib/riveter/enquiry_routes.rb +69 -0
  113. data/lib/riveter/enumerated.rb +107 -0
  114. data/lib/riveter/errors.rb +11 -0
  115. data/lib/riveter/form_builder_extensions.rb +21 -0
  116. data/lib/riveter/hash_with_dependency.rb +12 -0
  117. data/lib/riveter/presenter.rb +73 -0
  118. data/lib/riveter/query.rb +45 -0
  119. data/lib/riveter/query_filter.rb +22 -0
  120. data/lib/riveter/rails/engine.rb +6 -0
  121. data/lib/riveter/rails/railtie.rb +50 -0
  122. data/lib/riveter/service.rb +45 -0
  123. data/lib/riveter/spec_helper.rb +55 -0
  124. data/lib/riveter/tasks/.keep +0 -0
  125. data/lib/riveter/version.rb +3 -0
  126. data/lib/riveter/worker.rb +20 -0
  127. data/lib/riveter.rb +47 -0
  128. data/riveter.gemspec +40 -0
  129. data/spec/examples/attribute_examples.rb +57 -0
  130. data/spec/generators/haml/command_controller/command_controller_generator_spec.rb +34 -0
  131. data/spec/generators/haml/enquiry_controller/enquiry_controller_generator_spec.rb +34 -0
  132. data/spec/generators/riveter/command/command_generator_spec.rb +58 -0
  133. data/spec/generators/riveter/command_controller/command_controller_generator_spec.rb +0 -0
  134. data/spec/generators/riveter/enquiry/enquiry_generator_spec.rb +0 -0
  135. data/spec/generators/riveter/query_filter/query_filter_generator_spec.rb +58 -0
  136. data/spec/riveter/associated_type_registry_spec.rb +158 -0
  137. data/spec/riveter/attribute_default_value_spec.rb +69 -0
  138. data/spec/riveter/attributes_spec.rb +228 -0
  139. data/spec/riveter/command_controller_spec.rb +116 -0
  140. data/spec/riveter/command_routes_spec.rb +116 -0
  141. data/spec/riveter/command_spec.rb +66 -0
  142. data/spec/riveter/core_extensions_spec.rb +209 -0
  143. data/spec/riveter/enquiry_controller_spec.rb +128 -0
  144. data/spec/riveter/enquiry_routes_spec.rb +101 -0
  145. data/spec/riveter/enquiry_spec.rb +299 -0
  146. data/spec/riveter/enumerated_spec.rb +47 -0
  147. data/spec/riveter/form_builder_extensions_spec.rb +28 -0
  148. data/spec/riveter/presenter_spec.rb +131 -0
  149. data/spec/riveter/query_filter_spec.rb +19 -0
  150. data/spec/riveter/query_spec.rb +72 -0
  151. data/spec/riveter/service_spec.rb +49 -0
  152. data/spec/riveter/spec_helper_spec.rb +21 -0
  153. data/spec/riveter/worker_spec.rb +11 -0
  154. data/spec/spec_helper.rb +54 -0
  155. data/spec/support/test_associated_class.rb +2 -0
  156. data/spec/support/test_class_with_attributes.rb +17 -0
  157. data/spec/support/test_command.rb +4 -0
  158. data/spec/support/test_command_controller.rb +12 -0
  159. data/spec/support/test_command_routes.rb +3 -0
  160. data/spec/support/test_enquiry.rb +7 -0
  161. data/spec/support/test_enquiry_controller.rb +12 -0
  162. data/spec/support/test_enquiry_routes.rb +3 -0
  163. data/spec/support/test_enum.rb +8 -0
  164. data/spec/support/test_form_builder.rb +3 -0
  165. data/spec/support/test_model.rb +2 -0
  166. data/spec/support/test_model_with_attribute_default_values.rb +29 -0
  167. data/spec/support/test_presenter.rb +2 -0
  168. data/spec/support/test_query.rb +5 -0
  169. data/spec/support/test_query_filter.rb +4 -0
  170. data/spec/support/test_service.rb +7 -0
  171. data/spec/support/validate_booleaness_of_matcher.rb +17 -0
  172. data/spec/support/validate_timeliness_of_matcher.rb +17 -0
  173. data/spec/support/validator_detector.rb +48 -0
  174. metadata +487 -0
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for "an attribute" do |type, default_value, another_value, *args, &block|
4
+ options = args.extract_options!
5
+
6
+ describe type do
7
+ let(:name) { "a_#{type}" }
8
+ let(:instance) { subject.new() }
9
+
10
+ describe "as attribute" do
11
+ before do
12
+ subject.send :"attr_#{type}", name, *args, options
13
+ end
14
+
15
+ it { subject.attributes.should include(name.to_s) }
16
+ it { instance.attributes.should include(name.to_s) }
17
+ it { instance.should respond_to(name)}
18
+ it { instance.should respond_to("#{name}=")}
19
+
20
+ it "assigns attribute in initializer" do
21
+ a = subject.new(name => another_value)
22
+ a.send(name).should eq(another_value)
23
+ a.attributes[name].should eq(another_value)
24
+ end
25
+
26
+ it "assigns attribute" do
27
+ a = subject.new()
28
+ a.send("#{name}=", another_value)
29
+ a.attributes[name].should eq(another_value)
30
+ end
31
+ end
32
+
33
+ describe "as required attribute" do
34
+ before do
35
+ subject.send :"attr_#{type}", name, *args, options.merge(:required => true)
36
+ end
37
+
38
+ it { instance.should validate_presence_of(name)}
39
+ end
40
+
41
+ describe "with default value" do
42
+ before do
43
+ subject.send :"attr_#{type}", name, *args, options.merge(:default => default_value)
44
+ end
45
+
46
+ it { instance.send(name).should eq(default_value)}
47
+ end
48
+ end
49
+ end
50
+
51
+ shared_examples_for "a class with attributes" do |type|
52
+
53
+ # it's good enough to see whether the type includes
54
+ # the class methods of the attributes module
55
+ it { type.should be_a(Riveter::Attributes::ClassMethods) }
56
+
57
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+ require 'generators/haml/command_controller/command_controller_generator'
3
+
4
+ describe Haml::Generators::CommandControllerGenerator, :type => :generator do
5
+ it "creates the view with defaults" do
6
+ gen = generator %w(create_something)
7
+ expect(gen).to receive(:create_template_file)
8
+ capture(:stdout) { gen.invoke_all }
9
+ end
10
+
11
+ it "creates the view with specified action name" do
12
+ gen = generator %w(create_something create)
13
+ expect(gen).to receive(:create_template_file)
14
+ capture(:stdout) { gen.invoke_all }
15
+ end
16
+
17
+ it "creates the view with specified action name and attributes" do
18
+ gen = generator %w(create_something create name:string:required active:boolean other)
19
+ expect(gen).to receive(:create_template_file)
20
+ capture(:stdout) { gen.invoke_all }
21
+ end
22
+
23
+ describe "the generated files" do
24
+ before do
25
+ run_generator %w(create_something create name:string:required active:boolean other)
26
+ end
27
+
28
+ describe "the view" do
29
+ subject { file('app/views/create_something_command/create.html.haml') }
30
+
31
+ it { should exist }
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+ require 'generators/haml/enquiry_controller/enquiry_controller_generator'
3
+
4
+ describe Haml::Generators::EnquiryControllerGenerator, :type => :generator do
5
+ it "creates the view with defaults" do
6
+ gen = generator %w(list_something)
7
+ expect(gen).to receive(:create_template_file)
8
+ capture(:stdout) { gen.invoke_all }
9
+ end
10
+
11
+ it "creates the view with specified action name" do
12
+ gen = generator %w(list_something list)
13
+ expect(gen).to receive(:create_template_file)
14
+ capture(:stdout) { gen.invoke_all }
15
+ end
16
+
17
+ it "creates the view with specified action name and attributes" do
18
+ gen = generator %w(list_something list name:string:required active:boolean other)
19
+ expect(gen).to receive(:create_template_file)
20
+ capture(:stdout) { gen.invoke_all }
21
+ end
22
+
23
+ describe "the generated files" do
24
+ before do
25
+ run_generator %w(list_something list name:string:required active:boolean other)
26
+ end
27
+
28
+ describe "the view" do
29
+ subject { file('app/views/list_something_enquiry/list.html.haml') }
30
+
31
+ it { should exist }
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+ require 'generators/riveter/command/command_generator'
3
+ require 'fileutils'
4
+
5
+ describe Riveter::Generators::CommandGenerator, :type => :generator do
6
+ it "creates the command with defaults" do
7
+ gen = generator %w(create_something --no-command-controller)
8
+ expect(gen).to receive(:create_command_file)
9
+ capture(:stdout) { gen.invoke_all }
10
+ end
11
+
12
+ it "creates the command with specified attributes" do
13
+ gen = generator %w(create_something name:string:required active:boolean other --no-command-controller)
14
+ expect(gen).to receive(:create_command_file)
15
+ capture(:stdout) { gen.invoke_all }
16
+ end
17
+
18
+ it "creates a module file" do
19
+ gen = generator %w(test_ns/create_something name:string:required active:boolean other --no-command-controller)
20
+ expect(gen).to receive(:create_module_file)
21
+ capture(:stdout) { gen.invoke_all }
22
+ end
23
+
24
+ it "creates a locale file if it doesn't exist" do
25
+ gen = generator %w(create_something --no-command-controller)
26
+ expect(gen).to receive(:create_locale_file)
27
+ capture(:stdout) { gen.invoke_all }
28
+ end
29
+
30
+ it "skips creating a locale file if it exists" do
31
+ pending
32
+ end
33
+
34
+ describe "the generated files" do
35
+ describe "the command" do
36
+ before do
37
+ run_generator %w(create_something name:string:required active:boolean other --no-command-controller)
38
+ end
39
+
40
+ subject { file('app/commands/create_something_command.rb') }
41
+
42
+ it { should exist }
43
+ end
44
+
45
+ describe "the commands.en.yml locale" do
46
+ before do
47
+ FileUtils.mkdir_p(file('config/locales'))
48
+ File.open(file('config/locales/commands.en.yml'), 'w') {|f| f.write 'empty' }
49
+ run_generator %w(create_something name:string:required active:boolean other --no-command-controller)
50
+ end
51
+
52
+ subject { file('config/locales/commands.en.yml') }
53
+
54
+ it { should exist }
55
+ it { File.open(file('config/locales/commands.en.yml'), 'r') {|f| f.read }.should eq('empty') }
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+ require 'generators/riveter/query_filter/query_filter_generator'
3
+ require 'fileutils'
4
+
5
+ describe Riveter::Generators::QueryFilterGenerator, :type => :generator do
6
+ it "creates the query filter with defaults" do
7
+ gen = generator %w(active_items)
8
+ expect(gen).to receive(:create_query_filter_file)
9
+ capture(:stdout) { gen.invoke_all }
10
+ end
11
+
12
+ it "creates the query filter with specified attributes" do
13
+ gen = generator %w(active_items name:string:required active:boolean other)
14
+ expect(gen).to receive(:create_query_filter_file)
15
+ capture(:stdout) { gen.invoke_all }
16
+ end
17
+
18
+ it "creates a module file" do
19
+ gen = generator %w(test_ns/active_items name:string:required active:boolean other)
20
+ expect(gen).to receive(:create_module_file)
21
+ capture(:stdout) { gen.invoke_all }
22
+ end
23
+
24
+ it "creates a locale file if it doesn't exist" do
25
+ gen = generator %w(active_items)
26
+ expect(gen).to receive(:create_locale_file)
27
+ capture(:stdout) { gen.invoke_all }
28
+ end
29
+
30
+ it "skips creating a locale file if it exists" do
31
+ pending
32
+ end
33
+
34
+ describe "the generated files" do
35
+ describe "the query filter" do
36
+ before do
37
+ run_generator %w(active_items name:string:required active:boolean other)
38
+ end
39
+
40
+ subject { file('app/query_filters/active_items_query_filter.rb') }
41
+
42
+ it { should exist }
43
+ end
44
+
45
+ describe "the commands.en.yml locale" do
46
+ before do
47
+ FileUtils.mkdir_p(file('config/locales'))
48
+ File.open(file('config/locales/query_filters.en.yml'), 'w') {|f| f.write 'empty' }
49
+ run_generator %w(active_items name:string:required active:boolean other)
50
+ end
51
+
52
+ subject { file('config/locales/query_filters.en.yml') }
53
+
54
+ it { should exist }
55
+ it { File.open(file('config/locales/query_filters.en.yml'), 'r') {|f| f.read }.should eq('empty') }
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,158 @@
1
+ require 'spec_helper'
2
+
3
+ describe Riveter::AssociatedTypeRegistry do
4
+ subject do
5
+ Class.new().class_eval {
6
+ include Riveter::AssociatedTypeRegistry
7
+ self
8
+ }
9
+ end
10
+
11
+ describe "#container" do
12
+ it "should be itself" do
13
+ subject.container.should eq(subject)
14
+ end
15
+
16
+ let(:derived_class) {
17
+ Class.new(subject).class_eval {
18
+ register_type self, TestAssociatedClass
19
+ self
20
+ }
21
+ }
22
+
23
+ it "should be the base class for derived classes" do
24
+ derived_class.container.should eq(subject)
25
+ end
26
+ end
27
+
28
+ describe "#key_for" do
29
+ it "yields a key for a symbol" do
30
+ subject.key_for(:key).should eq(:key)
31
+ end
32
+
33
+ it "yields a key for a type" do
34
+ subject.key_for(TestAssociatedClass).should eq(:test_associated_class)
35
+ end
36
+ end
37
+
38
+ describe "#register_type" do
39
+ it "registers the type for the associated class" do
40
+ expect {
41
+ subject.register_type subject, TestAssociatedClass
42
+ }.to change(subject.registry, :length).by(1)
43
+ end
44
+ end
45
+
46
+ describe "#resolve_all" do
47
+ it "should yield an empty array for an unregistered type" do
48
+ subject.resolve_all(Class).should eq([])
49
+ end
50
+
51
+ let!(:derived_classes) {
52
+ 2.times.collect {
53
+ Class.new(subject).class_eval {
54
+ register_type self, TestAssociatedClass
55
+ self
56
+ }
57
+ }
58
+ }
59
+
60
+ it "should yield array of types for a registered type" do
61
+ subject.resolve_all(TestAssociatedClass).should eq(derived_classes)
62
+ end
63
+ end
64
+
65
+ describe "#resolve" do
66
+ it "should yield nil for an unregistered type" do
67
+ subject.resolve(Class).should be_nil
68
+ end
69
+
70
+ let!(:derived_classes) {
71
+ 2.times.collect {
72
+ Class.new(subject).class_eval {
73
+ register_type self, TestAssociatedClass
74
+ self
75
+ }
76
+ }
77
+ }
78
+
79
+ it "should yield the first associated type for a registered type" do
80
+ subject.resolve(TestAssociatedClass).should eq(derived_classes.first)
81
+ end
82
+ end
83
+
84
+ describe "#resolve!" do
85
+ it "should raise UnregisteredType for an unregistered type" do
86
+ expect {
87
+ subject.resolve!(Class)
88
+ }.to raise_error(Riveter::UnregisteredType)
89
+ end
90
+
91
+ it "should include the unknown type in the error" do
92
+ begin
93
+ subject.resolve!(Class)
94
+ rescue Exception => e
95
+ e.type.should eq(Class)
96
+ end
97
+ end
98
+
99
+ let!(:derived_class) {
100
+ Class.new(subject).class_eval {
101
+ register_type self, TestAssociatedClass
102
+ self
103
+ }
104
+ }
105
+
106
+ it "should not raise UnregisteredType for a registered type" do
107
+ expect {
108
+ subject.resolve!(TestAssociatedClass)
109
+ }.to_not raise_error
110
+ end
111
+ end
112
+
113
+ describe "#registry" do
114
+ let!(:first_class) do
115
+ Class.new().class_eval {
116
+ include Riveter::AssociatedTypeRegistry
117
+ self
118
+ }
119
+ end
120
+
121
+ let!(:second_class) do
122
+ Class.new().class_eval {
123
+ include Riveter::AssociatedTypeRegistry
124
+ self
125
+ }
126
+ end
127
+
128
+ let!(:derived_first_class) do
129
+ Class.new(first_class).class_eval {
130
+ register_type self, TestAssociatedClass
131
+ self
132
+ }
133
+ end
134
+
135
+ let!(:derived_second_class) do
136
+ Class.new(second_class).class_eval {
137
+ register_type self, TestAssociatedClass
138
+ self
139
+ }
140
+ end
141
+
142
+ describe "each type has an independant registry" do
143
+ it { first_class.registry.should_not eq(second_class.registry) }
144
+ it { derived_first_class.registry.should_not eq(derived_second_class.registry) }
145
+ it { derived_first_class.registry.should eq(first_class.registry) }
146
+ it { derived_second_class.registry.should eq(second_class.registry) }
147
+ end
148
+
149
+ describe "registered types" do
150
+ let(:key) { first_class.key_for(TestAssociatedClass) }
151
+
152
+ it { first_class.registry.key?(key).should be_true }
153
+ it { second_class.registry.key?(key).should be_true }
154
+ it { derived_first_class.registry.key?(key).should be_true }
155
+ it { derived_second_class.registry.key?(key).should be_true }
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe Riveter::AttributeDefaultValues do
4
+ before do
5
+ TestModelWithAttributeDefaultValues.send :attr_accessor, :prop, :prop1, :prop2
6
+ end
7
+
8
+ describe "class" do
9
+ subject { TestModelWithAttributeDefaultValues }
10
+
11
+ describe "#default_value_for" do
12
+ it { should respond_to(:default_value_for) }
13
+
14
+ it "should register default value for given attribute" do
15
+ subject.default_value_for :prop, :value
16
+ subject.attribute_defaults[:prop].should eq(:value)
17
+ end
18
+
19
+ it "should register default value using a proc for given attribute" do
20
+ subject.default_value_for :prop do :value; end
21
+ subject.attribute_defaults[:prop].should be_a(Proc)
22
+ end
23
+
24
+ it "should have own registration" do
25
+ expect {
26
+ Class.new(ActiveRecord::Base).class_eval do |klass|
27
+ include Riveter::AttributeDefaultValues
28
+
29
+ attr_accessor :attr_name
30
+ default_value_for :attr_name, 1
31
+ end
32
+ }.to_not change { subject.attribute_defaults.length }
33
+ end
34
+ end
35
+
36
+ describe "#default_values" do
37
+ it { should respond_to(:default_values) }
38
+
39
+ it "should register multiple default values for given attributes" do
40
+ subject.default_values :prop1 => :value, :prop2 => :value
41
+ subject.attribute_defaults[:prop1].should eq(:value)
42
+ subject.attribute_defaults[:prop2].should eq(:value)
43
+ end
44
+
45
+ it "should register multiple default values using a procs for given attributes" do
46
+ subject.default_values :prop1 => lambda { :value }, :prop2 => lambda { :value }
47
+ subject.attribute_defaults[:prop1].should be_a(Proc)
48
+ subject.attribute_defaults[:prop2].should be_a(Proc)
49
+ end
50
+ end
51
+ end
52
+
53
+ describe "instance" do
54
+ before do
55
+ TestModelWithAttributeDefaultValues.default_values :prop1 => :value1, :prop2 => lambda {|*args| :value2 }
56
+ end
57
+
58
+ subject { TestModelWithAttributeDefaultValues.new() }
59
+
60
+ it { subject.prop1.should eq(:value1) }
61
+ it { subject.prop2.should eq(:value2) }
62
+
63
+ it "preserves existing attribute values" do
64
+ instance = TestModelWithAttributeDefaultValues.new(:prop1 => :valueA)
65
+ instance.prop1.should eq(:valueA)
66
+ instance.prop2.should eq(:value2)
67
+ end
68
+ end
69
+ end