trailblazer-rails 0.2.4 → 2.4.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.
@@ -0,0 +1,21 @@
1
+ module Trailblazer
2
+ class Rails::Form < SimpleDelegator
3
+ def initialize(delegated, model_class)
4
+ super(delegated)
5
+ @model_class = model_class
6
+ end
7
+
8
+ def self.name
9
+ # for whatever reason, validations climb up the inheritance tree and require _every_ class to have a name (4.1).
10
+ "Reform::Form"
11
+ end
12
+
13
+ def model_name
14
+ ::ActiveModel::Name.new(self, nil, @model_class.to_s.camelize)
15
+ end
16
+
17
+ def to_model
18
+ self
19
+ end
20
+ end
21
+ end
@@ -1,40 +1,25 @@
1
1
  require "rails/railtie"
2
- require "trailblazer/loader"
3
2
 
4
3
  module Trailblazer
5
4
  class Railtie < ::Rails::Railtie
6
- def self.load_concepts(app)
7
- Loader.new.(insert: [ModelFile, before: Loader::AddConceptFiles]) { |file| require_dependency("#{app.root}/#{file}") }
8
- end
9
-
10
- # This is to autoload Operation::Dispatch, etc. I'm simply assuming people find this helpful in Rails.
11
- initializer "trailblazer.library_autoloading" do
12
- require "trailblazer/autoloading"
13
- end
5
+ config.trailblazer = ActiveSupport::OrderedOptions.new
6
+ ## Accept also an Array of controllers
7
+ config.trailblazer.application_controller ||= %w[ActionController::Base ActionController::API]
8
+ config.trailblazer.enable_tracing ||= false
14
9
 
15
- # thank you, http://stackoverflow.com/a/17573888/465070
16
- initializer 'trailblazer.install', after: :load_config_initializers do |app|
17
- # the trb autoloading has to be run after initializers have been loaded, so we can tweak inclusion of features in
18
- # initializers.
19
- ActionDispatch::Reloader.to_prepare do
20
- Trailblazer::Railtie.load_concepts(app)
10
+ initializer "trailblazer.application_controller", before: "finisher_hook" do
11
+ ActiveSupport.on_load(:action_controller) do |app|
12
+ Trailblazer::Railtie.extend_application_controller!(app)
21
13
  end
22
14
  end
23
15
 
24
- # initializer "trailblazer.roar" do
25
- # require "trailblazer/rails/roar" #if Object.const_defined?(:Roar)
26
- # end
27
-
28
- initializer "trailblazer.application_controller" do
29
- ActiveSupport.on_load(:action_controller) do
30
- include Trailblazer::Operation::Controller
16
+ def extend_application_controller!(app)
17
+ controllers = Array(::Rails.application.config.trailblazer.application_controller).map(&:to_s)
18
+ if controllers.include? app.to_s
19
+ app.send :include, Trailblazer::Rails::Controller
20
+ app.send :include, Trailblazer::Rails::Controller::Cell if defined?(::Cell)
31
21
  end
32
- end
33
-
34
- # Prepend model file, before the concept files like operation.rb get loaded.
35
- ModelFile = ->(input, options) do
36
- model = "app/models/#{options[:name]}.rb"
37
- File.exist?(model) ? [model]+input : input
22
+ app
38
23
  end
39
24
  end
40
25
  end
@@ -1,5 +1,5 @@
1
1
  module Trailblazer
2
2
  module Rails
3
- VERSION = "0.2.4"
3
+ VERSION = "2.4.1".freeze
4
4
  end
5
5
  end
@@ -2,27 +2,11 @@ require "trailblazer/rails/version"
2
2
 
3
3
  module Trailblazer
4
4
  module Rails
5
- # Your code goes here...
6
5
  end
7
6
  end
8
7
 
8
+ require "trailblazer/rails/controller"
9
+ require "trailblazer/rails/cell"
10
+ require "trailblazer/rails/form"
9
11
  require "trailblazer/rails/railtie"
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
-
20
- # Automatically set model_name on operation's contract when `Op::Model` is included.
21
- require "trailblazer/operation/model"
22
- require "trailblazer/operation/model/active_model"
23
- Trailblazer::Operation::Model::DSL.module_eval do
24
- include Trailblazer::Operation::Model::ActiveModel # ::contract.
25
- end
26
-
27
- require "trailblazer/autoloading"
28
- require "trailblazer/rails/autoloading"
12
+ require "trailblazer"
@@ -0,0 +1 @@
1
+ require "trailblazer/rails" # rubocop:disable Naming/FileName
@@ -1,7 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path("lib", __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'trailblazer/rails/version'
3
+ require "trailblazer/rails/version"
5
4
 
6
5
  Gem::Specification.new do |spec|
7
6
  spec.name = "trailblazer-rails"
@@ -9,26 +8,17 @@ Gem::Specification.new do |spec|
9
8
  spec.authors = ["Nick Sutterer"]
10
9
  spec.email = ["apotonick@gmail.com"]
11
10
 
12
- spec.summary = %q{Convenient Rails support for Trailblazer.}
13
- spec.homepage = "http://trailblazer.to"
11
+ spec.summary = "Convenient Rails support for Trailblazer."
12
+ spec.homepage = "https://trailblazer.to/2.1/docs/trailblazer.html#trailblazer-rails"
14
13
  spec.license = "MIT"
15
14
 
16
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test)/}) }
18
16
  spec.require_paths = ["lib"]
