trailblazer-rails 0.1.1 → 0.1.2
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/CHANGES.md +3 -0
- data/Gemfile +1 -1
- data/lib/trailblazer/operation/controller/active_record.rb +16 -0
- data/lib/trailblazer/operation/responder.rb +23 -0
- data/lib/trailblazer/operation/worker.rb +112 -0
- data/lib/trailblazer/rails.rb +13 -1
- data/lib/trailblazer/rails/autoloading.rb +3 -0
- data/lib/trailblazer/rails/version.rb +1 -1
- data/trailblazer-rails.gemspec +10 -1
- metadata +93 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aac136aa3a451f9bb921b30839339a4025ad1190
|
4
|
+
data.tar.gz: 0fc514ed8bd3d5db1348ffd1204cdffe6f069e62
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e67247d81be9ab89701789a2329862bf1ad99c538045c7125b4d9dd6efd74ce7e442c64cef5c0fc48955891ce40372542d79801bf12dee80d132c18f92d54b3
|
7
|
+
data.tar.gz: a75536b6d32c0665115653417abad1ac3dc1683431396958fdcd288cf0e5ed1fd333e0f52c6a860607a2e0d1fa820ca9977768692df9990b9611d0f549c5679a
|
data/CHANGES.md
ADDED
data/Gemfile
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
# Assigns an additional instance variable for +@model+ named after the model's table name (e.g. @comment).
|
2
|
+
module Trailblazer::Operation::Controller::ActiveRecord
|
3
|
+
private
|
4
|
+
def setup_operation_instance_variables!(operation, options)
|
5
|
+
super
|
6
|
+
instance_variable_set(:"@#{operation_model_name}", @model)
|
7
|
+
end
|
8
|
+
|
9
|
+
def operation_model_name
|
10
|
+
# set the right variable name if collection
|
11
|
+
if @operation.is_a?(Trailblazer::Operation::Collection)
|
12
|
+
return @model.model.table_name.split(".").last
|
13
|
+
end
|
14
|
+
@model.class.table_name.split(".").last.singularize
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Trailblazer::Operation::Responder
|
2
|
+
def self.included(base)
|
3
|
+
base.extend ClassMethods
|
4
|
+
end
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def model_name
|
8
|
+
model_class.model_name
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
extend Forwardable
|
13
|
+
def_delegators :@model, :to_param, :destroyed?, :persisted?
|
14
|
+
|
15
|
+
def errors
|
16
|
+
return [] if @valid
|
17
|
+
[1]
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_model
|
21
|
+
@model
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'sidekiq/worker'
|
2
|
+
require 'active_support/core_ext/hash/indifferent_access'
|
3
|
+
|
4
|
+
#setup in initialize: when Op.run() with Worker, the policy will be run "delayed" and not with the actual permission set. this will result in many crashing sidekiq workers.
|
5
|
+
|
6
|
+
class Trailblazer::Operation
|
7
|
+
# only kicks in when Operation::run, #run will still do it real-time
|
8
|
+
# Works with Reform 2, only.
|
9
|
+
module Worker
|
10
|
+
def self.included(base)
|
11
|
+
base.send(:include, Sidekiq::Worker)
|
12
|
+
base.extend(ClassMethods)
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
def run(params)
|
17
|
+
if background?
|
18
|
+
return perform_async(serializable(params))
|
19
|
+
end
|
20
|
+
|
21
|
+
super(params)
|
22
|
+
end
|
23
|
+
|
24
|
+
def new(*args)
|
25
|
+
return super if args.any?
|
26
|
+
# sidekiq behavior: (not a big fan of this)
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def perform(params) # called by Sidekiq.
|
31
|
+
build_operation(params).perform
|
32
|
+
end
|
33
|
+
|
34
|
+
def jid=(jid)
|
35
|
+
puts "@@@@@ #{jid.inspect}"
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def perform_async(*args)
|
40
|
+
client_push('class' => self, 'args' => args) # calls class.new.perform(params)
|
41
|
+
end
|
42
|
+
|
43
|
+
def background? # TODO: make configurable.
|
44
|
+
true
|
45
|
+
# if Rails.env == "production" or Rails.env == "staging"
|
46
|
+
end
|
47
|
+
|
48
|
+
def serializable(params)
|
49
|
+
params # this is where we convert file uloads into Trailblazer::UploadedFile, etc. soon.
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
def perform#(params)
|
55
|
+
# the serialized params hash from Sidekiq contains a Op::UploadedFile hash.
|
56
|
+
|
57
|
+
# the following code is basically what happens in a controller.
|
58
|
+
# this is a bug in Rails, it doesn't work without requiring as/hash/ina
|
59
|
+
# params = ActiveSupport::HashWithIndifferentAccess.new_from_hash_copying_default(params) # TODO: this might make it ultra-slow as Reform converts it back to strings.
|
60
|
+
params = @params.with_indifferent_access
|
61
|
+
@params = deserializable(params)
|
62
|
+
run
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
def deserializable(params)
|
67
|
+
params # this is where we convert file uloads into Trailblazer::UploadedFile, etc. soon.
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
# Overrides ::serializable and #deserializable and handles file properties from the Contract schema.
|
72
|
+
module FileMarshaller
|
73
|
+
# NOTE: this is WIP and the implementation will be more understandable and performant soon.
|
74
|
+
def self.included(base)
|
75
|
+
base.extend ClassMethods
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
private
|
80
|
+
module ClassMethods
|
81
|
+
def file_marshaller_representer
|
82
|
+
@file_marshaller_representer ||= contract_class.schema(include: [Representable::Hash]).apply do |dfn|
|
83
|
+
dfn.merge!(
|
84
|
+
getter: lambda { |*| self[dfn.name.to_sym] },
|
85
|
+
setter: lambda { |fragment, *| self[dfn.name.to_s] = fragment }
|
86
|
+
) # FIXME: allow both sym and str.
|
87
|
+
|
88
|
+
dfn.merge!(class: Hash) and next if dfn[:form] or dfn[:twin] # nested properties need a class for deserialization.
|
89
|
+
next unless dfn[:file]
|
90
|
+
|
91
|
+
# TODO: where do we set /tmp/uploads?
|
92
|
+
dfn.merge!(
|
93
|
+
serialize: lambda { |file, *| Trailblazer::Operation::UploadedFile.new(file, tmp_dir: "/tmp/uploads").to_hash },
|
94
|
+
deserialize: lambda { |object, hash, *| Trailblazer::Operation::UploadedFile.from_hash(hash) },
|
95
|
+
class: Hash
|
96
|
+
)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def serializable(params)
|
101
|
+
file_marshaller_representer.new(params).to_hash
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# todo: do with_indifferent_access in #deserialize and call super here.
|
106
|
+
def deserializable(hash)
|
107
|
+
# self.class.file_marshaller_representer.new({}).extend(Representable::Debug).from_hash(hash)
|
108
|
+
self.class.file_marshaller_representer.new({}.with_indifferent_access).from_hash(hash)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
data/lib/trailblazer/rails.rb
CHANGED
@@ -8,9 +8,21 @@ end
|
|
8
8
|
|
9
9
|
require "trailblazer/rails/railtie"
|
10
10
|
|
11
|
+
require "trailblazer/operation"
|
12
|
+
# TODO: remove that once i18n, validations etc in Reform/AM are sorted.
|
13
|
+
Trailblazer::Operation.contract_class.class_eval do
|
14
|
+
def self.name
|
15
|
+
# for whatever reason, validations climb up the inheritance tree and require _every_ class to have a name (4.1).
|
16
|
+
"Reform::Form"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
11
20
|
# Automatically set model_name on operation's contract when `Op::Model` is included.
|
12
21
|
require "trailblazer/operation/model"
|
13
22
|
require "trailblazer/operation/model/active_model"
|
14
23
|
Trailblazer::Operation::Model::DSL.module_eval do
|
15
24
|
include Trailblazer::Operation::Model::ActiveModel # ::contract.
|
16
|
-
end
|
25
|
+
end
|
26
|
+
|
27
|
+
require "trailblazer/autoloading"
|
28
|
+
require "trailblazer/rails/autoloading"
|
data/trailblazer-rails.gemspec
CHANGED
@@ -17,10 +17,19 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
|
-
spec.add_dependency "trailblazer", ">= 1.0.0
|
20
|
+
spec.add_dependency "trailblazer", ">= 1.0.0"
|
21
21
|
|
22
22
|
spec.add_development_dependency "bundler", "~> 1.10"
|
23
23
|
spec.add_development_dependency "rake", "~> 10.0"
|
24
24
|
spec.add_development_dependency "minitest"
|
25
25
|
spec.add_development_dependency "rails"
|
26
|
+
spec.add_development_dependency "actionpack", '>= 3.0.0' # Rails is optional.
|
27
|
+
spec.add_development_dependency "sqlite3"
|
28
|
+
spec.add_development_dependency "responders"
|
29
|
+
spec.add_development_dependency "database_cleaner"
|
30
|
+
spec.add_development_dependency "sidekiq", ">= 3.1.0"
|
31
|
+
|
32
|
+
spec.add_development_dependency "multi_json"
|
33
|
+
|
34
|
+
|
26
35
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trailblazer-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Sutterer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: trailblazer
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.0.0
|
19
|
+
version: 1.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.0.0
|
26
|
+
version: 1.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +80,90 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: actionpack
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 3.0.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 3.0.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: sqlite3
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: responders
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: database_cleaner
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: sidekiq
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 3.1.0
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 3.1.0
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: multi_json
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
83
167
|
description:
|
84
168
|
email:
|
85
169
|
- apotonick@gmail.com
|
@@ -89,12 +173,17 @@ extra_rdoc_files: []
|
|
89
173
|
files:
|
90
174
|
- ".gitignore"
|
91
175
|
- ".travis.yml"
|
176
|
+
- CHANGES.md
|
92
177
|
- Gemfile
|
93
178
|
- LICENSE.txt
|
94
179
|
- README.md
|
95
180
|
- Rakefile
|
181
|
+
- lib/trailblazer/operation/controller/active_record.rb
|
96
182
|
- lib/trailblazer/operation/model/active_model.rb
|
183
|
+
- lib/trailblazer/operation/responder.rb
|
184
|
+
- lib/trailblazer/operation/worker.rb
|
97
185
|
- lib/trailblazer/rails.rb
|
186
|
+
- lib/trailblazer/rails/autoloading.rb
|
98
187
|
- lib/trailblazer/rails/railtie.rb
|
99
188
|
- lib/trailblazer/rails/version.rb
|
100
189
|
- trailblazer-rails.gemspec
|