mystique 0.8.0 → 1.0.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: 0c4b41e5e88082dcc7d1409113cfa6fa93e744d181085d1a95d5206eb35c47ca
4
- data.tar.gz: ace4c3b4da4d88494a6ae354f79a13d143f3aa7245e5088a2672e95274503ed6
3
+ metadata.gz: d6a1dbb9a3299b3f67616bf2ede3357984a31d59552f6b09994f93d1f100877f
4
+ data.tar.gz: e1bcc1e21a9100e6d7726b6cf669287e11f0490970e6b9c06c8b627d1e76c7af
5
5
  SHA512:
6
- metadata.gz: 1b2f71369a89bc564ccf0633726ffe4bde00dad7fe066c585b346770bd3aabfeb999b33d02cfe253cf6fc8cbb982dec9eded199cc69bd66344dd35d6903db346
7
- data.tar.gz: 726e814f716fce77558ba71ae09d3a776803742cfe0b0287e30d1a1a818d6af6dae2c547aa1304b6d813a98fa780c23ff38cb9f8f929ac0bc80ac7fa96b60593
6
+ metadata.gz: 29409b10c2b6a53917853cb50f7fca7acb67f956c855facde0a3ae7ac2a9a33b98eb3ff1bdc0461c609093516643aa9749d657a8aeba45adfafff53e1bf50799
7
+ data.tar.gz: 24479c27b05b802d70a80933ef932c7b5c6b10f141a7de29036b2a1fd60a2b601a007f364377cb9d9b973811e501792aad7f797213b39eab9236f94bdf9fd0f6
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --require spec_helper
3
+ --format progress
data/Rakefile CHANGED
@@ -1,2 +1 @@
1
1
  require "bundler/gem_tasks"
2
- require "matest/spec_tasks"
@@ -1,42 +1,38 @@
1
1
  require "mystique/version"
2
2
 
3
3
  require "callable"
4
- require "string_plus"
5
4
 
6
5
  require "mystique/undefined"
6
+ require "mystique/presenter_class"
7
7
  require "mystique/presenter"
8
8
 
9
9
  module Mystique
10
- module_function
11
10
 
12
- def present(object, with: nil, context: nil, &block)
11
+ def self.present(object, with: nil, context: nil, &block)
13
12
  begin
14
- presenter_class = presenter_class_for(object, with)
13
+ presenter_class = PresenterClass.new(object, with).to_class
15
14
  presenter_class.for(object, context, &block)
16
15
  rescue NameError
17
16
  return object
18
17
  end
19
18
  end
20
19
 
21
- def present_collection(collection, context: nil, &block)
22
- return to_enum(:present_collection, collection, context: context, &block) unless block_given?
20
+ def self.present_collection(collection, context: nil, with: nil, &block)
21
+ return to_enum(:present_collection, collection, context: context, with: with, &block) unless block_given?
23
22
 
24
23
  collection.each do |element|
25
24
  case block.arity
26
25
  when 2
27
- block.call( present(element, context: context), element )
26
+ block.call( present(element, context: context, with: with), element )
28
27
  else
29
- block.call(present(element, context: context))
28
+ block.call(present(element, context: context, with: with))
30
29
  end
31
30
  end
32
31
  end
33
32
 
34
- def presenter_class_for(object, with)
35
- if with.respond_to?(:for)
36
- with
37
- else
38
- StringPlus.constantize("#{with || object.class}Presenter")
39
- end
33
+ private
34
+
35
+ def self.presenter_class_for(object, with)
36
+ with || Object.send(:const_get, "#{object.class}Presenter")
40
37
  end
41
- private :presenter_class_for
42
38
  end
@@ -2,15 +2,17 @@ require "mystique/null_context"
2
2
 
3
3
  module Mystique
4
4
  class Presenter
5
+ FORMATS = {}
6
+
5
7
  def initialize(object, context)
6
8
  @__object__ = object
7
9
  @__context__ = context || self.class.context || NullContext
8
10
  end
9
11
 
10
12
  def self.for(object, context=nil)
11
- self.new(object, context).tap do |presenter|
13
+ new(object, context).tap { |presenter|
12
14
  yield presenter if block_given?
13
- end
15
+ }
14
16
  end
15
17
 
16
18
  def context
@@ -32,16 +34,18 @@ module Mystique
32
34
  def method_missing(method, *args, &block)
33
35
  return target.send(method, *args, &block) if method.to_s.start_with?("to_")
34
36
 
35
- value = target.send(method, *args, &block)
36
-
37
- case
38
- when formatted_method?(method)
39
- format( value )
40
- when presented_method?(method)
41
- Mystique.present(value, context: context)
42
- else
43
- value
44
- end
37
+ target.send(method, *args, &block).yield_self { |value|
38
+ case
39
+ when formatted_method?(method)
40
+ format( value )
41
+ when presented_method?(method)
42
+ Mystique.present(value, context: context)
43
+ when presented_collection?(method)
44
+ Mystique.present_collection(value, context: context, &block)
45
+ else
46
+ value
47
+ end
48
+ }
45
49
  end
46
50
 
47
51
  def formatted_method?(method)
@@ -52,16 +56,22 @@ module Mystique
52
56
  __presented_methods__.include?(method)
53
57
  end
54
58
 
59
+ def presented_collection?(method)
60
+ __presented_collections__.include?(method)
61
+ end
62
+
55
63
  def format(value)