19
17
 
20
- spec.add_dependency "trailblazer", ">= 1.0.4"
21
- spec.add_dependency "trailblazer-loader", ">= 0.0.7"
18
+ spec.add_dependency "railties", ">= 5.2.0"
19
+ spec.add_dependency "trailblazer", ">= 2.1.0", "< 2.2.0"
22
20
 
23
- spec.add_development_dependency "bundler", "~> 1.10"
24
- spec.add_development_dependency "rake", "~> 10.0"
21
+ spec.add_development_dependency "bundler"
25
22
  spec.add_development_dependency "minitest"
26
- spec.add_development_dependency "rails"
27
- spec.add_development_dependency "actionpack", '>= 3.0.0' # Rails is optional.
28
- spec.add_development_dependency "sqlite3"
29
- spec.add_development_dependency "responders"
30
- spec.add_development_dependency "database_cleaner"
31
- spec.add_development_dependency "sidekiq", ">= 3.1.0"
32
-
33
- spec.add_development_dependency "multi_json"
23
+ spec.add_development_dependency "rake"
34
24
  end
metadata CHANGED
@@ -1,129 +1,51 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trailblazer-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 2.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-17 00:00:00.000000000 Z
11
+ date: 2022-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: trailblazer
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 1.0.4
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: 1.0.4
27
- - !ruby/object:Gem::Dependency
28
- name: trailblazer-loader
14
+ name: railties
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - ">="
32
18
  - !ruby/object:Gem::Version
33
- version: 0.0.7
19
+ version: 5.2.0
34
20
  type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
24
  - - ">="
39
25
  - !ruby/object:Gem::Version
40
- version: 0.0.7
41
- - !ruby/object:Gem::Dependency
42
- name: bundler
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '1.10'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '1.10'
26
+ version: 5.2.0
55
27
  - !ruby/object:Gem::Dependency
56
- name: rake
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '10.0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '10.0'
69
- - !ruby/object:Gem::Dependency
70
- name: minitest
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rails
28
+ name: trailblazer
85
29
  requirement: !ruby/object:Gem::Requirement
86
30
  requirements:
87
31
  - - ">="
88
32
  - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: actionpack
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
33
+ version: 2.1.0
34
+ - - "<"
102
35
  - !ruby/object:Gem::Version
103
- version: 3.0.0
104
- type: :development
36
+ version: 2.2.0
37
+ type: :runtime
105
38
  prerelease: false
106
39
  version_requirements: !ruby/object:Gem::Requirement
107
40
  requirements:
108
41
  - - ">="
109
42
  - !ruby/object:Gem::Version
110
- version: 3.0.0
111
- - !ruby/object:Gem::Dependency
112
- name: sqlite3
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
43
+ version: 2.1.0
44
+ - - "<"
116
45
  - !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'
46
+ version: 2.2.0
125
47
  - !ruby/object:Gem::Dependency
126
- name: responders
48
+ name: bundler
127
49
  requirement: !ruby/object:Gem::Requirement
128
50
  requirements:
129
51
  - - ">="
@@ -137,7 +59,7 @@ dependencies:
137
59
  - !ruby/object:Gem::Version
138
60
  version: '0'
139
61
  - !ruby/object:Gem::Dependency
140
- name: database_cleaner
62
+ name: minitest
141
63
  requirement: !ruby/object:Gem::Requirement
142
64
  requirements:
143
65
  - - ">="
@@ -151,21 +73,7 @@ dependencies:
151
73
  - !ruby/object:Gem::Version
152
74
  version: '0'
153
75
  - !ruby/object:Gem::Dependency
154
- name: sidekiq
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - ">="
158
- - !ruby/object:Gem::Version
159
- version: 3.1.0
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - ">="
165
- - !ruby/object:Gem::Version
166
- version: 3.1.0
167
- - !ruby/object:Gem::Dependency
168
- name: multi_json
76
+ name: rake
169
77
  requirement: !ruby/object:Gem::Requirement
