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,54 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+
4
+ require 'riveter'
5
+
6
+ # NB: sync these requires from the Railtie
7
+ require 'riveter/form_builder_extensions'
8
+ require 'riveter/command_routes'
9
+ require 'riveter/enquiry_routes'
10
+
11
+ require 'rails/all'
12
+ require 'rails/generators'
13
+ require 'haml'
14
+
15
+ require 'rspec/autorun'
16
+ require 'shoulda/matchers'
17
+ require 'ammeter/init'
18
+ require 'simplecov'
19
+ require 'pry'
20
+
21
+ SimpleCov.start do
22
+ # add_filter 'spec'
23
+ end
24
+
25
+ class TestApp < Rails::Application
26
+ config.root = File.dirname(__FILE__)
27
+ end
28
+ Rails.application = TestApp
29
+
30
+ module Rails
31
+ def self.root
32
+ @root ||= File.expand_path(File.join(File.dirname(__FILE__), '..', 'tmp', 'rails'))
33
+ end
34
+ end
35
+ Rails.application.config.root = Rails.root
36
+
37
+ # Call configure to load the settings from
38
+ # Rails.application.config.generators to Rails::Generators
39
+ Rails::Generators.configure! Rails.application.config.generators
40
+
41
+ # require supporting ruby files with custom matchers and macros, etc
42
+ Dir[File.expand_path("../support/**/*.rb", __FILE__)].each {|f| require f }
43
+
44
+ # configure Rspec
45
+ RSpec.configure do |config|
46
+ # config.order = :random
47
+ config.fail_fast = (ENV["FAIL_FAST"] == 1)
48
+ end
49
+
50
+ # require examples, must happen after configure for RSpec 3
51
+ Dir[File.expand_path("../examples/**/*.rb", __FILE__)].each {|f| require f }
52
+
53
+ # I18n.enforce_available_locales will default to true in the future.
54
+ I18n.enforce_available_locales = true if I18n.respond_to?(:enforce_available_locales)
@@ -0,0 +1,2 @@
1
+ class TestAssociatedClass
2
+ end
@@ -0,0 +1,17 @@
1
+ class TestClassWithAttributes
2
+ include Riveter::Attributes
3
+
4
+ attr_string :string, :default => 'A'
5
+ attr_text :text, :default => 'b'
6
+ attr_integer :integer, :default => 1
7
+ attr_decimal :decimal, :default => 9.998
8
+ attr_date :date, :default => Date.new(2010, 1, 12)
9
+ attr_time :time, :default => Time.new(2010, 1, 12, 14, 56)
10
+ attr_boolean :boolean, :default => true
11
+ attr_enum :enum, TestEnum, :default => TestEnum::Member1
12
+ attr_array :array, :default => [1, 2, 3]
13
+ attr_hash :hash, :default => {:a => :b}
14
+ attr_model :model, TestModel, :default => TestModel
15
+ attr_object :object, :default => 'whatever'
16
+
17
+ end
@@ -0,0 +1,4 @@
1
+ class TestCommand < Riveter::Command::Base
2
+ attr_string :name, :required => true
3
+
4
+ end
@@ -0,0 +1,12 @@
1
+ require 'action_controller'
2
+ require_relative 'test_command'
3
+
4
+ class TestCommandController < ActionController::Base
5
+ include Riveter::CommandController
6
+ end
7
+
8
+ class TestTestCommandController < ActionController::Base
9
+ include Riveter::CommandController
10
+
11
+ command_controller_for TestCommand
12
+ end
@@ -0,0 +1,3 @@
1
+ class TestCommandRoutes
2
+ include Riveter::CommandRoutes
3
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'test_query_filter'
2
+ require_relative 'test_query'
3
+
4
+ class TestEnquiry < Riveter::Enquiry::Base
5
+ filter_with TestQueryFilter
6
+ query_with TestQuery
7
+ end
@@ -0,0 +1,12 @@
1
+ require 'action_controller'
2
+ require_relative 'test_enquiry'
3
+
4
+ class TestEnquiryController < ActionController::Base
5
+ include Riveter::EnquiryController
6
+ end
7
+
8
+ class TestTestEnquiryController < ActionController::Base
9
+ include Riveter::EnquiryController
10
+
11
+ enquiry_controller_for TestEnquiry
12
+ end
@@ -0,0 +1,3 @@
1
+ class TestEnquiryRoutes
2
+ include Riveter::EnquiryRoutes
3
+ end
@@ -0,0 +1,8 @@
1
+ module TestEnum
2
+
3
+ Member1 = 1
4
+ Member2 = 2
5
+
6
+ include Riveter::Enumerated
7
+
8
+ end
@@ -0,0 +1,3 @@
1
+ class TestFormBuilder
2
+ include Riveter::FormBuilderExtensions
3
+ end
@@ -0,0 +1,2 @@
1
+ class TestModel
2
+ end
@@ -0,0 +1,29 @@
1
+ class TestModelWithAttributeDefaultValues
2
+
3
+ # stub ActiveRecord::Base methods
4
+
5
+ def self.after_initialize(method_or_proc)
6
+ @@after_initialize_method_or_proc = method_or_proc
7
+ end
8
+
9
+ def initialize(*args)
10
+ args.extract_options!.each do |key, value|
11
+ self.send("#{key}=", value)
12
+ end
13
+
14
+ @@after_initialize_method_or_proc.respond_to?(:call) ?
15
+ @@after_initialize_method_or_proc.call(self) :
16
+ send(@@after_initialize_method_or_proc)
17
+ end
18
+
19
+ def read_attribute(attrib)
20
+ self.send(attrib)
21
+ end
22
+
23
+ def write_attribute(attrib, value)
24
+ self.send("#{attrib}=", value)
25
+ end
26
+
27
+ include Riveter::AttributeDefaultValues
28
+
29
+ end
@@ -0,0 +1,2 @@
1
+ class TestPresenter < Riveter::Presenter::Base
2
+ end
@@ -0,0 +1,5 @@
1
+ class TestQuery < Riveter::Query::Base
2
+ def build_relation(filter)
3
+ 'not implemented'
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ class TestQueryFilter < Riveter::QueryFilter::Base
2
+ attr_string :name, :required => true
3
+
4
+ end
@@ -0,0 +1,7 @@
1
+ class TestService < Riveter::Service::Base
2
+ # register_as_handler_for TestCommand
3
+
4
+ # def perform(command, *args)
5
+ # true
6
+ # end
7
+ end
@@ -0,0 +1,17 @@
1
+ RSpec::Matchers.define :validate_booleaness_of do |attribute|
2
+ match do |model|
3
+ ValidatorDetector.detect(model, attribute, Riveter::BooleanessValidator)
4
+ end
5
+
6
+ failure_message_for_should do |actual|
7
+ "expect #{attribute} to validate booleaness of"
8
+ end
9
+
10
+ failure_message_for_should_not do |actual|
11
+ "expect #{attribute} to not validate booleaness of"
12
+ end
13
+
14
+ description do
15
+ "expect #{attribute} to validate booleaness of"
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ RSpec::Matchers.define :validate_timeliness_of do |attribute|
2
+ match do |model|
3
+ ValidatorDetector.detect(model, attribute, ActiveModel::Validations::TimelinessValidator)
4
+ end
5
+
6
+ failure_message_for_should do |actual|
7
+ "expect #{attribute} to validate timeliness of"
8
+ end
9
+
10
+ failure_message_for_should_not do |actual|
11
+ "expect #{attribute} to not validate timeliness of"
12
+ end
13
+
14
+ description do
15
+ "expect #{attribute} to validate timeliness of"
16
+ end
17
+ end
@@ -0,0 +1,48 @@
1
+ module ValidatorDetector
2
+ class << self
3
+ def detect(model, attribute, validator_class)
4
+ # a naive implementation based on whether the respective validator
5
+ # is in the list of validators for the given attribute
6
+ # and whether it is "active" based on the `if` and `unless` options
7
+
8
+ model._validators[attribute.to_sym].detect do |validator|
9
+ validator.class == validator_class &&
10
+ validator.attributes.include?(attribute) &&
11
+ is_validator_applied?(validator)
12
+ end
13
+ end
14
+
15
+ def is_validator_applied?(validator)
16
+ #
17
+ # NOTE: this isn't foolproof, since the logic of the method (or Proc)
18
+ # could depend on the state of the model instance or some other logic
19
+ #
20
+
21
+ # NOTE: also doesn't take into account the "on" conditional (I.e. only when creating or updating the model)
22
+
23
+ # See http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates
24
+
25
+ # determine whether the validator has an :if or :unless applied
26
+ method = validator.options[:if] || validator.options[:unless]
27
+
28
+ # next, evaluate the condition to determine whether the validator is active
29
+ # NOTE: any errors are ignored, and the default therefore is false
30
+ if method.instance_of?(Symbol) || method.instance_of?(String)
31
+ # it's a model method, so evalulate within context
32
+ self.new().instance_eval do
33
+ send(method, self) rescue false
34
+ end
35
+
36
+ elsif method.instance_of?(Proc)
37
+ # it's a lambda, so invoke within context
38
+ self.new().instance_eval do
39
+ method.call(self) rescue false
40
+ end
41
+
42
+ else
43
+ # default is applied
44
+ true
45
+ end
46
+ end
47
+ end
48
+ end