king_placeholder 1.0.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YTlmYzAwNmNkYjhhN2RiZWUyMjhhYzNjNjJjOTlkMTU0NmQ5ZDYwMA==
5
+ data.tar.gz: !binary |-
6
+ NzI1YzYyNGI4ZmRiNWFhNDY1MWQ2YjJlZDQ3ODZlN2ZkYTE0ODA2Mg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MmE3NmE3MzdiMGVmYmM1N2I1NTQwZTlkMGI1NTc3Yzc2NzMwN2UzOWI5ZDgw
10
+ ZGFhYTNlZmE3YTYwZmI3MjEwNThlODFlN2VlMjY3YThiNGU5YzgxNzFkYzUz
11
+ YzA1YTVlNzI1YTc4MWE1ZWFmNTdkNjliOTNjNDRiOWE3NWEyMmU=
12
+ data.tar.gz: !binary |-
13
+ ZTBmYzNhZGVhZDEwMGY4NzIwZjMxYWUzNmI3ZGZhMDQ5MDE3NTZiMWVkZjY4
14
+ NmU0MDRjNzQyYTRjNDQ2OTNmZGJjOGMwZjE2ZDhiM2I3Njg1ZmUyODBiYjgy
15
+ MjZjY2YzZjQ4OWVhZDZhNDg0Yjg3ZTBjMTM3NDcxY2JmZTI0MTQ=
@@ -1,8 +1,8 @@
1
1
  = KingPlaceholder
