slight-lang 1.0.1 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/lib/slight/dsl.rb CHANGED
@@ -1,161 +1,169 @@
1
- require 'slight/utils'
2
-
3
- module Slight
4
- module DSLEssential
5
- def br; echo "<br/>\n"; end
6
-
7
- def hr; echo "<hr/>\n"; end
8
-
9
- def title(str); echo "<title>#{str}</title>\n"; end
10
-
11
- def js(str)
12
- echo "<script language=\"javascript\">\n#{str}\n</script>\n"
13
- end
14
-
15
- def doctype(type)
16
- case type
17
- when :html, :h5
18
- echo "<!DOCTYPE html>\n"
19
- when :h11
20
- echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">] + "\n"
21
- when :strict
22
- echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">] + "\n"
23
- when :frameset
24
- echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">] + "\n"
25
- when :mobile
26
- echo %q[<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">] + "\n"
27
- when :basic
28
- echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">] + "\n"
29
- when :transitional
30
- echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">] + "\n"
31
- when :xml
32
- echo %q[<?xml version="1.0" encoding="utf-8" ?>] + "\n"
33
- end
34
-
35
- end
36
-
37
- def use(uri, type=nil)
38
- case type ||= uri.split('.')[-1]
39
- when "js"
40
- echo "<script type=\"text/javascript\" src=\"#{uri}\"></script>\n"
41
- when "css"
42
- echo "<link rel=\"stylesheet\" href=\"#{uri}\"></link>\n"
43
- end
44
-
45
- end
46
-
47
- # load another page into current page
48
- def layout_yield(target_src)
49
- #eval(File.new(target_src).read, binding_scope, target_src, __LINE__ - 48)
50
- @load_history ||= [] # prevernt recursive page load
51
- #unless @load_history[target_src] then
52
- @load_history.push target_src
53
- unless @load_history.count(target_src) == 2
54
- self.instance_eval(File.new(target_src).read, target_src, __LINE__ - 48)
55
- else
56
- echo "<!--recursive page loading deteced, ignore.-->"
57
- end
58
- @load_history.pop
59
- nil
60
- end
61
-
62
- # set the placeholder in current page
63
- #def layout_placeholder(ph_alias="default")
64
- # echo "<!--######|PLACEHOLDER-#{ph_alias}|######-->"
65
- #end
66
-
67
- # attach itself to the placeholder in anther page
68
- #def layout_attach(page, ph_alias="default")
69
- #end
70
-
71
- end
72
-
73
- class DSLException < ScriptError ; end
74
-
75
- class DSL
76
- include DSLEssential
77
- include Utils
78
- undef :p, :select
79
-
80
- def initialize(io)
81
- @output_buffer = io
82
- #@root = page_node.new("root")
83
- end
84
-
85
- def puts(str); @output_buffer << html_escape(str); nil; end
86
-
87
- def echo(str); @output_buffer << str; nil; end
88
-
89
- def method_missing(fun, *param, &block)
90
- __dsl__define(fun)
91
- self.send(fun, *param, &block)
92
- end
93
-
94
- def binding_scope
95
- binding
96
- end
97
-
98
- def resolve_shortcutA(shortcutA)
99
- @__dsl__attr_replacements = shortcutA
100
- end
101
-
102
- def resolve_shortcutT(shortcutT)
103
- @__dsl__tag_replacements = shortcutT
104
- end
105
-
106
- def resolve_blinding(blinding)
107
- blinding.each do |m|
108
- undef_method m
109
- end
110
- end
111
-
112
- private
113
- def __dsl__define(tag)
114
- DSL.class_eval do
115
- define_method(tag){|*at, &block|
116
- __dsl__packup(tag.to_s, *at, &block)
117
- }
118
- end
119
- end
120
-
121
- def __dsl__packup(tag, *at)
122
- attr_replacements = @__dsl__attr_replacements||{}
123
- tag_replacements = @__dsl__tag_replacements||{}
124
- attrs=[]
125
-
126
- if self_close = tag.end_with?("!") then
127
- tag = tag[0..-2]
128
- end
129
-
130
- at.each do |var|
131
- if var.class == Hash then
132
- var.each_pair do |a, v|
133
- unless a.to_sym == :_ then
134
- at_new = attr_replacements.fetch(a, a)
135
- at_new = v.class == String ? "#{at_new}=\"#{v}\"" : "#{at_new}=#{v.to_s}"
136
- else
137
- at_new = "#{v}"
138
- end
139
- attrs.push at_new
140
- end
141
- elsif var.class == String
142
- attrs.push "class=\"#{var}\""
143
- end
144
- end
145
-
146
- s_tag = tag_replacements.fetch(tag.to_sym, tag)
147
- e_tag = s_tag.split(" ")[0]
148
-
149
- space = attrs.length > 0 ? " " : ""
150
- echo "<#{s_tag}#{space}#{attrs.join(" ")}"
151
- if self_close then
152
- echo "/>\n"
153
- else
154
- echo ">\n"
155
- puts yield.to_s if block_given?
156
- echo "</#{e_tag}>\n"
157
- end
158
-
159
- end
160
- end
161
- end
1
+ require 'slight/utils'
2
+
3
+ module Slight
4
+ module DSLEssential
5
+ def br; echo "<br/>\n"; end
6
+
7
+ def hr; echo "<hr/>\n"; end
8
+
9
+ def title(str); echo "<title>#{str}</title>\n"; end
10
+
11
+ def js(str)
12
+ echo "<script language=\"javascript\">\n#{str}\n</script>\n"
13
+ end
14
+
15
+ def doctype(type)
16
+ case type
17
+ when :html, :h5
18
+ echo "<!DOCTYPE html>\n"
19
+ when :h11
20
+ echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">] + "\n"
21
+ when :strict
22
+ echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">] + "\n"
23
+ when :frameset
24
+ echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">] + "\n"
25
+ when :mobile
26
+ echo %q[<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">] + "\n"
27
+ when :basic
28
+ echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">] + "\n"
29
+ when :transitional
30
+ echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">] + "\n"
31
+ when :xml
32
+ echo %q[<?xml version="1.0" encoding="utf-8" ?>] + "\n"
33
+ end
34
+
35
+ end
36
+
37
+ def use(uri, type=nil)
38
+ case type ||= uri.split('.')[-1]
39
+ when "js"
40
+ echo "<script type=\"text/javascript\" src=\"#{uri}\"></script>\n"
41
+ when "css"
42
+ echo "<link rel=\"stylesheet\" href=\"#{uri}\"></link>\n"
43
+ end
44
+
45
+ end
46
+
47
+ # load another page into current page
48
+ def layout_yield(target_src)
49
+ #eval(File.new(target_src).read, binding_scope, target_src, __LINE__ - 48)
50
+ @load_history ||= [] # prevernt recursive page load
51
+ #unless @load_history[target_src] then
52
+ @load_history.push target_src
53
+ unless @load_history.count(target_src) == 2
54
+ self.instance_eval(File.new(target_src).read, target_src, __LINE__ - 48)
55
+ else
56
+ echo "<!--recursive page loading deteced, ignore.-->"
57
+ end
58
+ @load_history.pop
59
+ nil
60
+ end
61
+
62
+ # set the placeholder in current page
63
+ #def layout_placeholder(ph_alias="default")
64
+ # echo "<!--######|PLACEHOLDER-#{ph_alias}|######-->"
65
+ #end
66
+
67
+ # attach itself to the placeholder in anther page
68
+ #def layout_attach(page, ph_alias="default")
69
+ #end
70
+
71
+ end
72
+
73
+ class DSLException < ScriptError ; end
74
+
75
+ class DSL
76
+ include DSLEssential
77
+ include Utils
78
+ undef :p, :select
79
+
80
+ def initialize(io)
81
+ @output_buffer = io
82
+ #@root = page_node.new("root")
83
+ end
84
+
85
+ def puts(str); @output_buffer << html_escape(str); nil; end
86
+
87
+ def echo(str); @output_buffer << str; nil; end
88
+
89
+ def method_missing(fun, *param, &block)
90
+ __dsl__define(fun)
91
+ self.send(fun, *param, &block)
92
+ end
93
+
94
+ def binding_scope
95
+ binding
96
+ end
97
+
98
+ def resolve_shortcutA(shortcutA)
99
+ @__dsl__attr_replacements = shortcutA
100
+ end
101
+
102
+ def resolve_shortcutT(shortcutT)
103
+ @__dsl__tag_replacements = shortcutT
104
+ end
105
+
106
+ def resolve_blinding(blinding)
107
+ blinding.each do |m|
108
+ undef_method m
109
+ end
110
+ end
111
+
112
+ def resolve_local(var,val)
113
+ self.singleton_class.class_eval do
114
+ define_method(var.to_sym){
115
+ return val
116
+ }
117
+ end
118
+ end
119
+
120
+ private
121
+ def __dsl__define(tag)
122
+ self.singleton_class.class_eval do
123
+ define_method(tag){|*at, &block|
124
+ __dsl__packup(tag.to_s, *at, &block)
125
+ }
126
+ end
127
+ end
128
+
129
+ def __dsl__packup(tag, *at)
130
+ attr_replacements = @__dsl__attr_replacements||{}
131
+ tag_replacements = @__dsl__tag_replacements||{}
132
+ attrs=[]
133
+
134
+ if self_close = tag.end_with?("!") then
135
+ tag = tag[0..-2]
136
+ end
137
+
138
+ at.each do |var|
139
+ if var.class == Hash then
140
+ var.each_pair do |a, v|
141
+ unless a.to_sym == :_ then
142
+ at_new = attr_replacements.fetch(a, a)
143
+ at_new = v.class == String ? "#{at_new}=\"#{v}\"" : "#{at_new}=#{v.to_s}"
144
+ else
145
+ at_new = "#{v}"
146
+ end
147
+ attrs.push at_new
148
+ end
149
+ elsif var.class == String
150
+ attrs.push "class=\"#{var}\""
151
+ end
152
+ end
153
+
154
+ s_tag = tag_replacements.fetch(tag.to_sym, tag)
155
+ e_tag = s_tag.split(" ")[0]
156
+
157
+ space = attrs.length > 0 ? " " : ""
158
+ echo "<#{s_tag}#{space}#{attrs.join(" ")}"
159
+ if self_close then
160
+ echo "/>\n"
161
+ else
162
+ echo ">\n"
163
+ puts yield.to_s if block_given?
164
+ echo "</#{e_tag}>\n"
165
+ end
166
+
167
+ end
168
+ end
169
+ end
data/lib/slight/engine.rb CHANGED
@@ -1,38 +1,45 @@
1
- require 'slight/config'
2
- require 'slight/template'
3
- module Slight
4
- class Filter; def self.do(src_data); return src_data; end; end
5
- class Engine
6
- def initialize(options = {})
7
- @options = options
8
- Configuration.new(@options) do |c|
9
- c.shortcut :A, :css, "style"
10
- c.shortcut :A, :ln, "href"
11
- c.shortcut :A, :url, "href"
12
- c.shortcut :A, :char, "charset"
13
- c.shortcut :A, :fn, "src"
14
- c.shortcut :A, :lang, "language"
15
- c.shortcut :A, :xn, "xmlns"
16
- c.shortcut :A, :mf, "manifest"
17
- c.shortcut :T, "_", "div"
18
- #c.shortcut :T, "js", %q[script language="javascript"]
19
- #c.use PrettyHtmlOutput, :after if c.get(:pretty_html)
20
- end
21
- @template = Template.new(@options)
22
- end
23
-
24
- def render(src_file, src_data = nil, local_vars={})
25
- # src file name is mainly using for identify issues for debugging
26
- # if data not given then read data from src file
27
- src_data ||= File.new(src_file).read
28
- @options[:before_filter].each do |f|
29
- src_data = f.do(src_data)
30
- end
31
- src_data = @template.render(src_data, src_file, local_vars)
32
- @options[:after_filter].each do |f|
33
- src_data = f.do(src_data)
34
- end
35
- src_data
36
- end
37
- end
38
- end
1
+ require 'slight/config'
2
+ require 'slight/template'
3
+ module Slight
4
+ class Filter; def self.do(src_data); return src_data; end; end
5
+ class Engine
6
+ def initialize(options = {})
7
+ @options = options
8
+ Configuration.new(@options) do |c|
9
+ c.shortcut :A, :css, "style"
10
+ c.shortcut :A, :ln, "href"
11
+ c.shortcut :A, :url, "href"
12
+ c.shortcut :A, :char, "charset"
13
+ c.shortcut :A, :fn, "src"
14
+ c.shortcut :A, :lang, "language"
15
+ c.shortcut :A, :xn, "xmlns"
16
+ c.shortcut :A, :mf, "manifest"
17
+ c.shortcut :T, "_", "div"
18
+ #c.shortcut :T, "js", %q[script language="javascript"]
19
+ #c.use PrettyHtmlOutput, :after if c.get(:pretty_html)
20
+ end
21
+ @template = Template.new(@options)
22
+ end
23
+
24
+ def render(src_file, src_data = nil, local_vars={})
25
+ # src file name is mainly using for identify issues for debugging
26
+ # if data not given then read data from src file
27
+
28
+ # Data > File
29
+
30
+ #src_data = script.call if block_given?
31
+ src_data ||= File.new(src_file).read
32
+
33
+ @options[:before_filter].each do |f|
34
+ src_data = f.do(src_data)
35
+ end
36
+
37
+ src_data = @template.render(src_data, src_file, local_vars)
38
+
39
+ @options[:after_filter].each do |f|
40
+ src_data = f.do(src_data)
41
+ end
42
+ src_data
43
+ end
44
+ end
45
+ end
@@ -1,28 +1,38 @@
1
- require 'slight/dsl'
2
-
3
- module Slight
4
- class Template
5
- def initialize(options = {})
6
- @options = options
7
- @output_buffer = @options[:io_out] || ""
8
- @dsl = DSL.new(@output_buffer)
9
-
10
- @dsl.resolve_shortcutA(@options[:shortcutA])
11
- @dsl.resolve_shortcutT(@options[:shortcutT])
12
- @dsl.resolve_blinding(@options[:blinding])
13
- end
14
-
15
- def render(src_data, src_file, local_vars = {})
16
- @output_buffer.clear
17
- local_vars.each_pair do |key, value|
18
- @dsl.binding_scope.local_variable_set(key.to_sym, value)
19
- end
20
- begin
21
- eval(src_data, @dsl.binding_scope, src_file, __LINE__ - 20)
22
- rescue => ex
23
- raise DSLException.new(ex.message)
24
- end
25
- @output_buffer
26
- end
27
- end
28
- end
1
+ require 'slight/dsl'
2
+
3
+ module Slight
4
+ class Template
5
+ def initialize(options = {})
6
+ @options = options
7
+ @output_buffer = @options[:io_out] || ""
8
+ @dsl = DSL.new(@output_buffer)
9
+
10
+ @dsl.resolve_shortcutA(@options[:shortcutA])
11
+ @dsl.resolve_shortcutT(@options[:shortcutT])
12
+ @dsl.resolve_blinding(@options[:blinding])
13
+ end
14
+
15
+ def render(src_data, src_file, local_vars = {})
16
+ @output_buffer.clear
17
+
18
+ local_vars.each_pair do |key, value|
19
+ if key == :__scope then
20
+ scope = value
21
+ scope_vars = scope.instance_variables
22
+ scope_vars.each do |var|
23
+ @dsl.instance_variable_set(var, scope.instance_variable_get(var))
24
+ end
25
+ else
26
+ @dsl.resolve_local(key, value)
27
+ end
28
+ end
29
+
30
+ begin
31
+ @dsl.instance_eval(src_data, src_file, __LINE__ - 20)
32
+ rescue => ex
33
+ raise DSLException.new(ex.message)
34
+ end
35
+ @output_buffer
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,26 @@
1
+ require 'tilt'
2
+ require 'tilt/template'
3
+ require 'slight'
4
+
5
+ module Tilt
6
+ class SlightTemplate < Template
7
+ self.default_mime_type = 'text/html'
8
+
9
+ def prepare
10
+ @engine = ::Slight::Engine.new
11
+ #@engine = ::ERB.new(data, options[:safe], options[:trim], @outvar)
12
+ end
13
+
14
+ def evaluate(scope, locals, &block)
15
+ #scope_vars = scope.instance_variables
16
+ #scope_vars.each do |var|
17
+ # @engine.instance_variable_set(var, scope.instance_variable_get(var))
18
+ #end
19
+ locals[:__scope] = scope
20
+ @output ||= @engine.render(file, data, locals)
21
+ end
22
+ end
23
+
24
+ register_lazy "SlightTemplate", 'slight/tilt', 'slight', 'rb'
25
+
26
+ end
data/lib/slight/utils.rb CHANGED
@@ -1,38 +1,38 @@
1
- # Borrow from ERB Source
2
- # ERB::Util
3
- module Slight
4
- module Utils
5
- public
6
- # A utility method for escaping HTML tag characters in _s_.
7
- #
8
- # require "erb"
9
- # include ERB::Util
10
- #
11
- # puts html_escape("is a > 0 & a < 10?")
12
- #
13
- # _Generates_
14
- #
15
- # is a &gt; 0 &amp; a &lt; 10?
16
- #
17
- # [Slight] => Add: gsub(/[[:blank:]]/,"&nbsp;") to support space.
18
- def html_escape(s)
19
- s.to_s.gsub(/&/, "&amp;").gsub(/[[:blank:]]/,"&nbsp;").gsub(/\"/, "&quot;").gsub(/>/, "&gt;").gsub(/</, "&lt;")
20
- end
21
- module_function :html_escape
22
- # A utility method for encoding the String _s_ as a URL.
23
- #
24
- # require "erb"
25
- # include ERB::Util
26
- #
27
- # puts url_encode("Programming Ruby: The Pragmatic Programmer's Guide")
28
- #
29
- # _Generates_
30
- #
31
- # Programming%20Ruby%3A%20%20The%20Pragmatic%20Programmer%27s%20Guide
32
- #
33
- def url_encode(s)
34
- s.to_s.gsub(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) }
35
- end
36
- module_function :url_encode
37
- end
38
- end
1
+ # Borrow from ERB Source
2
+ # ERB::Util
3
+ module Slight
4
+ module Utils
5
+ public
6
+ # A utility method for escaping HTML tag characters in _s_.
7
+ #
8
+ # require "erb"
9
+ # include ERB::Util
10
+ #
11
+ # puts html_escape("is a > 0 & a < 10?")
12
+ #
13
+ # _Generates_
14
+ #
15
+ # is a &gt; 0 &amp; a &lt; 10?
16
+ #
17
+ # [Slight] => Add: gsub(/[[:blank:]]/,"&nbsp;") to support space.
18
+ def html_escape(s)
19
+ s.to_s.gsub(/&/, "&amp;").gsub(/[[:blank:]]/,"&nbsp;").gsub(/\"/, "&quot;").gsub(/>/, "&gt;").gsub(/</, "&lt;")
20
+ end
21
+ module_function :html_escape
22
+ # A utility method for encoding the String _s_ as a URL.
23
+ #
24
+ # require "erb"
25
+ # include ERB::Util
26
+ #
27
+ # puts url_encode("Programming Ruby: The Pragmatic Programmer's Guide")
28
+ #
29
+ # _Generates_
30
+ #
31
+ # Programming%20Ruby%3A%20%20The%20Pragmatic%20Programmer%27s%20Guide
32
+ #
33
+ def url_encode(s)
34
+ s.to_s.gsub(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) }
35
+ end
36
+ module_function :url_encode
37
+ end
38
+ end
data/lib/slight.rb CHANGED
@@ -1,6 +1,8 @@
1
- require 'slight/engine'
2
- module Slight
3
- # Slight version string
4
- # @api public
5
- VERSION = '1.0.1'
6
- end
1
+ require 'slight/engine'
2
+ module Slight
3
+ # Slight version string
4
+ # @api public
5
+ VERSION = '1.0.5'
6
+ # 1.0.0 => Basic Template features | 201703
7
+ # 1.0.5 => Support Tilt, Render Scope Binding | 201704
8
+ end
data/slight.gemspec CHANGED
@@ -1,21 +1,21 @@
1
- # -*- encoding: utf-8
2
- $:.unshift File.expand_path('../lib', __FILE__)
3
- require 'slight'
4
-
5
- Gem::Specification.new do |gem|
6
- gem.authors = ["oliver.yu"]
7
- gem.email = ["nemo1023@gmail.com"]
8
- gem.description = %q{A light and sweet template language}
9
- gem.summary = %q{The goal of this is to use ruby syntax and html style shotcut to write template.}
10
- gem.homepage = "https://github.com/OliversCat/Slight"
11
- gem.files = `git ls-files`.split($\)
12
- #gem.files = dir('.')
13
- #gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) unless f.end_with? ".rb" }
14
- gem.executables = ["slsh","slight"]
15
- #gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
16
- gem.test_files = ["spec"]
17
- gem.name = "slight-lang"
18
- gem.require_paths = ["lib"]
19
- gem.version = Slight::VERSION
20
- gem.license = "MIT"
21
- end
1
+ # -*- encoding: utf-8
2
+ $:.unshift File.expand_path('../lib', __FILE__)
3
+ require 'slight'
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.authors = ["oliver.yu"]
7
+ gem.email = ["nemo1023@gmail.com"]
8
+ gem.description = %q{A light and sweet template language}
9
+ gem.summary = %q{The goal of this is to use ruby syntax and html style shotcut to write template.}
10
+ gem.homepage = "https://github.com/OliversCat/Slight"
11
+ gem.files = `git ls-files`.split($\)
12
+ #gem.files = dir('.')
13
+ #gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) unless f.end_with? ".rb" }
14
+ gem.executables = ["slsh","slight"]
15
+ #gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
16
+ gem.test_files = ["spec"]
17
+ gem.name = "slight-lang"
18
+ gem.require_paths = ["lib"]
19
+ gem.version = Slight::VERSION
20
+ gem.license = "MIT"
21
+ end
data/spec/bin_spec.rb ADDED
File without changes
data/spec/dsl_spec.rb ADDED
File without changes
File without changes