magic-presenter 1.1.1 → 1.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f8acf031c1cac6d6c3ad42b7fb0c42d0bb492cc951bd3e60bb6f4177dc33642
4
- data.tar.gz: fd8d32d210deee950e649677b7a0a6117167db611dc9b632d09d2c6b929d82b6
3
+ metadata.gz: d5fe98ce37280316a18f2600366cd5fbcde0b12f447bf6a00821a356f140e061
4
+ data.tar.gz: e9b90001111944c9f353ebc82851233a24d93ad316d45e5535cdc1d968e86c11
5
5
  SHA512:
6
- metadata.gz: 7eda0245ebecb2ed85985b8f48c7b7e5665fa070b143cdd9dbbe3418deed79754bca1669d4abbec0be5a6c3d7c542cc1a7ad8040c68acf9a387dc120d2d4eab8
7
- data.tar.gz: 63cc0d1a5cb0758a3de70f9708f87b842f1a1f9f842121280141f039fe4c5664ff8ec0647df6109f31048af74a334821eb7f12c049d2c3f06b9a67d671e7b614
6
+ metadata.gz: 3416439e712b63b70cbabce8c74806489023fe5335f29a2a4efca7edca94324dbb966b834f9fc3e8f6a20022c5fc6acf45b7fe45219c1e50edc80226378ff3e2
7
+ data.tar.gz: bdfe8668cfec9f90267617c82da4cda1afecff36223e3312243fd850a865b6979350c3bc94f44e0a0646c825e29731de527a9e50b37e4bc866ab559a040555d6
data/README.md CHANGED
@@ -3,11 +3,15 @@
3
3
  ![GitHub Actions Workflow Status](
4
4
  https://img.shields.io/github/actions/workflow/status/Alexander-Senko/magic-presenter/ci.yml
5
5
  )
