cuprum-rails 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +145 -0
- data/DEVELOPMENT.md +20 -0
- data/README.md +356 -63
- data/lib/cuprum/rails/action.rb +32 -16
- data/lib/cuprum/rails/actions/create.rb +62 -15
- data/lib/cuprum/rails/actions/destroy.rb +23 -7
- data/lib/cuprum/rails/actions/edit.rb +23 -7
- data/lib/cuprum/rails/actions/index.rb +30 -10
- data/lib/cuprum/rails/actions/middleware/associations/cache.rb +112 -0
- data/lib/cuprum/rails/actions/middleware/associations/find.rb +23 -0
- data/lib/cuprum/rails/actions/middleware/associations/parent.rb +70 -0
- data/lib/cuprum/rails/actions/middleware/associations/query.rb +140 -0
- data/lib/cuprum/rails/actions/middleware/associations.rb +12 -0
- data/lib/cuprum/rails/actions/middleware/log_request.rb +126 -0
- data/lib/cuprum/rails/actions/middleware/log_result.rb +51 -0
- data/lib/cuprum/rails/actions/middleware/resources/find.rb +44 -0
- data/lib/cuprum/rails/actions/middleware/resources/query.rb +91 -0
- data/lib/cuprum/rails/actions/middleware/resources.rb +11 -0
- data/lib/cuprum/rails/actions/middleware.rb +13 -0
- data/lib/cuprum/rails/actions/new.rb +16 -4
- data/lib/cuprum/rails/actions/parameter_validation.rb +60 -0
- data/lib/cuprum/rails/actions/resource_action.rb +119 -42
- data/lib/cuprum/rails/actions/show.rb +23 -7
- data/lib/cuprum/rails/actions/update.rb +70 -22
- data/lib/cuprum/rails/actions.rb +11 -7
- data/lib/cuprum/rails/collection.rb +27 -47
- data/lib/cuprum/rails/command.rb +3 -1
- data/lib/cuprum/rails/commands/destroy_one.rb +10 -6
- data/lib/cuprum/rails/commands/find_many.rb +8 -1
- data/lib/cuprum/rails/commands/find_matching.rb +1 -1
- data/lib/cuprum/rails/commands/find_one.rb +8 -0
- data/lib/cuprum/rails/commands/insert_one.rb +17 -6
- data/lib/cuprum/rails/commands/update_one.rb +16 -5
- data/lib/cuprum/rails/constraints/parameters_contract.rb +14 -0
- data/lib/cuprum/rails/constraints.rb +10 -0
- data/lib/cuprum/rails/controller.rb +12 -2
- data/lib/cuprum/rails/controllers/action.rb +100 -0
- data/lib/cuprum/rails/controllers/class_methods/actions.rb +33 -7
- data/lib/cuprum/rails/controllers/class_methods/configuration.rb +36 -0
- data/lib/cuprum/rails/controllers/class_methods/middleware.rb +88 -0
- data/lib/cuprum/rails/controllers/class_methods/validations.rb +2 -2
- data/lib/cuprum/rails/controllers/configuration.rb +41 -1
- data/lib/cuprum/rails/controllers/middleware.rb +59 -0
- data/lib/cuprum/rails/controllers.rb +2 -0
- data/lib/cuprum/rails/errors/invalid_parameters.rb +55 -0
- data/lib/cuprum/rails/errors/invalid_statement.rb +11 -0
- data/lib/cuprum/rails/errors/missing_parameter.rb +42 -0
- data/lib/cuprum/rails/errors/resource_error.rb +46 -0
- data/lib/cuprum/rails/errors.rb +6 -1
- data/lib/cuprum/rails/map_errors.rb +29 -1
- data/lib/cuprum/rails/query.rb +1 -1
- data/lib/cuprum/rails/repository.rb +12 -25
- data/lib/cuprum/rails/request.rb +149 -60
- data/lib/cuprum/rails/resource.rb +119 -85
- data/lib/cuprum/rails/responders/base_responder.rb +78 -0
- data/lib/cuprum/rails/responders/html/plural_resource.rb +9 -39
- data/lib/cuprum/rails/responders/html/rendering.rb +81 -0
- data/lib/cuprum/rails/responders/html/resource.rb +107 -0
- data/lib/cuprum/rails/responders/html/singular_resource.rb +9 -38
- data/lib/cuprum/rails/responders/html.rb +2 -0
- data/lib/cuprum/rails/responders/html_responder.rb +8 -52
- data/lib/cuprum/rails/responders/json/resource.rb +3 -3
- data/lib/cuprum/rails/responders/json_responder.rb +31 -16
- data/lib/cuprum/rails/responders/matching.rb +29 -27
- data/lib/cuprum/rails/responders/serialization.rb +11 -9
- data/lib/cuprum/rails/responders.rb +1 -0
- data/lib/cuprum/rails/responses/head_response.rb +24 -0
- data/lib/cuprum/rails/responses/html/redirect_back_response.rb +55 -0
- data/lib/cuprum/rails/responses/html/redirect_response.rb +19 -4
- data/lib/cuprum/rails/responses/html/render_response.rb +17 -5
- data/lib/cuprum/rails/responses/html.rb +6 -2
- data/lib/cuprum/rails/responses.rb +1 -0
- data/lib/cuprum/rails/result.rb +36 -0
- data/lib/cuprum/rails/routes.rb +36 -23
- data/lib/cuprum/rails/rspec/contract_helpers.rb +57 -0
- data/lib/cuprum/rails/rspec/contracts/action_contracts.rb +754 -0
- data/lib/cuprum/rails/rspec/contracts/actions/create_contracts.rb +289 -0
- data/lib/cuprum/rails/rspec/contracts/actions/destroy_contracts.rb +164 -0
- data/lib/cuprum/rails/rspec/contracts/actions/edit_contracts.rb +73 -0
- data/lib/cuprum/rails/rspec/contracts/actions/index_contracts.rb +108 -0
- data/lib/cuprum/rails/rspec/contracts/actions/new_contracts.rb +111 -0
- data/lib/cuprum/rails/rspec/contracts/actions/show_contracts.rb +72 -0
- data/lib/cuprum/rails/rspec/contracts/actions/update_contracts.rb +263 -0
- data/lib/cuprum/rails/rspec/contracts/actions.rb +8 -0
- data/lib/cuprum/rails/rspec/contracts/command_contracts.rb +479 -0
- data/lib/cuprum/rails/rspec/contracts/responder_contracts.rb +232 -0
- data/lib/cuprum/rails/rspec/contracts/routes_contracts.rb +363 -0
- data/lib/cuprum/rails/rspec/contracts/serializers_contracts.rb +70 -0
- data/lib/cuprum/rails/rspec/contracts.rb +8 -0
- data/lib/cuprum/rails/rspec/matchers/be_a_result_matcher.rb +64 -0
- data/lib/cuprum/rails/rspec/matchers.rb +41 -0
- data/lib/cuprum/rails/serializers/base_serializer.rb +60 -0
- data/lib/cuprum/rails/serializers/context.rb +84 -0
- data/lib/cuprum/rails/serializers/json/active_record_serializer.rb +2 -2
- data/lib/cuprum/rails/serializers/json/array_serializer.rb +9 -8
- data/lib/cuprum/rails/serializers/json/attributes_serializer.rb +95 -172
- data/lib/cuprum/rails/serializers/json/error_serializer.rb +2 -2
- data/lib/cuprum/rails/serializers/json/hash_serializer.rb +9 -8
- data/lib/cuprum/rails/serializers/json/identity_serializer.rb +3 -3
- data/lib/cuprum/rails/serializers/json/properties_serializer.rb +252 -0
- data/lib/cuprum/rails/serializers/json.rb +2 -1
- data/lib/cuprum/rails/serializers.rb +3 -1
- data/lib/cuprum/rails/version.rb +1 -1
- data/lib/cuprum/rails.rb +19 -16
- metadata +73 -131
- data/lib/cuprum/rails/controller_action.rb +0 -121
- data/lib/cuprum/rails/errors/missing_parameters.rb +0 -33
- data/lib/cuprum/rails/errors/missing_primary_key.rb +0 -46
- data/lib/cuprum/rails/errors/undefined_permitted_attributes.rb +0 -34
- data/lib/cuprum/rails/rspec/command_contract.rb +0 -460
- data/lib/cuprum/rails/rspec/define_route_contract.rb +0 -84
- data/lib/cuprum/rails/serializers/json/serializer.rb +0 -66
@@ -1,84 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'cuprum/rails/rspec'
|
4
|
-
|
5
|
-
module Cuprum::Rails::RSpec
|
6
|
-
# Contract asserting that a Routes object defines the given route.
|
7
|
-
DEFINE_ROUTE_CONTRACT = lambda \
|
8
|
-
do |action_name:, path:, member_action: false, wildcards: {}|
|
9
|
-
describe "##{action_name}_path" do
|
10
|
-
let(:method_name) { "#{action_name}_path" }
|
11
|
-
let(:expected) do
|
12
|
-
next path unless member_action
|
13
|
-
|
14
|
-
primary_key_name = entity.class.primary_key
|
15
|
-
primary_key_value = entity[primary_key_name]
|
16
|
-
|
17
|
-
path.sub(':id', primary_key_value.to_s)
|
18
|
-
end
|
19
|
-
|
20
|
-
define_method(:route_helper) do
|
21
|
-
scoped = wildcards.empty? ? routes : routes.with_wildcards(wildcards)
|
22
|
-
|
23
|
-
if member_action
|
24
|
-
scoped.send(method_name, entity)
|
25
|
-
else
|
26
|
-
scoped.send(method_name)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'should define the helper method' do
|
31
|
-
if member_action
|
32
|
-
expect(routes).to respond_to(method_name).with(1).argument
|
33
|
-
else
|
34
|
-
expect(routes).to respond_to(method_name).with(0).arguments
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'should return the route path' do
|
39
|
-
expect(route_helper).to be == expected
|
40
|
-
end
|
41
|
-
|
42
|
-
if member_action
|
43
|
-
describe 'when the entity is nil' do
|
44
|
-
let(:entity) { nil }
|
45
|
-
let(:error_message) { 'missing wildcard :id' }
|
46
|
-
|
47
|
-
it 'should raise an exception' do
|
48
|
-
expect { route_helper }
|
49
|
-
.to raise_error(
|
50
|
-
described_class::MissingWildcardError,
|
51
|
-
error_message
|
52
|
-
)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
wildcards.each do |key, _|
|
58
|
-
wildcard = key.to_s.end_with?('_id') ? key.intern : :"#{key}_id"
|
59
|
-
|
60
|
-
describe "when the #{wildcard.inspect} wildcard is undefined" do
|
61
|
-
let(:error_message) { "missing wildcard #{wildcard.inspect}" }
|
62
|
-
|
63
|
-
define_method(:route_helper) do
|
64
|
-
scoped = routes.with_wildcards(wildcards.except(key))
|
65
|
-
|
66
|
-
if member_action
|
67
|
-
scoped.send(method_name, entity)
|
68
|
-
else
|
69
|
-
scoped.send(method_name)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
it 'should raise an exception' do
|
74
|
-
expect { route_helper }
|
75
|
-
.to raise_error(
|
76
|
-
described_class::MissingWildcardError,
|
77
|
-
error_message
|
78
|
-
)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'cuprum/rails/serializers/json'
|
4
|
-
|
5
|
-
module Cuprum::Rails::Serializers::Json
|
6
|
-
# Converts objects or data structures to JSON based on configured serializers.
|
7
|
-
class Serializer
|
8
|
-
# Error class used when a serializer calls itself.
|
9
|
-
class RecursiveSerializerError < StandardError; end
|
10
|
-
|
11
|
-
# Error class used when there is no matching serializer for the object.
|
12
|
-
class UndefinedSerializerError < StandardError; end
|
13
|
-
|
14
|
-
# @return [Cuprum::Rails::Serializers::Json::Serializer] a cached instance
|
15
|
-
# of the serializer.
|
16
|
-
def self.instance
|
17
|
-
@instance ||= new
|
18
|
-
end
|
19
|
-
|
20
|
-
# Converts the object to JSON using the given serializers.
|
21
|
-
#
|
22
|
-
# First, #call finds the best serializer from the :serializers Hash. This is
|
23
|
-
# done by walking up the object class's ancestors to find the closest
|
24
|
-
# ancestor which is a key in the :serializers Hash. The corresponding value
|
25
|
-
# is then called with the object.
|
26
|
-
#
|
27
|
-
# @param object [Object] The object to convert to JSON.
|
28
|
-
# @param serializers [Hash<Class, #call>] The serializers for different
|
29
|
-
# object types.
|
30
|
-
#
|
31
|
-
# @return [Object] a JSON-compatible representation of the object.
|
32
|
-
#
|
33
|
-
# @raise RecursiveSerializerError if the serializer would create an infinite
|
34
|
-
# loop, e.g. by calling itself.
|
35
|
-
# @raise UndefinedSerializerError if there is no matching serializer for
|
36
|
-
# the object.
|
37
|
-
def call(object, serializers:)
|
38
|
-
serializer = handle_recursion!(object) do
|
39
|
-
serializer_for(object: object, serializers: serializers)
|
40
|
-
end
|
41
|
-
|
42
|
-
serializer.call(object, serializers: serializers)
|
43
|
-
end
|
44
|
-
|
45
|
-
private
|
46
|
-
|
47
|
-
def handle_recursion!(object)
|
48
|
-
serializer = yield
|
49
|
-
|
50
|
-
return serializer unless instance_of?(serializer.class)
|
51
|
-
|
52
|
-
raise RecursiveSerializerError,
|
53
|
-
"invalid serializer for #{object.class.name} - recursive calls to" \
|
54
|
-
" #{self.class.name}#call"
|
55
|
-
end
|
56
|
-
|
57
|
-
def serializer_for(object:, serializers:)
|
58
|
-
object.class.ancestors.each do |ancestor|
|
59
|
-
return serializers[ancestor] if serializers.key?(ancestor)
|
60
|
-
end
|
61
|
-
|
62
|
-
raise UndefinedSerializerError,
|
63
|
-
"no serializer defined for #{object.class.name}"
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|