trailblazer-rails 0.2.4 → 2.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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