6
- ![Code Climate maintainability](
7
- https://img.shields.io/codeclimate/maintainability-percentage/Alexander-Senko/magic-presenter
6
+ [![Maintainability](
7
+ https://qlty.sh/gh/Alexander-Senko/projects/magic-presenter/maintainability.svg
8
+ )](
9
+ https://qlty.sh/gh/Alexander-Senko/projects/magic-presenter
8
10
  )
9
- ![Code Climate coverage](
10
- https://img.shields.io/codeclimate/coverage/Alexander-Senko/magic-presenter
11
+ [![Code Coverage](
12
+ https://qlty.sh/gh/Alexander-Senko/projects/magic-presenter/coverage.svg
13
+ )](
14
+ https://qlty.sh/gh/Alexander-Senko/projects/magic-presenter
11
15
  )
12
16
 
13
17
  A bit of history: this gem was inspired by digging deeper into [Draper](https://github.com/drapergem/draper) with an eye on a refactoring.
@@ -18,7 +22,7 @@ Based on [Magic Decorator](
18
22
 
19
23
  ## Installation
20
24
 
21
- Install the gem and add to the application's Gemfile by executing:
25
+ Install the gem and add to the application’s Gemfile by executing:
22
26
 
23
27
  $ bundle add magic-presenter
24
28
 
@@ -66,7 +70,7 @@ A generator can be used to generate a presenter:
66
70
 
67
71
  $ bin/rails generate presenter Person
68
72
 
69
- See the help for more info:
73
+ See the help for more information:
70
74
 
71
75
  $ bin/rails generate presenter --help
72
76
 
@@ -87,7 +91,7 @@ end
87
91
  ```
88
92
 
89
93
  A view context must be set to enable helpers.
90
- It’s done automagically [wherever possible](#view-context).
94
+ It is done automagically [wherever possible](#view-context).
91
95
  However, one can set it explicitly anywhere:
92
96
 
93
97
  ```ruby
@@ -97,12 +101,12 @@ end
97
101
  ```
98
102
 
99
103
  > [!NOTE]
100
- > A valid `request` may be needed for URL helpers to get host info.
104
+ > A valid `request` may be needed for URL helpers to get host data.
101
105
 
102
106
  ## 🧙 Magic
103
107
 
104
108
  > [!IMPORTANT]
105
- > It’s based on [Magic Decorator](
109
+ > It is based on [Magic Decorator](
106
110
  > https://github.com/Alexander-Senko/magic-decorator#magic
107
111
  > ), so get familiar with that one as well.
108
112
 
@@ -127,7 +131,7 @@ When missing, it further looks for presenters for its ancestor classes, up to `O
127
131
  - `MyRecord` → `MyPresenter`
128
132
 
129
133
  > [!TIP]
130
- > That’s why `ApplicationPresenter` presents `ApplicationRecord` alongside all its descendants automagically with no extra code.
134
+ > That is why `ApplicationPresenter` presents `ApplicationRecord` alongside all its descendants automagically with no extra code.
131
135
 
132
136
  When in doubt, one can use `Magic::Presenter.name_for`:
133
137
 
@@ -135,27 +139,6 @@ When in doubt, one can use `Magic::Presenter.name_for`:
135
139
  Magic::Presenter.name_for Person # => "PersonPresenter"
136
140
  ```
137
141
 
138
- #### Preloading
139
-
140
- > [!NOTE]
141
- > Magic Lookup doesn’t try to autoload any classes, it searches among already loaded ones instead.
142
- > Thus, presenters should be preloaded to be visible via [lookups](#presenter-class-inference).
143
-
144
- This is done automatically in both _test_ and _production_ environments by Rails.
145
- All the application’s presenters and models are eagerly loaded before normal and reverse lookups by Magic Presenter as well.
146
- So, normally one shouldn’t worry about that.
147
-
148
- > [!IMPORTANT]
149
- > When developing a Rails engine that defines its own presenters, one should take care of the preloading themselves.
150
-
151
- That could be done in an initializer with a helper method provided:
152
-
153
- ```ruby
154
- Rails.application.config.to_prepare do
155
- Magic.eager_load :presenters, engine: MyLib::Engine
156
- end
157
- ```
158
-
159
142
  ### Class methods delegation
160
143
 
161
144
  Missing class methods of a presenter are delegated to a matching model class if the latter can be inferred unambiguously.
@@ -232,4 +215,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
232
215
 
233
216
  ## Code of Conduct
234
217
 
235
- Everyone interacting in the Magic Presenter project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/Alexander-Senko/magic-presenter/blob/main/CODE_OF_CONDUCT.md).
218
+ Everyone interacting in the Magic Presenter project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/Alexander-Senko/magic-presenter/blob/main/CODE_OF_CONDUCT.md).
data/Rakefile CHANGED
@@ -4,7 +4,6 @@ require 'bundler/setup'
4
4
 
5
5
  APP_RAKEFILE = File.expand_path 'spec/internal/Rakefile', __dir__
6
6
  load 'rails/tasks/engine.rake'
7
- load 'rails/tasks/statistics.rake'
8
7
 
9
8
  require 'bundler/gem_tasks'
10
9
  require 'rspec/core/rake_task'
@@ -6,17 +6,10 @@ module Magic
6
6
  # inferred automatically.
7
7
  module Presentable
8
8
  include Decoratable
9
-
10
- class << self
11
- def classes
12
- Magic.eager_load :models
13
-
14
- super
15
- end
16
- end
9
+ include Lookup::Scope[:model]
17
10
 
18
11
  private
19
12
 
20
- def decorator_base = Presenter
13
+ def decorator_base = Presenter::Base
21
14
  end
22
15
  end
@@ -35,7 +35,7 @@ ActiveSupport.on_load :action_view do # rubocop:disable Metrics/BlockLength
35
35
  super
36
36
  .each_value
37
37
  .grep(Magic::Presenter::Base)
38
- .each { _1.view_context = self }
38
+ .each { it.view_context = self }
39
39
  end
40
40
  end
41
41
  end
@@ -14,7 +14,7 @@ if defined? Rails::Generators
14
14
 
15
15
  Magic.each_engine do |engine|
16
16
  engine.config.generators do
17
- _1.helper = :presenter
17
+ it.helper = :presenter
18
18
  end
19
19
  end
20
20
  end
@@ -10,7 +10,7 @@ module Magic
10
10
  def file_name name = super()
11
11
  name
12
12
  .camelize
13
- .then { Magic::Presenter.name_for _1 }
13
+ .then { Magic::Presenter.name_for it }
14
14
  .underscore
15
15
  end
16
16
 
@@ -1,6 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rubygems/author'
3
+ begin
4
+ require 'rubygems/author'
5
+ rescue LoadError
6
+ require_relative '../../../vendor/gems/rubygems-author/lib/rubygems/author'
7
+ end
4
8
 
5
9
  module Magic
6
10
  module Presenter
@@ -24,34 +24,12 @@ module Magic
24
24
  .to_s
25
25
  .delete_suffix('Model')
26
26
  .delete_suffix('Record')
27
- .then { "#{_1}Presenter" }
27
+ .concat('Presenter')
28
28
  end
29
29
 
30
- def model_class
31
- Presentable.classes
32
- .select { self.for(_1) == self }
33
- .optional do |classes|
34
- next unless classes.many?
35
-
36
- classes
37
- .select { name_for(_1) == name }
38
- .optional { classes if _1.empty? } # lookup failed — return original
39
- end
40
- .sole
41
- rescue Enumerable::SoleItemExpectedError => error
42
- raise Lookup::Error, "#{error.message
43
- .sub('items', 'model classes')
44
- .sub('item', 'model class')
45
- } for #{self}"
46
- end
30
+ def model_class = Presentable.for self
47
31
 
48
32
  delegate_missing_to :model_class
49
-
50
- def descendants
51
- Magic.eager_load :presenters
52
-
53
- super
54
- end
55
33
  end
56
34
  end
57
35
  end
@@ -1,14 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'magic/core_ext/kernel/optional'
4
-
5
3
  module Magic
6
4
  module Presenter
7
5
  class Engine < ::Rails::Engine # :nodoc:
8
6
  isolate_namespace Magic::Presenter
9
7
 
10
8
  config.generators do
11
- _1.test_framework = :rspec
9
+ it.test_framework = :rspec
12
10
  end
13
11
  end
14
12
  end
@@ -8,12 +8,10 @@ module Magic
8
8
  # The Magic::Presenter::Helpers::MissingContext exception is
9
9
  # raised when no view context to run helpers in has been set.
10
10
  class MissingContext < RuntimeError
11
- def message
12
- <<~TEXT
13
- missing view context
14
- You should set Magic::Presenter.view_context first
15
- TEXT
16
- end
11
+ def message = <<~TEXT
12
+ missing view context
13
+ You should set Magic::Presenter.view_context first
14
+ TEXT
17
15
  end
18
16
 
19
17
  prepended do
@@ -13,7 +13,7 @@ module Magic
13
13
  include ActionView::TestCase::Behavior
14
14
 
15
15
  included do
16
- Magic.each_engine { include _1.routes.url_helpers }
16
+ Magic.each_engine { include it.routes.url_helpers }
17
17
  end
18
18
  end
19
19
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Magic
4
4
  module Presenter
5
- VERSION = '1.1.1'
5
+ VERSION = '1.2.0'
6
6
  end
7
7
  end
@@ -22,20 +22,9 @@ module Magic # :nodoc:
22
22
 
23
23
  module_function # TODO: extract to Magic Support
24
24
 
25
- def eager_load *scopes, engine: Rails.application
26
- return if Rails.application.config.eager_load
27
-
28
- scopes
29
- .map(&:to_s)
30
- .map(&:pluralize)
31
- .map { engine.root / 'app' / _1 }
32
- .select(&:exist?)
33
- .each { Rails.autoloaders.main.eager_load_dir _1 }
34
- end
35
-
36
25
  def each_engine(&)
37
26
  Rails.application
38
- .then { [ _1, *_1.railties ] }
27
+ .then { [ it, *it.railties ] }
39
28
  .grep(Rails::Engine)
40
29
  .each(&)
41
30
  end
@@ -12,7 +12,7 @@ module RSpec
12
12
  include Magic::Presenter::TestCase::Behavior
13
13
 
14
14
  included do
15
- around { Magic::Presenter.with view_context: self, &_1 }
15
+ around { Magic::Presenter.with view_context: self, &it }
16
16
  end
17
17
  end
18
18
  end
metadata CHANGED
@@ -1,135 +1,131 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: magic-presenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
- - Alexander Senko
7
+ - Alexander Senko
8
8
  bindir: bin
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
- - !ruby/object:Gem::Dependency
13
- name: rails
14
- requirement: !ruby/object:Gem::Requirement
15
- requirements:
16
- - - ">="
17
- - !ruby/object:Gem::Version
18
- version: '7.2'
19
- - - "<"
20
- - !ruby/object:Gem::Version
21
- version: '9'
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- version: '7.2'
29
- - - "<"
30
- - !ruby/object:Gem::Version
31
- version: '9'
32
- - !ruby/object:Gem::Dependency
33
- name: magic-decorator
34
- requirement: !ruby/object:Gem::Requirement
35
- requirements:
36
- - - "~>"
37
- - !ruby/object:Gem::Version
38
- version: '1.0'
39
- type: :runtime
40
- prerelease: false
41
- version_requirements: !ruby/object:Gem::Requirement
42
- requirements:
43
- - - "~>"
44
- - !ruby/object:Gem::Version
45
- version: '1.0'
46
- - !ruby/object:Gem::Dependency
47
- name: magic-lookup
48
- requirement: !ruby/object:Gem::Requirement
49
- requirements:
50
- - - ">="
51
- - !ruby/object:Gem::Version
52
- version: '0'
53
- type: :runtime
54
- prerelease: false
55
- version_requirements: !ruby/object:Gem::Requirement
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- version: '0'
60
- - !ruby/object:Gem::Dependency
61
- name: magic-support
62
- requirement: !ruby/object:Gem::Requirement
63
- requirements:
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- version: '0'
67
- type: :runtime
68
- prerelease: false
69
- version_requirements: !ruby/object:Gem::Requirement
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- version: '0'
74
- description: Based on Magic Decorator, it’s meant to replace Draper.
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ -
17
+ - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: "7.2"
20
+ -
21
+ - "<"
22
+ - !ruby/object:Gem::Version
23
+ version: "9"
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ -
29
+ - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: "7.2"
32
+ -
33
+ - "<"
34
+ - !ruby/object:Gem::Version
35
+ version: "9"
36
+ - !ruby/object:Gem::Dependency
37
+ name: magic-decorator
38
+ requirement: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ -
41
+ - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: "1.0"
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ -
49
+ - ~>
50
+ - !ruby/object:Gem::Version
51
+ version: "1.0"
52
+ - !ruby/object:Gem::Dependency
53
+ name: magic-lookup
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ -
57
+ - ~>
58
+ - !ruby/object:Gem::Version
59
+ version: "1.0"
60
+ type: :runtime
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ -
65
+ - ~>
66
+ - !ruby/object:Gem::Version
67
+ version: "1.0"
68
+ description: "Based on Magic Decorator, it is meant to replace Draper."
75
69
  email:
76
- - Alexander.Senko@gmail.com
70
+ - Alexander.Senko@gmail.com
77
71
  executables: []
78
72
  extensions: []
79
73
  extra_rdoc_files: []
80
74
  files:
81
- - MIT-LICENSE
82
- - README.md
83
- - Rakefile
84
- - app/models/concerns/magic/presentable.rb
85
- - config/initializers/action_controller.rb
86
- - config/initializers/action_view.rb
87
- - config/initializers/generators.rb
88
- - config/initializers/presentable.rb
89
- - config/initializers/rspec.rb
90
- - lib/generators/magic/presenter/generator.rb
91
- - lib/generators/magic/presenter/install/USAGE
92
- - lib/generators/magic/presenter/install/install_generator.rb
93
- - lib/generators/magic/presenter/install/templates/application_presenter.rb.tt
94
- - lib/generators/rails/presenter/USAGE
95
- - lib/generators/rails/presenter/presenter_generator.rb
96
- - lib/generators/rails/presenter/templates/presenter.rb.tt
97
- - lib/generators/rspec/presenter/presenter_generator.rb
98
- - lib/generators/rspec/presenter/templates/presenter_spec.rb.tt
99
- - lib/generators/test_unit/presenter/presenter_generator.rb
100
- - lib/generators/test_unit/presenter/templates/presenter_test.rb.tt
101
- - lib/magic/presenter.rb
102
- - lib/magic/presenter/authors.rb
103
- - lib/magic/presenter/base.rb
104
- - lib/magic/presenter/engine.rb
105
- - lib/magic/presenter/global_id.rb
106
- - lib/magic/presenter/helpers.rb
107
- - lib/magic/presenter/test_case.rb
108
- - lib/magic/presenter/version.rb
109
- - lib/rspec/rails/example/presenter_example_group.rb
110
- - lib/tasks/magic/presenter_tasks.rake
111
- homepage: https://github.com/Alexander-Senko/magic-presenter
75
+ - MIT-LICENSE
76
+ - README.md
77
+ - Rakefile
78
+ - app/models/concerns/magic/presentable.rb
79
+ - config/initializers/action_controller.rb
80
+ - config/initializers/action_view.rb
81
+ - config/initializers/generators.rb
82
+ - config/initializers/presentable.rb
83
+ - config/initializers/rspec.rb
84
+ - lib/generators/magic/presenter/generator.rb
85
+ - lib/generators/magic/presenter/install/USAGE
86
+ - lib/generators/magic/presenter/install/install_generator.rb
87
+ - lib/generators/magic/presenter/install/templates/application_presenter.rb.tt
88
+ - lib/generators/rails/presenter/USAGE
89
+ - lib/generators/rails/presenter/presenter_generator.rb
90
+ - lib/generators/rails/presenter/templates/presenter.rb.tt
91
+ - lib/generators/rspec/presenter/presenter_generator.rb
92
+ - lib/generators/rspec/presenter/templates/presenter_spec.rb.tt
93
+ - lib/generators/test_unit/presenter/presenter_generator.rb
94
+ - lib/generators/test_unit/presenter/templates/presenter_test.rb.tt
95
+ - lib/magic/presenter.rb
96
+ - lib/magic/presenter/authors.rb
97
+ - lib/magic/presenter/base.rb
98
+ - lib/magic/presenter/engine.rb
99
+ - lib/magic/presenter/global_id.rb
100
+ - lib/magic/presenter/helpers.rb
101
+ - lib/magic/presenter/test_case.rb
102
+ - lib/magic/presenter/version.rb
103
+ - lib/rspec/rails/example/presenter_example_group.rb
104
+ - lib/tasks/magic/presenter_tasks.rake
105
+ homepage: "https://github.com/Alexander-Senko/magic-presenter"
112
106
  licenses:
113
- - MIT
107
+ - MIT
114
108
  metadata:
115
- homepage_uri: https://github.com/Alexander-Senko/magic-presenter
116
- source_code_uri: https://github.com/Alexander-Senko/magic-presenter
117
- changelog_uri: https://github.com/Alexander-Senko/magic-presenter/blob/v1.1.1/CHANGELOG.md
109
+ homepage_uri: "https://github.com/Alexander-Senko/magic-presenter"
110
+ source_code_uri: "https://github.com/Alexander-Senko/magic-presenter"
111
+ changelog_uri: "https://github.com/Alexander-Senko/magic-presenter/blob/v1.2.0/CHANGELOG.md"
118
112
  rdoc_options: []
119
113
  require_paths:
120
- - lib
114
+ - lib
121
115
  required_ruby_version: !ruby/object:Gem::Requirement
122
116
  requirements:
123
- - - ">="
124
- - !ruby/object:Gem::Version
125
- version: '3.2'
117
+ -
118
+ - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: "3.4"
126
121
  required_rubygems_version: !ruby/object:Gem::Requirement
127
122
  requirements:
128
- - - ">="
129
- - !ruby/object:Gem::Version
130
- version: '0'
123
+ -
124
+ - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: "0"
131
127
  requirements: []
132
- rubygems_version: 3.7.0.dev
128
+ rubygems_version: 4.1.0.dev
133
129
  specification_version: 4
134
130
  summary: Presentation layer for Rails models
135
131
  test_files: []