56
- result = if __formats__.keys.include?(value)
64
+ result = case
65
+ when __formats__.keys.include?(value)
57
66
  __formats__[value]
58
- elsif __regex_formats__.any? { |regex, _| value =~ regex}
67
+ when __regex_formats__.any? { |regex, _| value =~ regex}
59
68
  __regex_formats__.select { |regex, _| value =~ regex}.first.last
60
- elsif __class_formats__.any? { |klass, _| value.is_a?(klass)}
69
+ when __class_formats__.any? { |klass, _| value.is_a?(klass)}
61
70
  __class_formats__.select { |klass, _| value.is_a?(klass)}.first.last
62
71
  else
63
72
  value
64
73
  end
74
+
65
75
  Mystique.present(Callable(result).call(value, context))
66
76
  end
67
77
 
@@ -86,6 +96,12 @@ module Mystique
86
96
  end
87
97
  end
88
98
 
99
+ def self.present_collection(matcher)
100
+ if matcher.is_a?(Symbol)
101
+ __presented_collections__ << matcher
102
+ end
103
+ end
104
+
89
105
  def self.format_and_present(matcher)
90
106
  format_method(method)
91
107
  present_method(method)
@@ -95,6 +111,10 @@ module Mystique
95
111
  @__presented_methods__ ||= []
96
112
  end
97
113
 
114
+ def self.__presented_collections__
115
+ @__presented_collections__ ||= []
116
+ end
117
+
98
118
  def self.__formatted_methods__
99
119
  @__formatted_methods__ ||= []
100
120
  end
@@ -103,6 +123,10 @@ module Mystique
103
123
  self.class.__presented_methods__
104
124
  end
105
125
 
126
+ def __presented_collections__
127
+ self.class.__presented_collections__
128
+ end
129
+
106
130
  def __formatted_methods__
107
131
  self.class.__formatted_methods__
108
132
  end
@@ -118,7 +142,7 @@ module Mystique
118
142
  end
119
143
 
120
144
  def self.__formats__
121
- @@__formats__ ||= {}
145
+ FORMATS
122
146
  end
123
147
 
124
148
  def __regex_formats__
@@ -0,0 +1,36 @@
1
+ module Mystique
2
+ class PresenterClass
3
+ def initialize(object, with=nil)
4
+ @with = with
5
+ @object = object
6
+ end
7
+
8
+ def to_class
9
+ with || Object.send(:const_get, class_name)
10
+ end
11
+
12
+ def class_name
13
+ return with.to_s if with
14
+
15
+ "#{base_class_name(object)}Presenter"
16
+ end
17
+
18
+ private
19
+
20
+ attr_reader :with
21
+ attr_reader :object
22
+
23
+ def base_class_name(for_object)
24
+ case for_object
25
+ when Symbol, String
26
+ for_object.to_s.split(/_/).map(&:capitalize).join
27
+ when Array
28
+ for_object.map { |current_object|
29
+ base_class_name(current_object)
30
+ }.join("::")
31
+ else
32
+ for_object.class.to_s
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,3 @@
1
1
  module Mystique
2
- VERSION = "0.8.0"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -19,9 +19,9 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_development_dependency "bundler", "~> 1.8"
23
- spec.add_development_dependency "rake", "~> 10.0"
24
- spec.add_development_dependency "matest"
22
+ spec.add_development_dependency "bundler", "~> 2.1.4"
23
+ spec.add_development_dependency "rake", ">= 12.3.3"
24
+ spec.add_development_dependency "rspec"
25
+ spec.add_development_dependency "pry-byebug"
25
26
  spec.add_runtime_dependency "callable"
26
- spec.add_runtime_dependency "string_plus"
27
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mystique
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Federico Iachetti
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-04 00:00:00.000000000 Z
11
+ date: 2020-06-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,30 +16,30 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.8'
19
+ version: 2.1.4
20
20
  type: :development
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: '1.8'
26
+ version: 2.1.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: 12.3.3
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: 12.3.3
41
41
  - !ruby/object:Gem::Dependency
42
- name: matest
42
+ name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,13 +53,13 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: callable
56
+ name: pry-byebug
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
- type: :runtime
62
+ type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: string_plus
70
+ name: callable
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -88,6 +88,7 @@ extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
90
  - ".gitignore"
91
+ - ".rspec"
91
92
  - CODE_OF_CONDUCT.md
92
93
  - Gemfile
93
94
  - LICENSE.txt
@@ -98,6 +99,7 @@ files:
98
99
  - lib/mystique.rb
99
100
  - lib/mystique/null_context.rb
100
101
  - lib/mystique/presenter.rb
102
+ - lib/mystique/presenter_class.rb
101
103
  - lib/mystique/presenters.rb
102
104
  - lib/mystique/presenters/hash_presenter.rb
103
105
  - lib/mystique/undefined.rb
@@ -107,7 +109,7 @@ homepage: https://github.com/iachettifederico/mystique
107
109
  licenses:
108
110
  - MIT
109
111
  metadata: {}
110
- post_install_message:
112
+ post_install_message:
111
113
  rdoc_options: []
112
114
  require_paths:
113
115
  - lib
@@ -122,9 +124,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
124
  - !ruby/object:Gem::Version
123
125
  version: '0'
124
126
  requirements: []
125
- rubyforge_project:
126
- rubygems_version: 2.7.7
127
- signing_key:
127
+ rubygems_version: 3.0.8
128
+ signing_key:
128
129
  specification_version: 4
129
130
  summary: Ruby presenter gem.
130
131
  test_files: []