snippr 0.15.22 → 0.15.23

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
  SHA1:
3
- metadata.gz: 7285f9e6b5d7271ae0d46e93fc3b4fdb630e0af0
4
- data.tar.gz: c7c3d8a708304c4184cdbb40321bb3a72aea8882
3
+ metadata.gz: 054173010859c69d009993fdcb3c2b3dba1c480e
4
+ data.tar.gz: 3aff7b7072677405dcd33849f675975daa1a4392
5
5
  SHA512:
6
- metadata.gz: e3ff81c780ad5b2636f0620bd613ef2d242b2b782f04c55f64419bdbf8a06185f1bbc1908ae70eb2cf1b883874b7751935878d4c7f9fa76e621e189d33a44a3f
7
- data.tar.gz: cb86a46ff9c499bd1be46960df280bb86b75da4827eec12afa6dfaacfe5be75530015bb28ccd45a3e27e854ed02cc5ca38a45e2580c4da00e82afbb67a0401e2
6
+ metadata.gz: bf7d237b5c1f753bf381b9b16b98981870a52af3e8512cfdf4003f37ba5f321c2863390e28862973104f27249b68067934d109fce5a0ed8a8c21243171e4b48b
7
+ data.tar.gz: a2f91dd07711ce6fc54172f9f2e7c713c200797addcfd564ae02911501adb9734f415188fdf6434cc674d1f73b4fde696f6fb6e4872c79ad5f7e0f35ec46c225
@@ -9,50 +9,57 @@ module Snippr
9
9
  class Dynamics
10
10
 
11
11
  def process(content, opts = {})
12
- matches = []
13
- # convert array of arrays to array of matchdata
14
- content.scan(regex) { matches << $~ }
15
-
16
- matches.each do |match_data|
17
- replacement = match_data[:all]
18
- placeholder = match_data[:placeholder].strip.to_sym
19
- value = opts[placeholder]
20
- if match_data[:method] && (value.respond_to?(match_data[:method]) || match_data[:respond_to_check] == "!")
21
- params = (match_data[:parameters] || "").gsub(/[\t\r\n]/,"").split("\",\"")
22
- replacement = value.send(match_data[:method], *params).to_s
23
- elsif match_data[:method]
24
- replacement = match_data[:all]
25
- elsif value
12
+ opts.inject(content) do |c, pv|
13
+ placeholder, value = pv
14
+ c.gsub(regex(placeholder)) do |match|
26
15
  replacement = value.to_s
16
+ # remember values since gsub will reset all regex $ matches
17
+ default = $5
18
+ method = $3
19
+ safety = $6
20
+ if $3 && (value.respond_to?($3) || $2 == "!")
21
+ params = recursive_process(($4 || "").gsub(/[\t\r\n]/,""), opts).split("\",\"")
22
+ replacement = value.send(method, *params).to_s
23
+ elsif $3
24
+ replacement = match
25
+ end
26
+ replacement = default if replacement.empty? && default
27
+ replacement += safety.html_safe if safety
28
+ replacement
27
29
  end
28
-
29
- # default set?
30
- replacement = match_data[:default_when_empty].strip if replacement.empty? && match_data[:default_when_empty]
31
- content.gsub!(match_data[:all], replacement)
32
30
  end
33
- content
34
31
  end
35
32
 
36
33
  private
37
34
 
