mystique 0.4.0 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0f60bb171d9f2634c6902175b28f63c5b79dcd2b
4
- data.tar.gz: a6191d72cbc18501dd0b8358f0ad2ce6cc8f2649
3
+ metadata.gz: 8c89e0f208874318c9e36941c71ccb0bdda388bb
4
+ data.tar.gz: b0160e9d1679562db583098a437b1669642df789
5
5
  SHA512:
6
- metadata.gz: d0bbe306e6c7e056a35ddd74e127cfd58babc4000511aacb16455acb3377d41ee337326ac5537ea51516f079289e451401e8f9626f632b66e0dca0b5f4956fc7
7
- data.tar.gz: a04735375b41a8e81938ddf9f6a14b3ba8a4eaa417e9cae719108bc87c9f271d886bf4949a5545723e11569b120e00d88e5880b334f27b1f331942413eeb8dba
6
+ metadata.gz: fb0ac21270c00aeda63961b6c6fdc7afb9e13913f9f490d8d93deb10b42c3b70fc01c60c280b2324debd4fc3bb06d6d3ec5ae65415049dd1707eb6bfb2b9e948
7
+ data.tar.gz: aca76c6a29bfc17495d46cb7f0b47fe8c21abf2d00905e18fee8388930a1870c15771b650467a5efe5307f1f0c7feac42f30f0d1ea46277541383b00c9c8654b
data/README.md CHANGED
@@ -2,9 +2,145 @@
2
2
 
3
3
  Mystique is a gem that implements the presenter pattern. It allows you to augment an object, by wrapping it and giving it access to the context in which you need to render it.
4
4
 
5
- ## Usage
5
+ ## How to present
6
6
 
