yuba 0.0.1 → 0.0.6

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
- SHA1:
3
- metadata.gz: a0f50e10de1c64847c7dfb2087e0b8ca416ed1d5
4
- data.tar.gz: f1d38de018095e4b0651a0c80c842cadb2070e20
2
+ SHA256:
3
+ metadata.gz: 017f6300c8cb0d9867119b0e186af6d285b385abec945a23f7745648e140d709
4
+ data.tar.gz: 5c67a6522565be8935e10413298640755037ed516d30105a53bb1d1bfbf30da7
5
5
  SHA512:
6
- metadata.gz: 4e2b3a1cb8b9f0ac254f67d504ddf99ffc47b02d322e7eded4a1475597eb8f6374c08c59e19ec39662dd2446c299973237ec8f46fa8cc6bd62e1d22bdfe57406
7
- data.tar.gz: 8673f827dd5ecf5a140bfe8774b92de85bdf20bb9f2ff1feb894dc55f1fb8f7ffd01ea4105e9060d72f26b286650678d74da30739c9b6f36e118ce171b36c0fa
6
+ metadata.gz: 34d21d868256f97cf550ff18a6adb20c6ed2a46c923979ef933966c13b79503835b9db16c4df86c7cb327506dcf240c72e437bc9541e9f8548d086e6dfa58e09
7
+ data.tar.gz: 14579a01e26e0916eb2a199ed0fc182d6902130b9ad5e9cacf35700bfd1f085d0ab4d8652bbf71bedfdd108ac97d13a43f2c71ac315c07c5acd82fb9eb466e5b
data/README.md CHANGED
@@ -35,8 +35,8 @@ $ bundle install
35
35
 
36
36
  ## Support
37
37
 
38
- - Rails 4.2+
39
- - Ruby 2.2+
38
+ - Rails 5.2+
39
+ - Ruby 2.5+
40
40
 
41
41
  ## ViewModel
42
42
 
@@ -80,7 +80,7 @@ Property is default to private. This means you can use it in internal the instan
80
80
  You can use ViewModel in a controller like following
81
81
 
82
82
  ```ruby
83
- class PostsController
83
+ class PostsController < ApplicationController
84
84
  def show
85
85
  @view_model = PostViewModel.new(post: post, author: 'willnet')
86
86
  end
@@ -90,7 +90,7 @@ end
90
90
  In view template, if you want to access post and author, you have to use `@view_model` instance variable like `@view_model.post.title`. if it feels troublesome, you can write like following
91
91
 
92
92
  ```ruby
93
- class PostsController
93
+ class PostsController < ApplicationController
94
94
  def show
95
95
  view_model = PostViewModel.new(post: post, author: 'willnet')
96
96
  render view_model: view_model
@@ -154,6 +154,17 @@ end
154
154
  - `.call` invokes `#call` after assigning arguments as properties.
155
155
  - `#success?` returns `true` if you don't invoke `#fail!`
156
156
 
157
+ You have inspection methods for properties.
158
+
159
+ ```ruby
160
+ service = CreatePostService.new(user: someuser)
161
+ service.has_property?(:user) #=> true
162
+ service.has_public_property?(:user) #=> true
163
+ service.has_private_property?(:user) #=> false
164
+ service.has_required_property?(:user) #=> true
165
+ service.has_optional_property?(:user) #=> false
166
+ ```
167
+
157
168
  ## Form
158
169
 