38
- def regex
35
+ def regex(placeholder)
39
36
  %r{
40
- (?<all> # group caputing all
41
- \{ # start of dynamic value
42
- (?<respond_to_check>!?) # use ! to call the method on an object even if :respond_to fails
43
- (?<placeholder>.*?) # variable holding value or object
44
- (?:\.(?<method>.*?) # about to call an method on the 'placeholder'
45
- \( # non-optional bracket to merk method call
46
- ["]? # optional opening double quote
47
- (?<parameters>.*?) # paramters for method call
48
- ["]? # optional closing double quote
49
- \))? # mandatory closing bracket and group end
50
- (\|(?<default_when_empty>.*?))? # optional default value when snippet content empty
51
- \} # and thats it
52
- ) # end all group
37
+ ( # $1: collect all but safety guard at the end
38
+ \{ # start of dynamic value
39
+ (!?) # $2: use ! to call the method on an object even if :respond_to fails
40
+ #{placeholder} # variable holding value or object
41
+ (?:\.(.*?) # $3: about to call an method on the 'placeholder'
42
+ \( # non-optional bracket to merk method call
43
+ ["]? # optional opening double quote
44
+ (.*?) # $4: parameters for method call
45
+ ["]? # optional closing double quote
46
+ \))? # mandatory closing bracket and group end
47
+ (?:\|(.*?))? # $5: optional default value when snippet content empty
48
+ \} # and thats it
49
+ ) # end capture of variable area
50
+ ([^"]|$) # $6: this allows he capture of method calls in method calls
53
51
  }xm
54
52
  end
55
53
 
54
+ def recursive_process(parameter_string, opts)
55
+ # simple check if there is something to do
56
+ if parameter_string.include?("{")
57
+ process(parameter_string, opts)
58
+ else
59
+ parameter_string
60
+ end
61
+ end
62
+
56
63
  end
57
64
 
58
65
  end
data/snippr.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |s|
3
3
  s.name = "snippr"
4
- s.version = '0.15.22'
4
+ s.version = '0.15.23'
5
5
  s.date = Time.now
6
6
  s.platform = Gem::Platform::RUBY
7
7
  s.authors = ["Daniel Harrington", "Thomas Jachmann", "Frank Schumacher"]
@@ -43,8 +43,14 @@ describe Snippr::Processor::Dynamics do
43
43
  expect(subject.process(tpl, :var => Klass.new)).to eq("An instance METHOD WITH PARAMETER1 AND PARAMETER2")
44
44
  end
45
45
 
46
+ it "allows usage of snippr substitution inside method call parameters" do
47
+ pending 'fix it or use version 0.15.19'
48
+ tpl = 'An instance {var.method3("{var2.method()}","PARAMETER2")}'
49
+ expect(subject.process(tpl, :var => Klass.new, :var2 => Klass.new)).to eq('An instance METHOD WITH METHOD AND PARAMETER2')
50
+ end
51
+
46
52
  it "keeps the {snip} if calling a method but the method is not defined" do
47
- expect(subject.process("An instance {var.method_not_exist()}", :var => Klass.new)).to eq("An instance {var.method_not_exist()}")
53
+ expect(subject.process("An instance {var.method_not_exist()}", :var => Klass.new)).to eq("An instance {var.method_not_exist()}")
48
54
  end
49
55
 
50
56
  it "calls a bang(!) method even if the receiver does not respond_to the method" do
@@ -52,16 +58,6 @@ describe Snippr::Processor::Dynamics do
52
58
  expect { subject.process(tpl, :var => Klass.new) }.to raise_error(NoMethodError)
53
59
  end
54
60
 
55
- it "defaults the value if the content is empty" do
56
- tpl = "{empty|default}"
57
- expect(subject.process(tpl, empty: "")).to eq "default"
58
- end
59
-
60
- it "defaults the value if the content is present" do
61
- tpl = "{var.method4()|default2}"
62
- expect(subject.process(tpl, var: Klass.new )).to eq "default2"
63
- end
64
-
65
61
  it "leaves the dynamic vslue untouched if no replacement and default exists" do
66
62
  tpl = <<-HEREDOC
67
63
  .clazz {
@@ -73,4 +69,31 @@ describe Snippr::Processor::Dynamics do
73
69
  expect(subject.process(tpl)).to eq " .clazz {\n }\n\n .clazz {}\n </style>\n"
74
70
  end
75
71
 
72
+ context "default handling" do
73
+ it "defaults the value if the content is empty" do
74
+ expect(subject.process("{empty|default}", empty: "")).to eq "default"
75
+ end
76
+
77
+ it "defaults the value if the method calls return value is empty" do
78
+ expect(subject.process("{var.method4()|default2}", var: Klass.new )).to eq "default2"
79
+ end
80
+ end
81
+
82
+ context "nested placeholders" do
83
+ it "allows nested placeholders when calling a method" do
84
+ tpl = 'An instance {var.method3("{var2}","PARAMETER2")}'
85
+ expect(subject.process(tpl, :var => Klass.new, :var2 => "VAR")).to eq("An instance METHOD WITH VAR AND PARAMETER2")
86
+ end
87
+
88
+ it "allows nested placeholders with method calls when calling a method" do
89
+ tpl = 'An instance {var.method3("{var2.method()}","PARAMETER2")}'
90
+ expect(subject.process(tpl, :var => Klass.new, :var2 => Klass.new)).to eq("An instance METHOD WITH METHOD AND PARAMETER2")
91
+ end
92
+
93
+ it "allows nested placeholders with method calls on the same object when calling a method" do
94
+ tpl = 'An instance {var.method2("{var.method2("{var.method3("A","B")}")}")}'
95
+ expect(subject.process(tpl, :var => Klass.new)).to eq("An instance METHOD WITH METHOD WITH METHOD WITH A AND B")
96
+ end
97
+ end
98
+
76
99
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snippr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.22
4
+ version: 0.15.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Harrington
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-06-04 00:00:00.000000000 Z
13
+ date: 2014-06-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: i18n