170
78
  requirements:
171
79
  - - ">="
@@ -178,35 +86,43 @@ dependencies:
178
86
  - - ">="
179
87
  - !ruby/object:Gem::Version
180
88
  version: '0'
181
- description:
89
+ description:
182
90
  email:
183
91
  - apotonick@gmail.com
184
92
  executables: []
185
93
  extensions: []
186
94
  extra_rdoc_files: []
187
95
  files:
96
+ - ".github/workflows/ci.yml"
188
97
  - ".gitignore"
189
- - ".travis.yml"
98
+ - Appraisals
190
99
  - CHANGES.md
191
100
  - Gemfile
192
101
  - LICENSE.txt
193
102
  - README.md
194
103
  - Rakefile
195
- - lib/trailblazer/operation/controller/active_record.rb
196
- - lib/trailblazer/operation/model/active_model.rb
197
- - lib/trailblazer/operation/responder.rb
198
- - lib/trailblazer/operation/worker.rb
104
+ - TESTING.md
105
+ - gemfiles/rails_5.2.gemfile
106
+ - gemfiles/rails_5.2.gemfile.lock
107
+ - gemfiles/rails_6.0.gemfile
108
+ - gemfiles/rails_6.0.gemfile.lock
109
+ - gemfiles/rails_6.1.gemfile
110
+ - gemfiles/rails_6.1.gemfile.lock
111
+ - gemfiles/rails_7.0.gemfile
112
+ - gemfiles/rails_7.0.gemfile.lock
113
+ - lib/trailblazer-rails.rb
199
114
  - lib/trailblazer/rails.rb
200
- - lib/trailblazer/rails/autoloading.rb
115
+ - lib/trailblazer/rails/cell.rb
116
+ - lib/trailblazer/rails/controller.rb
117
+ - lib/trailblazer/rails/form.rb
201
118
  - lib/trailblazer/rails/railtie.rb
202
- - lib/trailblazer/rails/test/integration.rb
203
119
  - lib/trailblazer/rails/version.rb
204
120
  - trailblazer-rails.gemspec
205
- homepage: http://trailblazer.to
121
+ homepage: https://trailblazer.to/2.1/docs/trailblazer.html#trailblazer-rails
206
122
  licenses:
207
123
  - MIT
208
124
  metadata: {}
209
- post_install_message:
125
+ post_install_message:
210
126
  rdoc_options: []
211
127
  require_paths:
212
128
  - lib
@@ -221,9 +137,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
221
137
  - !ruby/object:Gem::Version
222
138
  version: '0'
223
139
  requirements: []
224
- rubyforge_project:
225
- rubygems_version: 2.4.8
226
- signing_key:
140
+ rubygems_version: 3.1.6
141
+ signing_key:
227
142
  specification_version: 4
228
143
  summary: Convenient Rails support for Trailblazer.
229
144
  test_files: []
data/.travis.yml DELETED
@@ -1,4 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.2.2
4
- before_install: gem install bundler
@@ -1,21 +0,0 @@
1
- # Assigns an additional instance variable for +@model+ named after the model's table name (e.g. @comment).
2
- #
3
- # THIS MODULE IS DEPRECATED!
4
- #
5
- # Please don't use this module. Instead, use @model in your controller or pass the
6
- # operation instance to a cell to present it.
7
- module Trailblazer::Operation::Controller::ActiveRecord
8
- private
9
- def setup_operation_instance_variables!(operation, options)
10
- super
11
- instance_variable_set(:"@#{operation_model_name}", @model)
12
- end
13
-
14
- def operation_model_name
15
- # set the right variable name if collection
16
- if @operation.is_a?(Trailblazer::Operation::Collection)
17
- return @model.model.table_name.split(".").last
18
- end
19
- @model.class.table_name.split(".").last.singularize
20
- end
21
- end
@@ -1,11 +0,0 @@
1
- module Trailblazer
2
- module Operation::Model
3
- # Automatically set model_name on operation's contract.
4
- module ActiveModel
5
- def contract(*, &block)
6
- super
7
- contract_class.model(model_class) # this assumes that Form::ActiveModel is mixed in.
8
- end
9
- end
10
- end
11
- end
@@ -1,23 +0,0 @@
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
@@ -1,112 +0,0 @@
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
@@ -1,3 +0,0 @@
1
- Trailblazer::Operation.class_eval do
2
- autoload :Responder, "trailblazer/operation/responder"
3
- end
@@ -1,6 +0,0 @@
1
- require "minitest/rails/capybara" # loads Capybara, etc.
2
-
3
- module Trailblazer::Test
4
- class Integration < Capybara::Rails::TestCase
5
- end
6
- end