159
170
  Form is just wrapper of [reform-rails](https://github.com/trailblazer/reform-rails) for now.
@@ -178,6 +189,7 @@ class ArtistsController < ApplicationController
178
189
  render :new
179
190
  end
180
191
  end
192
+ end
181
193
  ```
182
194
 
183
195
  ```ruby
data/lib/yuba.rb CHANGED
@@ -5,9 +5,8 @@ module Yuba
5
5
  autoload :Form, 'yuba/form'
6
6
  autoload :Service, 'yuba/service'
7
7
  autoload :ViewModel, 'yuba/view_model'
8
- autoload :Rendering, 'yuba/rendering'
9
8
  end
10
9
 
11
10
  ActiveSupport.on_load(:action_controller) do
12
- ActionController::Base.include(Yuba::Rendering)
11
+ ActionController::Base.include(Yuba::ViewModel::Rendering)
13
12
  end
data/lib/yuba/service.rb CHANGED
@@ -11,7 +11,7 @@ module Yuba
11
11
  end
12
12
 
13
13
  def property(name, options = {})
14
- _properties[name.to_sym] = options
14
+ self._properties = _properties.merge(name.to_sym => options)
15
15
  end
16
16
  end
17
17
 
@@ -37,6 +37,26 @@ module Yuba
37
37
  !@_success
38
38
  end
39
39
 
40
+ def has_property?(property)
41
+ _properties.has_key?(property.to_sym)
42
+ end
43
+
44
+ def has_required_property?(property)
45
+ has_property?(property) && !_properties.dig(property.to_sym, :optional)
46
+ end
47
+
48
+ def has_optional_property?(property)
49
+ has_property?(property) && !has_required_property?(property)
50
+ end
51
+
52
+ def has_public_property?(property)
53
+ has_property?(property) && !has_private_property?(property)
54
+ end
55
+
56
+ def has_private_property?(property)
57
+ has_property?(property) && !_properties.dig(property.to_sym, :public)
58
+ end
59
+
40
60
  private
41
61
 
42
62
  def validate_arguments(args)
@@ -45,6 +65,12 @@ module Yuba
45
65
  raise ArgumentError, "missing 'property :#{key}' in #{self.class.name} class"
46
66
  end
47
67
  end
68
+
69
+ required_keys = _required_properties.keys
70
+ missing_keys = required_keys - args.keys
71
+ unless missing_keys.empty?
72
+ raise ArgumentError, "missing required arguments: #{missing_keys.join(',')}"
73
+ end
48
74
  end
49
75
 
50
76
  def define_accessors(args)
@@ -56,5 +82,9 @@ module Yuba
56
82
  self.singleton_class.class_eval { private key.to_sym } unless public_method
57
83
  end
58
84
  end
85
+
86
+ def _required_properties
87
+ _properties.reject { |_, value| value[:optional] }
88
+ end
59
89
  end
60
90
  end
data/lib/yuba/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Yuba
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.6'
3
3
  end
@@ -1,5 +1,7 @@
1
1
  module Yuba
2
2
  class ViewModel
3
+ autoload :Rendering, 'yuba/view_model/rendering'
4
+
3
5
  class_attribute :_properties
4
6
  self._properties = {}
5
7
 
@@ -13,27 +15,30 @@ module Yuba
13
15
  # property :name, public: true
14
16
  # property :email, optional: true
15
17
  def property(name, options = {})
16
- _properties[name.to_sym] = options
18
+ self._properties = _properties.merge(name.to_sym => options)
17
19
  end
18
20
  end
19
21
 
20
22
  def initialize(**args)
21
- validate_arguments(args)
22
- define_accessors(args)
23
+ @_args = args
24
+ validate_arguments
25
+ define_accessors
23
26
  end
24
27
 
25
28
  private
26
29
 
27
- def validate_arguments(args)
28
- args.each_key do |key|
30
+ attr_reader :_args
31
+
32
+ def validate_arguments
33
+ _args.each_key do |key|
29
34
  if !_properties.has_key?(key.to_sym) && !_properties.dig(key.to_sym, :optional)
30
35
  raise ArgumentError, "missing 'property :#{key}' in #{self.class.name} class"
31
36
  end
32
37
  end
33
38
  end
34
39
 
35
- def define_accessors(args)
36
- args.each do |key, value|
40
+ def define_accessors
41
+ _args.each do |key, value|
37
42
  public_method = _properties[key.to_sym][:public]
38
43
  define_singleton_method key do
39
44
  value
@@ -0,0 +1,38 @@
1
+ module Yuba
2
+ class ViewModel
3
+ module Rendering
4
+ def render(*args)
5
+ view_model_hash = args.find { |arg| arg.is_a?(Hash) && arg[:view_model] }
6
+ @_view_model = view_model_hash[:view_model] if view_model_hash && view_model_hash[:view_model]
7
+ super
8
+ end
9
+
10
+ def view_assigns
11
+ super.merge(view_model_assigns)
12
+ end
13
+
14
+ private
15
+
16
+ def _protected_ivars
17
+ super.merge(:@_view_model)
18
+ end
19
+
20
+ def view_model_assigns
21
+ return {} unless defined?(@_view_model)
22
+ methods = @_view_model.public_methods(false)
23
+ methods.reject! do |method_name|
24
+ %i[initialize].include?(method_name) ||
25
+ !valid_variable_name?(method_name)
26
+ end
27
+ methods.inject({}) do |hash, method_name|
28
+ hash[method_name] = @_view_model.public_send(method_name)
29
+ hash
30
+ end
31
+ end
32
+
33
+ def valid_variable_name?(name)
34
+ name.match?(/\A[_a-z]\w*\z/)
35
+ end
36
+ end
37
+ end
38
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yuba
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - willnet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-01 00:00:00.000000000 Z
11
+ date: 2021-04-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.2.0
19
+ version: 5.2.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: 4.2.0
26
+ version: 5.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: reform-rails
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: dry-types
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 0.12.2
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 0.12.2
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: sqlite3
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -123,7 +123,7 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: chromedriver-helper
126
+ name: webdrivers
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - ">="
@@ -152,15 +152,14 @@ files:
152
152
  - lib/generators/yuba/service/templates/service.tt
153
153
  - lib/generators/yuba/view_model/templates/view_model.tt
154
154
  - lib/generators/yuba/view_model/view_model_generator.rb
155
- - lib/tasks/crepe_tasks.rake
156
155
  - lib/yuba.rb
157
156
  - lib/yuba/form.rb
158
157
  - lib/yuba/form/coercion.rb
159
158
  - lib/yuba/form/multi_parameter_attributes.rb
160
- - lib/yuba/rendering.rb
161
159
  - lib/yuba/service.rb
162
160
  - lib/yuba/version.rb
163
161
  - lib/yuba/view_model.rb
162
+ - lib/yuba/view_model/rendering.rb
164
163
  homepage: https://github.com/willnet/yuba
165
164
  licenses:
166
165
  - MIT
@@ -180,8 +179,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
180
179
  - !ruby/object:Gem::Version
181
180
  version: '0'
182
181
  requirements: []
183
- rubyforge_project:
184
- rubygems_version: 2.6.13
182
+ rubygems_version: 3.1.6
185
183
  signing_key:
186
184
  specification_version: 4
187
185
  summary: Add New Layers to Rails
@@ -1,4 +0,0 @@
1
- # desc "Explaining what the task does"
2
- # task :yuba do
3
- # # Task goes here
4
- # end
@@ -1,33 +0,0 @@
1
- module Yuba
2
- module Rendering
3
- def render(*args)
4
- view_model_hash = args.find { |arg| arg.is_a?(Hash) && arg[:view_model] }
5
- @_view_model = view_model_hash[:view_model] if view_model_hash[:view_model]
6
- super
7
- end
8
-
9
- def view_assigns
10
- super.merge(view_model_assigns)
11
- end
12
-
13
- private
14
-
15
- def _protected_ivars
16
- super.merge(:@_view_model)
17
- end
18
-
19
- def view_model_assigns
20
- return {} unless @_view_model
21
- # TODO: get all public methods between self and Yuba::ViewModel
22
- # now get only in self
23
- methods = @_view_model.public_methods(false)
24
- methods.reject! do |method_name|
25
- %i[call initialize].include?(method_name)
26
- end
27
- methods.inject({}) do |hash, method_name|
28
- hash[method_name] = @_view_model.public_send(method_name)
29
- hash
30
- end
31
- end
32
- end
33
- end