7
- TODO: Write usage instructions here
7
+ Mystique ships with the `.present` method, which wraps the target object in a presenter and yield the presenter if a block is given, or returns it. If there default presenter is not available, the original object gets yielded/returned.
8
+
9
+ ```ruby
10
+ Item = Struct.new(:name, :price)
11
+ class ItemPresenter < Mystique::Presenter
12
+ end
13
+
14
+ item_presenter = Mystique.present(Item.new("Rubik's Cube", 30.5))
15
+
16
+ item_presenter.class
17
+ # => ItemPresenter
18
+
19
+ item_presenter.name
20
+ # => "Rubik's Cube"
21
+ ```
22
+
23
+ ### Default presenter
24
+
25
+ The default presenter is inferred from the target object's class name. So, for the `Item` class, you'll get the `ItemPresenter` presenter.
26
+
27
+ If `ItemPresenter` is not defined, you'll get back your original item.
28
+
29
+
30
+ ### Context
31
+
32
+ The context is the object that, conveniently, provides the context in which the target object will be rendered.
33
+
34
+ Currently, the context defaults to a null context, which accepts any message sent and does nothing.
35
+
36
+ You can set the context in 3 ways:
37
+
38
+ #### Using the `.context` method when defining your presenter:
39
+
40
+ ```ruby
41
+ class UserPresenter < Mystique::Presenter
42
+ context MyHelpers
43
+
44
+ # ...
45
+ end
46
+ ```
47
+
48
+ This will set the `MyHelpers` module as the context for any instance of `UserPresenter`
49
+
50
+ #### Passing it to the present method
51
+
52
+ ```ruby
53
+ user_presenter = Mystique.present(some_user, context: MyHelpers)
54
+ ```
55
+
56
+ Which will set `MyHelpers` as the context just for `user_presenter`
57
+
58
+ #### Both
59
+
60
+ You can pass the presenter using both methods.
61
+
62
+ In that case, the one set on the class declaration will be the default one for that class,
63
+ but if you pass a new context to a specific instance, it will use that one.
64
+
65
+ ## Formatting
66
+
67
+ Mystique provides a `format` method that allows you to define defaults for some response types.
68
+
69
+ In every case, `format` will accept a value or a block to return, which will yield the found value and the context.
70
+
71
+ ### Specific values
72
+
73
+ This is a great way to return a default String when you get a nil back (but it's not limited to that).
74
+
75
+ ```ruby
76
+ Item = Struct.new(:name, :price)
77
+ class ItemPresenter < Mystique::Presenter
78
+ format nil, "N/A"
79
+ end
80
+
81
+ item_presenter.price
82
+ # => "N/A"
83
+ ```
84
+
85
+ ### Classes
86
+
87
+ You can pass a class name to the format method, and if the returned value is an instance of that class, it will return the specified value/block
88
+
89
+ ```ruby
90
+ class ItemPresenter < Mystique::Presenter
91
+ context Helpers
92
+ format Float do |value, context|
93
+ context.number_to_currency(value)
94
+ end
95
+ end
96
+
97
+ item_presenter = Mystique.present(Item.new("Rubik's Cube", 5.3))
98
+
99
+ item_presenter.price
100
+ # => "$ 5.30"
101
+ ```
102
+
103
+ ### Regular Expressions
104
+
105
+ You can also pass a regular expression to which the return value will be matched
106
+
107
+ ```ruby
108
+ module Helpers
109
+ def self.link_to(text, url)
110
+ "<a href='#{url}'> #{text} </a>"
111
+ end
112
+ end
113
+
114
+ class UserPresenter < Mystique::Presenter
115
+ context Helpers
116
+
117
+ format /\w+@\w+\.\w+/ do |email, context|
118
+ context.link_to(email, "mailto://#{email}")
119
+ end
120
+ end
121
+
122
+ user_presenter = Mystique.present(User.new("Federico", "me@myself.com"))
123
+
124
+ user_presenter.email
125
+ # => "<a href='mailto://me@myself.com'> me@myself.com </a>"
126
+ ```
127
+
128
+ ### `format_multiple`
129
+
130
+ You can also set multiple matchers by using the `.format_multiple` method:
131
+
132
+ ```ruby
133
+ Mystique.present(Item.new("Wine", 50, 42.3)) do |presenter|
134
+ presenter.class
135
+ # => ItemPresenter
136
+
137
+ presenter.price
138
+ # => "$ 50.00"
139
+
140
+ presenter.list_price
141
+ # => "$ 42.30"
142
+ end
143
+ ```
8
144
 
9
145
  ## Installation
10
146
 
@@ -1,12 +1,16 @@
1
1
  require "mystique/version"
2
+
2
3
  require "callable"
3
4
  require "string_plus"
4
5
 
6
+ require "mystique/null_context"
7
+
8
+
5
9
  module Mystique
6
10
  class Presenter
7
11
  def initialize(object, context)
8
12
  @__object__ = object
9
- @__context__ = context || self.class.context
13
+ @__context__ = context || self.class.context || NullContext
10
14
  end
11
15
 
12
16
  def self.present(object, context=nil)
@@ -25,9 +29,14 @@ module Mystique
25
29
  @__object__
26
30
  end
27
31
 
32
+ def inspect
33
+ "<#{self.class}(#{target.inspect}) context: #{context.inspect}>"
34
+ end
35
+
28
36
  private
29
37
 
30
38
  def method_missing(method, *args, &block)
39
+ return target.send(method, *args, &block) if method.to_s.start_with?("to_")
31
40
  value = target.send(method, *args, &block)
32
41
  result = if __formats__.keys.include?(value)
33
42
  __formats__[value]
@@ -0,0 +1,7 @@
1
+ module Mystique
2
+ module NullContext
3
+ def method_missing(*)
4
+ self
5
+ end
6
+ end
7
+ end
@@ -1,3 +1,3 @@
1
1
  module Mystique
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.2"
3
3
  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.4.0
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Federico Iachetti
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-03-09 00:00:00.000000000 Z
11
+ date: 2015-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -96,6 +96,7 @@ files:
96
96
  - bin/console
97
97
  - bin/setup
98
98
  - lib/mystique.rb
99
+ - lib/mystique/null_context.rb
99
100
  - lib/mystique/version.rb
100
101
  - mystique.gemspec
101
102
  homepage: https://github.com/iachettifederico/mystique