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 +4 -4
- data/README.md +15 -32
- data/Rakefile +0 -1
- data/app/models/concerns/magic/presentable.rb +2 -9
- data/config/initializers/action_view.rb +1 -1
- data/config/initializers/generators.rb +1 -1
- data/lib/generators/magic/presenter/generator.rb +1 -1
- data/lib/magic/presenter/authors.rb +5 -1
- data/lib/magic/presenter/base.rb +2 -24
- data/lib/magic/presenter/engine.rb +1 -3
- data/lib/magic/presenter/helpers.rb +4 -6
- data/lib/magic/presenter/test_case.rb +1 -1
- data/lib/magic/presenter/version.rb +1 -1
- data/lib/magic/presenter.rb +1 -12
- data/lib/rspec/rails/example/presenter_example_group.rb +1 -1
- metadata +105 -109
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d5fe98ce37280316a18f2600366cd5fbcde0b12f447bf6a00821a356f140e061
|
|
4
|
+
data.tar.gz: e9b90001111944c9f353ebc82851233a24d93ad316d45e5535cdc1d968e86c11
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3416439e712b63b70cbabce8c74806489023fe5335f29a2a4efca7edca94324dbb966b834f9fc3e8f6a20022c5fc6acf45b7fe45219c1e50edc80226378ff3e2
|
|
7
|
+
data.tar.gz: bdfe8668cfec9f90267617c82da4cda1afecff36223e3312243fd850a865b6979350c3bc94f44e0a0646c825e29731de527a9e50b37e4bc866ab559a040555d6
|
data/README.md
CHANGED
|
@@ -3,11 +3,15 @@
|
|
|
3
3
|

|
|
6
|
-
](
|
|
9
|
+
https://qlty.sh/gh/Alexander-Senko/projects/magic-presenter
|
|
8
10
|
)
|
|
9
|
-
](
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
@@ -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
|
data/lib/magic/presenter/base.rb
CHANGED
|
@@ -24,34 +24,12 @@ module Magic
|
|
|
24
24
|
.to_s
|
|
25
25
|
.delete_suffix('Model')
|
|
26
26
|
.delete_suffix('Record')
|
|
27
|
-
.
|
|
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
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
data/lib/magic/presenter.rb
CHANGED
|
@@ -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 { [
|
|
27
|
+
.then { [ it, *it.railties ] }
|
|
39
28
|
.grep(Rails::Engine)
|
|
40
29
|
.each(&)
|
|
41
30
|
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.
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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.
|
|
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
|
-
|
|
125
|
-
|
|
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
|
-
|
|
130
|
-
|
|
123
|
+
-
|
|
124
|
+
- ">="
|
|
125
|
+
- !ruby/object:Gem::Version
|
|
126
|
+
version: "0"
|
|
131
127
|
requirements: []
|
|
132
|
-
rubygems_version:
|
|
128
|
+
rubygems_version: 4.1.0.dev
|
|
133
129
|
specification_version: 4
|
|
134
130
|
summary: Presentation layer for Rails models
|
|
135
131
|
test_files: []
|