appfuel 0.5.8 → 0.5.9
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/appfuel.gemspec +2 -2
- data/lib/appfuel/application/dispatcher.rb +2 -0
- data/lib/appfuel/domain/dsl.rb +7 -12
- data/lib/appfuel/domain/entity.rb +1 -2
- data/lib/appfuel/handler/base.rb +15 -0
- data/lib/appfuel/handler/command.rb +0 -11
- data/lib/appfuel/handler/handler_failure.rb +11 -0
- data/lib/appfuel/handler.rb +1 -0
- data/lib/appfuel/initializers/all.rb +1 -1
- data/lib/appfuel/initializers/{aws_dynamodb.rb → dynamodb.rb} +3 -3
- data/lib/appfuel/storage/dynamodb/adapter.rb +140 -0
- data/lib/appfuel/storage/{aws_dynamodb → dynamodb}/repository.rb +9 -4
- data/lib/appfuel/storage/dynamodb.rb +2 -0
- data/lib/appfuel/storage/repository/base.rb +2 -2
- data/lib/appfuel/version.rb +1 -1
- metadata +11 -10
- data/lib/appfuel/storage/aws_dynamodb/no_sql_model.rb +0 -60
- data/lib/appfuel/storage/aws_dynamodb.rb +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01694bfb7b1b82467a7416337c19a837a8eb47e4
|
4
|
+
data.tar.gz: 70eff28c04fa90216add52b3a443af8697c41404
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e88d8348a698285e0443f61b26a5bf2be05b689b63eb4d079b63416f0981bb04e9a473027a7baf1900b04837c6e1311a1298a4511de9efd8234402c897e4644
|
7
|
+
data.tar.gz: 7fab691e8d97d7a35c875b890869f9be117713faa63f66efe977cf3f28fa7febe6330bd6441a3708bf2f15f456f0247536a92117ccf120edf3dd053899d4bc4b
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file. (Pending ap
|
|
5
5
|
|
6
6
|
|
7
7
|
# Releases
|
8
|
+
## [[0.5.9]](https://github.com/rsb/appfuel/releases/tag/0.5.8) 2017-07-27
|
9
|
+
### Added
|
10
|
+
- Adding a `run!` to handler which deals with failures
|
11
|
+
- Adding a HandlerFailure has for when the handler fails
|
12
|
+
- New interfaces for the aws dynamo db adapter
|
13
|
+
|
14
|
+
### Fixed
|
15
|
+
- Domain dsl attribute with array member and default is now working
|
16
|
+
- Updating dry-validations & dry-types
|
8
17
|
|
9
18
|
## [[0.5.8]](https://github.com/rsb/appfuel/releases/tag/0.5.8) 2017-07-20
|
10
19
|
### Fixed
|
data/appfuel.gemspec
CHANGED
@@ -25,9 +25,9 @@ Gem::Specification.new do |spec|
|
|
25
25
|
# or the way I am using it.
|
26
26
|
spec.add_dependency "activerecord", "~> 5.1.1"
|
27
27
|
spec.add_dependency "pg", "~> 0.20"
|
28
|
-
spec.add_dependency "dry-types", "0.
|
28
|
+
spec.add_dependency "dry-types", "0.11"
|
29
29
|
spec.add_dependency "dry-container", "~> 0.6"
|
30
|
-
spec.add_dependency "dry-validation", "~> 0.
|
30
|
+
spec.add_dependency "dry-validation", "~> 0.11"
|
31
31
|
spec.add_dependency "dry-monads", "~> 0.2"
|
32
32
|
spec.add_dependency "dry-configurable", "~> 0.6"
|
33
33
|
spec.add_dependency "parslet", "~> 1.8.0"
|
@@ -7,6 +7,8 @@ module Appfuel
|
|
7
7
|
container[:feature_initializer].call(request.feature, container)
|
8
8
|
action = container[:action_loader].call(request.namespace, container)
|
9
9
|
response = action.run(request.inputs)
|
10
|
+
rescue Appfuel::Handler::HandlerFailure => e
|
11
|
+
response = e.response
|
10
12
|
rescue => e
|
11
13
|
handler = Appfuel::ResponseHandler.new
|
12
14
|
response = handler.error(e)
|
data/lib/appfuel/domain/dsl.rb
CHANGED
@@ -85,11 +85,8 @@ module Appfuel
|
|
85
85
|
def build_type(type_str, **options)
|
86
86
|
base = type_str.split('.').last
|
87
87
|
type = Types[type_str]
|
88
|
-
type = apply_defaults(type, options)
|
89
88
|
type = apply_optional(type, options)
|
90
|
-
|
91
89
|
nil_is_allowed = allow_nil?(options)
|
92
|
-
|
93
90
|
type = case base
|
94
91
|
when 'hash' then handle_hash(type, options)
|
95
92
|
when 'array' then handle_array(type, options)
|
@@ -97,6 +94,7 @@ module Appfuel
|
|
97
94
|
type
|
98
95
|
end
|
99
96
|
|
97
|
+
type = apply_defaults(type, options)
|
100
98
|
type = apply_constraints(type, options)
|
101
99
|
|
102
100
|
# You have to apply all the contraints before summing nil
|
@@ -208,23 +206,20 @@ module Appfuel
|
|
208
206
|
end
|
209
207
|
|
210
208
|
def handle_array(type, options)
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
end
|
216
|
-
type
|
209
|
+
return type unless options.key?(:member)
|
210
|
+
member = options.delete(:member)
|
211
|
+
member = member.is_a?(String) ? Types[member] : member
|
212
|
+
type.member(member)
|
217
213
|
end
|
218
214
|
|
219
215
|
def apply_defaults(type, options)
|
220
216
|
return type unless options.key?(:default)
|
221
|
-
|
222
|
-
type.default(
|
217
|
+
default_value = options.delete(:default)
|
218
|
+
type.default(default_value)
|
223
219
|
end
|
224
220
|
|
225
221
|
def apply_optional(type, options)
|
226
222
|
return type unless options.key?(:optional)
|
227
|
-
|
228
223
|
options.delete(:optional)
|
229
224
|
type.optional
|
230
225
|
end
|
@@ -189,10 +189,9 @@ module Appfuel
|
|
189
189
|
end
|
190
190
|
|
191
191
|
def initialize_value(key, type, input)
|
192
|
-
if input == Types::Undefined && type.default?
|
192
|
+
if (input == Types::Undefined || input == nil) && type.default?
|
193
193
|
input = type[nil]
|
194
194
|
end
|
195
|
-
|
196
195
|
# manual overrides have to manually type check themselves
|
197
196
|
setter = "#{key}="
|
198
197
|
return send(setter, input) if respond_to?(setter)
|
data/lib/appfuel/handler/base.rb
CHANGED
@@ -41,6 +41,13 @@ module Appfuel
|
|
41
41
|
result
|
42
42
|
end
|
43
43
|
|
44
|
+
def run!(inputs = {}, container = Dry::Container.new)
|
45
|
+
result = run(inputs, container)
|
46
|
+
fail_handler!(result) if result.failure?
|
47
|
+
|
48
|
+
result.ok
|
49
|
+
end
|
50
|
+
|
44
51
|
def error(*args)
|
45
52
|
response_handler.error(*args)
|
46
53
|
end
|
@@ -57,6 +64,14 @@ module Appfuel
|
|
57
64
|
response_handler.create_response(data)
|
58
65
|
end
|
59
66
|
|
67
|
+
def fail_handler!(response)
|
68
|
+
raise create_handler_failure(response)
|
69
|
+
end
|
70
|
+
|
71
|
+
def create_handler_failure(response)
|
72
|
+
title = "#{container_class_path} Failed:"
|
73
|
+
HandlerFailure.new(title, response)
|
74
|
+
end
|
60
75
|
end
|
61
76
|
|
62
77
|
attr_reader :data
|
@@ -5,17 +5,6 @@ module Appfuel
|
|
5
5
|
def container_class_type
|
6
6
|
'commands'
|
7
7
|
end
|
8
|
-
|
9
|
-
def resolve_dependencies(results = Dry::Container.new)
|
10
|
-
=begin
|
11
|
-
super
|
12
|
-
resolve_container(results)
|
13
|
-
resolve_domains(results)
|
14
|
-
resolve_db_models(results)
|
15
|
-
resolve_repos(results)
|
16
|
-
results
|
17
|
-
=end
|
18
|
-
end
|
19
8
|
end
|
20
9
|
end
|
21
10
|
end
|
data/lib/appfuel/handler.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
Appfuel::Initialize.define('global.
|
1
|
+
Appfuel::Initialize.define('global.dynamodb') do |config, container|
|
2
2
|
require 'aws-sdk'
|
3
|
-
require 'appfuel/storage/
|
3
|
+
require 'appfuel/storage/dynamodb'
|
4
4
|
|
5
5
|
env = config[:env]
|
6
6
|
endpoint = config[:aws][:dynamodb][:endpoint]
|
@@ -14,5 +14,5 @@ Appfuel::Initialize.define('global.aws_dynamodb') do |config, container|
|
|
14
14
|
|
15
15
|
|
16
16
|
client = Aws::DynamoDB::Client.new
|
17
|
-
container.register(Appfuel::
|
17
|
+
container.register(Appfuel::Dynamodb::CLIENT_CONTAINER_KEY, client)
|
18
18
|
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
module Appfuel
|
2
|
+
module Dynamodb
|
3
|
+
CLIENT_CONTAINER_KEY = 'aws.dynamodb.client'
|
4
|
+
|
5
|
+
class NoSqlModel
|
6
|
+
include Appfuel::Application::AppContainer
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def container_class_type
|
10
|
+
'dynamodb'
|
11
|
+
end
|
12
|
+
|
13
|
+
def config_key(value = nil)
|
14
|
+
return @config_key if value.nil?
|
15
|
+
@config_key = value.to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
def load_config
|
19
|
+
config = app_container[:config]
|
20
|
+
key = config_key.to_s
|
21
|
+
if key.include?('.')
|
22
|
+
keys = key.split('.').map {|k| k.to_sym}
|
23
|
+
else
|
24
|
+
keys = [config_key]
|
25
|
+
end
|
26
|
+
|
27
|
+
@config ||= keys.each.inject(config) do |c, k|
|
28
|
+
unless c.key?(k)
|
29
|
+
fail "[dynamodb] config key (#{k}) not found - #{self}"
|
30
|
+
end
|
31
|
+
c[k]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def config
|
36
|
+
@config ||= load_config
|
37
|
+
end
|
38
|
+
|
39
|
+
def table_prefix
|
40
|
+
@table_prefex ||= config[:table_prefix]
|
41
|
+
end
|
42
|
+
|
43
|
+
def client
|
44
|
+
@client ||= app_container[CLIENT_CONTAINER_KEY]
|
45
|
+
end
|
46
|
+
|
47
|
+
def indexes
|
48
|
+
@indexes ||= {}
|
49
|
+
end
|
50
|
+
|
51
|
+
def table_name(value = nil)
|
52
|
+
return @table_name if value.nil?
|
53
|
+
@table_name = "#{table_prefix}#{value}"
|
54
|
+
end
|
55
|
+
|
56
|
+
def index(index_key, index_name)
|
57
|
+
indexes[index_key.to_sym] = "#{table_prefix}#{index_name}"
|
58
|
+
end
|
59
|
+
|
60
|
+
def inherited(klass)
|
61
|
+
stage_class_for_registration(klass)
|
62
|
+
end
|
63
|
+
|
64
|
+
def primary_key(hash_key, hash_type, range_key = nil, range_type = nil)
|
65
|
+
@primary_key = [ {hash_key => hash_type.to_s.downcase} ]
|
66
|
+
unless range_key.nil?
|
67
|
+
fail "range type is required" if range_type.nil?
|
68
|
+
@primary_key << { range_key => range_type }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Instance methods
|
74
|
+
|
75
|
+
def client
|
76
|
+
self.class.client
|
77
|
+
end
|
78
|
+
|
79
|
+
def table_name
|
80
|
+
self.class.table_name
|
81
|
+
end
|
82
|
+
|
83
|
+
def table_prefix
|
84
|
+
self.class.table_prefix
|
85
|
+
end
|
86
|
+
|
87
|
+
def index_name(key)
|
88
|
+
unless self.class.indexes.key?(key)
|
89
|
+
fail "index #{key} has not been registered"
|
90
|
+
end
|
91
|
+
self.class.indexes[key]
|
92
|
+
end
|
93
|
+
|
94
|
+
def put_params(data)
|
95
|
+
{
|
96
|
+
table_name: table_name,
|
97
|
+
item: data
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
def table_params(keys ={})
|
102
|
+
{
|
103
|
+
table_name: table_name,
|
104
|
+
key: keys
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
def query_select_map(type)
|
109
|
+
case type
|
110
|
+
when :all_attrs then 'ALL_ATTRIBUTES'
|
111
|
+
when :all_projected then 'ALL_PROJECTED_ATTRIBUTES'
|
112
|
+
when :count then 'COUNT'
|
113
|
+
when :specific then 'SPECIFIC_ATTRIBUTES'
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def select_index_params(key, attrs_returned, key_expr, values = {})
|
118
|
+
{
|
119
|
+
table_name: table_name,
|
120
|
+
index_name: index_name(key),
|
121
|
+
select: query_select_map(attrs_returned),
|
122
|
+
key_condition_expression: key_expr,
|
123
|
+
expression_attribute_values: values
|
124
|
+
}
|
125
|
+
end
|
126
|
+
|
127
|
+
def select_index(key, select, key_expr, values = {})
|
128
|
+
params = select_index_params(key, select, key_expr, values)
|
129
|
+
client.query(params)
|
130
|
+
end
|
131
|
+
|
132
|
+
def index_query_params(key, opts = {})
|
133
|
+
if opts.key?(:select)
|
134
|
+
params[:select] = query_select_map(opts[:select])
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -1,18 +1,23 @@
|
|
1
1
|
module Appfuel
|
2
|
-
module
|
2
|
+
module Dynamodb
|
3
3
|
class Repository < Appfuel::Repository::Base
|
4
4
|
class << self
|
5
5
|
def container_class_type
|
6
|
-
"#{super}.
|
6
|
+
"#{super}.dynamodb"
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
10
|
def storage_class(domain_name)
|
11
|
-
mapper.storage_class('
|
11
|
+
mapper.storage_class('dynamodb', domain_name)
|
12
12
|
end
|
13
13
|
|
14
14
|
def to_entity(domain_name, storage)
|
15
|
-
super(domain_name, '
|
15
|
+
super(domain_name, 'dynamodb', storage)
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def to_storage(domain, opts = {})
|
20
|
+
super(domain, 'dynamodb', opts)
|
16
21
|
end
|
17
22
|
end
|
18
23
|
end
|
@@ -191,8 +191,8 @@ module Appfuel
|
|
191
191
|
mapper.exists?(expr)
|
192
192
|
end
|
193
193
|
|
194
|
-
def to_storage(entity,
|
195
|
-
mapper.to_storage(entity,
|
194
|
+
def to_storage(entity, type, opts = {})
|
195
|
+
mapper.to_storage(entity, type, opts)
|
196
196
|
end
|
197
197
|
|
198
198
|
def to_entity(domain_name, type, storage)
|
data/lib/appfuel/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appfuel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Scott-Buccleuch
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: '0.11'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: '0.11'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: dry-container
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0.
|
75
|
+
version: '0.11'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.
|
82
|
+
version: '0.11'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: dry-monads
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -311,13 +311,14 @@ files:
|
|
311
311
|
- lib/appfuel/handler/action.rb
|
312
312
|
- lib/appfuel/handler/base.rb
|
313
313
|
- lib/appfuel/handler/command.rb
|
314
|
+
- lib/appfuel/handler/handler_failure.rb
|
314
315
|
- lib/appfuel/handler/inject_dsl.rb
|
315
316
|
- lib/appfuel/handler/validator_dsl.rb
|
316
317
|
- lib/appfuel/initialize.rb
|
317
318
|
- lib/appfuel/initialize/initializer.rb
|
318
319
|
- lib/appfuel/initializers/all.rb
|
319
|
-
- lib/appfuel/initializers/aws_dynamodb.rb
|
320
320
|
- lib/appfuel/initializers/db.rb
|
321
|
+
- lib/appfuel/initializers/dynamodb.rb
|
321
322
|
- lib/appfuel/initializers/logging.rb
|
322
323
|
- lib/appfuel/initializers/web_api.rb
|
323
324
|
- lib/appfuel/log_formatter.rb
|
@@ -331,9 +332,6 @@ files:
|
|
331
332
|
- lib/appfuel/root_module.rb
|
332
333
|
- lib/appfuel/run_error.rb
|
333
334
|
- lib/appfuel/storage.rb
|
334
|
-
- lib/appfuel/storage/aws_dynamodb.rb
|
335
|
-
- lib/appfuel/storage/aws_dynamodb/no_sql_model.rb
|
336
|
-
- lib/appfuel/storage/aws_dynamodb/repository.rb
|
337
335
|
- lib/appfuel/storage/db.rb
|
338
336
|
- lib/appfuel/storage/db/active_record_model.rb
|
339
337
|
- lib/appfuel/storage/db/mapper.rb
|
@@ -342,6 +340,9 @@ files:
|
|
342
340
|
- lib/appfuel/storage/db/migration_tasks.rb
|
343
341
|
- lib/appfuel/storage/db/repository.rb
|
344
342
|
- lib/appfuel/storage/db/repository_query.rb
|
343
|
+
- lib/appfuel/storage/dynamodb.rb
|
344
|
+
- lib/appfuel/storage/dynamodb/adapter.rb
|
345
|
+
- lib/appfuel/storage/dynamodb/repository.rb
|
345
346
|
- lib/appfuel/storage/file.rb
|
346
347
|
- lib/appfuel/storage/file/base.rb
|
347
348
|
- lib/appfuel/storage/memory.rb
|
@@ -1,60 +0,0 @@
|
|
1
|
-
module Appfuel
|
2
|
-
module AwsDynamodb
|
3
|
-
CLIENT_CONTAINER_KEY = 'aws.dynamodb.client'
|
4
|
-
class NoSqlModel
|
5
|
-
include Appfuel::Application::AppContainer
|
6
|
-
|
7
|
-
class << self
|
8
|
-
def container_class_type
|
9
|
-
'aws.dynamodb'
|
10
|
-
end
|
11
|
-
|
12
|
-
def config_key(value = nil)
|
13
|
-
return @config_key if value.nil?
|
14
|
-
@config_key = value.to_sym
|
15
|
-
end
|
16
|
-
|
17
|
-
def load_config
|
18
|
-
config = app_container[:config]
|
19
|
-
key = config_key.to_s
|
20
|
-
if key.contains?('.')
|
21
|
-
keys = config_key.split('.').map {|k| k.to_sym}
|
22
|
-
else
|
23
|
-
keys = [config_key]
|
24
|
-
end
|
25
|
-
|
26
|
-
keys.each.inject(config) do |c, k|
|
27
|
-
unless c.key?(k)
|
28
|
-
fail "[aws_dynamodb] config key (#{k}) not found - #{self}"
|
29
|
-
end
|
30
|
-
c[k]
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def load_client
|
35
|
-
app_container[CLIENT_CONTAINER_KEY]
|
36
|
-
end
|
37
|
-
|
38
|
-
def table_name(value = nil)
|
39
|
-
return @table_name if value.nil?
|
40
|
-
|
41
|
-
prefix = load_config[:table_prefix]
|
42
|
-
@table_name = "#{prefix}#{value}"
|
43
|
-
end
|
44
|
-
|
45
|
-
def inherited(klass)
|
46
|
-
stage_class_for_registration(klass)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
attr_reader :config, :client
|
51
|
-
|
52
|
-
def initialize
|
53
|
-
@client = self.class.load_client
|
54
|
-
@config = self.class.load_config
|
55
|
-
@table_prefix = @config.fetch(:table_prefix) { '' }
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|