2
2
  {<img src="https://secure.travis-ci.org/salesking/king_placeholder.png?branch=master" alt="Build Status" />}[http://travis-ci.org/salesking/king_placeholder]
3
3
 
4
- This gem was extracted from SalesKing, where it does placeholders substitution
5
- for user supplied strings in Email-, Text- and Export-Templates.
4
+ This gem does simple [placeholders] substitution for user supplied strings in
5
+ Email-, Text- and Export-Templates.
6
6
 
7
7
  Placeholders are declared in each class and afterwards any strings containing
8
8
  <b>[placeholders]</b> can be parsed in the scope of the model.
@@ -75,9 +75,7 @@ Also see specs
75
75
 
76
76
  == TODO
77
77
 
78
- This gems still relies on gem king_views with king_format, for money, date
79
- formatting. We will outsource king_format into its own gem and remove more
80
- Rails and SalesKing internal dependencies.
78
+ * make placeholder marks: [] brackets configurable
81
79
 
82
80
  == Installation
83
81
 
@@ -16,7 +16,7 @@ Gem::Specification.new do |gem|
16
16
  gem.version = KingPlaceholder::VERSION
17
17
 
18
18
  gem.add_runtime_dependency 'statemachine'
19
- gem.add_runtime_dependency 'activesupport'
19
+ gem.add_runtime_dependency 'activesupport', '>3.0'
20
20
 
21
21
  gem.add_development_dependency 'activerecord'
22
22
  gem.add_development_dependency 'rdoc'
@@ -11,11 +11,7 @@ module KingPlaceholder
11
11
  include ActiveSupport::Callbacks
12
12
 
13
13
  included do
14
- if ActiveSupport::VERSION::MAJOR == 3 && ActiveSupport::VERSION::MINOR > 0
15
- class_attribute :placeholders
16
- else
17
- class_inheritable_accessor :placeholders
18
- end
14
+ class_attribute :placeholders
19
15
  placeholders = []
20
16
  end
21
17
 
@@ -44,91 +40,87 @@ module KingPlaceholder
44
40
  end
45
41
  end
46
42
 
47
- # TODO inclusion deprecated in ActiveSupport 3.2.7, when gone move methods up into module
48
- module InstanceMethods
43
+ # Check if a given field is declared as placeholder
44
+ # @param [Object] fieldname to search in placeholders array
45
+ # @return [Boolean]true if available
46
+ def is_placeholder?(fieldname)
47
+ self.class.placeholders.include?(fieldname.to_sym)
48
+ end
49
49
 
50
- # Check if a given field is declared as placeholder
51
- # @param [Object] fieldname to search in placeholders array
52
- # @return [Boolean]true if available
53
- def is_placeholder?(fieldname)
54
- self.class.placeholders.include?(fieldname.to_sym)
50
+ # Substitute placeholder in a string with their current values.
51
+ # It handles strings, arrays (of strings) or hashes (with string values)
52
+ # and returns data with the same data type e.g. if you put a hash, you will
53
+ # get a hash.
54
+ #
55
+ # @examples
56
+ #
57
+ # Placeholders in text strings can be written in different notations.
58
+ #
59
+ # === Simple Notation:
60
+ #
61
+ # => [first_name]
62
+ # The fieldname is directly looked up on the current class:
63
+ # client.expand_placeholders("Hello [first_name]")
64
+ # => "Hello Herbert"
65
+ # invoice.expand_placeholders(["You owe me [price_to_pay]", "Invoice Nr. [number]"])
66
+ # => ["You owe me 495,00 EUR", "Invoice Nr. 123"]
67
+ #
68
+ # === Namespaced Notation
69
+ #
70
+ # => [company.organisation]
71
+ # If the prefix equals the type of the current object the field is looked up on it.
72
+ # client.expand_placeholders("Hello [client.first_name]")
73
+ # => "Hello Herbert"
74
+ #
75
+ # If the prefix is a single related object => Client :belongs_to Company,
76
+ # the substitution is delegated to that class.
77
+ # client.expand_placeholders("Belongs to [company.name]")
78
+ # => ""Belongs to Big Money Coorp."
79
+ # It goes down all the way:
80
+ # invoice.expand_placeholders("[client.company.default_address.zip]")
81
+ # => "50999"
82
+ #
83
+ # === Namespaced Notation with multiple related objects
84
+ #
85
+ # In a has_many relationship, related objects reside in an array, which can
86
+ # be reached using two different strategies.
87
+ #
88
+ # Access and Iterate over the whole Group:
89
+ # invoice.expand_placeholders("You bought: [items] [name] [/items]")
90
+ # => "You bought: Apple Banana Orange"
91
+ #
92
+ # Access a single object by its array index:
93
+ # invoice.expand_placeholders("You bought an [items.0.name] for [items.0.price]")
94
+ # => "You bought an Apple for 12 EUR"
95
+ #
96
+ # @param [Hash|Array|String] content with placeholders
97
+ # @param [Object] opts - unused for now
98
+ # @return [Hash|Array|String] whatever type you throw in is also returned
99
+ def expand_placeholders(content, opts={})
100
+ if content.is_a?(Array)
101
+ result = []
102
+ content.each{|element| result << self.expand_placeholders(element, opts) }
103
+ return result
104
+ elsif content.is_a?(Hash)
105
+ result = {}
106
+ content.each_pair{ |key,val| result[key] = self.expand_placeholders(val, opts) }
107
+ return result
108
+ else # Only proceed with strings
109
+ return content unless content.is_a?(String)
55
110
  end
56
-
57
- # Substitute placeholder in a string with their current values.
58
- # It handles strings, arrays (of strings) or hashes (with string values)
59
- # and returns data with the same data type e.g. if you put a hash, you will
60
- # get a hash.
61
- #
62
- # @examples
63
- #
64
- # Placeholders in text strings can be written in different notations.
65
- #
66
- # === Simple Notation:
67
- #
68
- # => [first_name]
69
- # The fieldname is directly looked up on the current class:
70
- # client.expand_placeholders("Hello [first_name]")
71
- # => "Hello Herbert"
72
- # invoice.expand_placeholders(["You owe me [price_to_pay]", "Invoice Nr. [number]"])
73
- # => ["You owe me 495,00 EUR", "Invoice Nr. 123"]
74
- #
75
- # === Namespaced Notation
76
- #
77
- # => [company.organisation]
78
- # If the prefix equals the type of the current object the field is looked up on it.
79
- # client.expand_placeholders("Hello [client.first_name]")
80
- # => "Hello Herbert"
81
- #
82
- # If the prefix is a single related object => Client :belongs_to Company,
83
- # the substitution is delegated to that class.
84
- # client.expand_placeholders("Belongs to [company.name]")
85
- # => ""Belongs to Big Money Coorp."
86
- # It goes down all the way:
87
- # invoice.expand_placeholders("[client.company.default_address.zip]")
88
- # => "50999"
89
- #
90
- # === Namespaced Notation with multiple related objects
91
- #
92
- # In a has_many relationship, related objects reside in an array, which can
93
- # be reached using two different strategies.
94
- #
95
- # Access and Iterate over the whole Group:
96
- # invoice.expand_placeholders("You bought: [items] [name] [/items]")
97
- # => "You bought: Apple Banana Orange"
98
- #
99
- # Access a single object by its array index:
100
- # invoice.expand_placeholders("You bought an [items.0.name] for [items.0.price]")
101
- # => "You bought an Apple for 12 EUR"
102
- #
103
- # @param [Hash|Array|String] content with placeholders
104
- # @param [Object] opts - unused for now
105
- # @return [Hash|Array|String] whatever type you throw in is also returned
106
- def expand_placeholders(content, opts={})
107
- if content.is_a?(Array)
108
- result = []
109
- content.each{|element| result << self.expand_placeholders(element, opts) }
110
- return result
111
- elsif content.is_a?(Hash)
112
- result = {}
113
- content.each_pair{ |key,val| result[key] = self.expand_placeholders(val, opts) }
114
- return result
115
- else # Only proceed with strings
116
- return content unless content.is_a?(String)
117
- end
118
- run_callbacks :expand_placeholders do
119
- opts[:formatter] = :format_placeholder if self.respond_to?(:format_placeholder)
120
- parser = KingPlaceholder::Parser.new(self, content, opts)
121
- parser.sm.match
122
- parser.result if parser.sm.state == :finished
123
- end
111
+ run_callbacks :expand_placeholders do
112
+ opts[:formatter] = :format_placeholder if self.respond_to?(:format_placeholder)
113
+ parser = KingPlaceholder::Parser.new(self, content, opts)
114
+ parser.sm.match
115
+ parser.result if parser.sm.state == :finished
124
116
  end
117
+ end
125
118
 
126
- protected
127
- def before_parsing
128
- before_expand_placeholders if self.respond_to?(:before_expand_placeholders)
129
- end
130
- def after_parsing
131
- after_expand_placeholders if self.respond_to?(:after_expand_placeholders)
132
- end
133
- end # instance methods
119
+ protected
120
+ def before_parsing
121
+ before_expand_placeholders if self.respond_to?(:before_expand_placeholders)
122
+ end
123
+ def after_parsing
124
+ after_expand_placeholders if self.respond_to?(:after_expand_placeholders)
125
+ end
134
126
  end # KingPlaceholders
@@ -1,3 +1,3 @@
1
1
  module KingPlaceholder
2
- VERSION = "1.0.3"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -150,7 +150,9 @@ describe 'Placeholder substitution' do
150
150
  it 'should parse empty related object with empty string' do
151
151
  @client.company = nil
152
152
  @client.expand_placeholders('[company.name]').should == ''
153
+ @client.expand_placeholders('[client.company.name]').should == ''
153
154
  end
155
+
154
156
  end
155
157
 
156
158
  context 'with collection' do
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: king_placeholder
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
5
- prerelease:
4
+ version: 2.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Georg Leciejewski
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-08-01 00:00:00.000000000 Z
11
+ date: 2015-01-09 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: statemachine
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ! '>='
28
25
  - !ruby/object:Gem::Version
@@ -30,23 +27,20 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: activesupport
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ! '>'
36
32
  - !ruby/object:Gem::Version
37
- version: '0'
33
+ version: '3.0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ! '>'
44
39
  - !ruby/object:Gem::Version
45
- version: '0'
40
+ version: '3.0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: activerecord
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ! '>='
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ! '>='
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rdoc
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ! '>='
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ! '>='
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rspec
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ! '>='
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ! '>='
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: simplecov
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ! '>='
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ! '>='
108
95
  - !ruby/object:Gem::Version
@@ -110,7 +97,6 @@ dependencies:
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: rake
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
101
  - - ! '>='
116
102
  - !ruby/object:Gem::Version
@@ -118,7 +104,6 @@ dependencies:
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
108
  - - ! '>='
124
109
  - !ruby/object:Gem::Version
@@ -145,33 +130,26 @@ files:
145
130
  - spec/spec_helper.rb
146
131
  homepage: https://github.com/salesking/king_placeholder.git
147
132
  licenses: []
133
+ metadata: {}
148
134
  post_install_message:
149
135
  rdoc_options: []
150
136
  require_paths:
151
137
  - lib
152
138
  required_ruby_version: !ruby/object:Gem::Requirement
153
- none: false
154
139
  requirements:
155
140
  - - ! '>='
156
141
  - !ruby/object:Gem::Version
157
142
  version: '0'
158
- segments:
159
- - 0
160
- hash: 961112527656133584
161
143
  required_rubygems_version: !ruby/object:Gem::Requirement
162
- none: false
163
144
  requirements:
164
145
  - - ! '>='
165
146
  - !ruby/object:Gem::Version
166
147
  version: '0'
167
- segments:
168
- - 0
169
- hash: 961112527656133584
170
148
  requirements: []
171
149
  rubyforge_project:
172
- rubygems_version: 1.8.24
150
+ rubygems_version: 2.2.2
173
151
  signing_key:
174
- specification_version: 3
152
+ specification_version: 4
175
153
  summary: Placeholder Parsing in Strings
176
154
  test_files:
177
155
  - spec/king_placeholder_spec.rb