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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aee03d439807e155008d14dfb189c1bbb51fe5e0
4
- data.tar.gz: 8213f0db1ad28ec7b51e99194562198f7c9c9b1a
3
+ metadata.gz: c879ef00340954d40021fd0a09592e77e6a2ae64
4
+ data.tar.gz: 3db13c8f77e7fa90297f6e449fae62cf25aacf43
5
5
  SHA512:
6
- metadata.gz: 9e2e037e06073b9a16b6216d2f6b1e34a0ae25d5e5d4d9782b97d2e657b4006b97488d150ecf668316d27350bff4902feadae944ba963378a0c4efa636f5d10e
7
- data.tar.gz: 16c67e121dcd5355802b349dd6dc4fbfbf5d96b508d0e65d5ecdffafe7f03a5b58b49f7ebce4d161f7360cb84d93f125a997b58a626749ef6eb54e07551fb947
6
+ metadata.gz: e1421b653fb2043448cdfcd18ea31206cca601173e6ceaae4c24fd7c1bcba09dba4177693da3ff367e928a6413ab3ea44c639ed8a9387b28b4c1b32632ae8dd1
7
+ data.tar.gz: 207e469de27f2ac0a9dd9a020d993728ef8e3ff4f55ad0be4df624ad9cf0704c311be59b9df5fe7dc8001a1a3df87acf226d95e12754e531248005fc28c9f8b7
data/.gitignore CHANGED
@@ -1 +1 @@
1
- *.gem
1
+ *.gem
data/LICENSE CHANGED
@@ -1,22 +1,22 @@
1
- The MIT License
2
-
3
- Copyright (c) 2016 Slight
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
22
-
1
+ The MIT License
2
+
3
+ Copyright (c) 2016 Slight
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
22
+
data/README.md CHANGED
@@ -1 +1,223 @@
1
- # Slight
1
+ # Slight-lang
2
+ A light and sweet template language.
3
+
4
+ ## Description
5
+ Slight is a very simple and easy to use template language.
6
+ Advantage of Slight:
7
+ - Pure Ruby syntax
8
+ - Html friendly
9
+ - Nearly 0 learning cost
10
+
11
+ ## Quick Start
12
+ #### [Installation]
13
+ ```
14
+ gem install slight-lang
15
+
16
+ # you can also build gem from gemspec
17
+ gem build slight.gemspec
18
+ gem install ./slight-lang-1.0.1.gem
19
+ ```
20
+
21
+ #### [Command]
22
+ ###### Slight
23
+ ```bash
24
+ slight [-v] <source> [<output>]
25
+
26
+ e.g.
27
+ slight index.slight index.htm
28
+ => index.htm
29
+
30
+ slight index.slight
31
+ => <tag>abcde</tag>
32
+
33
+ slight -v
34
+ => v 1.0.1
35
+ ```
36
+
37
+ ###### REPL
38
+ ```
39
+ slsh
40
+ ```
41
+ - build-in commands
42
+
43
+ ```ruby
44
+ # help
45
+ sl:> \h
46
+ @file => load and compile file dynamically. E.g. @/tmp/page.slight
47
+ >@ => set output. E.g. Open: >@/tmp/output. Turn off: >@off
48
+ \eg => example
49
+ \q => exit
50
+ \v => show version (also: \ver, \version)
51
+
52
+
53
+ # exit
54
+ sl:> \q (ctrl + c)
55
+ *** Exit now ***
56
+ --bye--
57
+
58
+
59
+ # show example
60
+ sl:> \eg
61
+ button "btn btn-primary" do
62
+ "Click me"
63
+ end
64
+ =>
65
+ <button class="btn btn-primary">Click me</button>
66
+
67
+
68
+ # compile slight file
69
+ sl:> @../../example/component.slight.rb
70
+ LOAD PATH="../../example/component.slight.rb"
71
+ <button class="btn btn-success btn-lg">
72
+ submit</button>
73
+
74
+
75
+ # redirect output to file
76
+ sl:> >@output.htm (>@off to turn off)
77
+ spool turned on
78
+ OUTPUT PATH="output.htm"
79
+ ```
80
+ - Run Slight in REPL
81
+
82
+ ```ruby
83
+ sl:> button 'btn btn-success btn-lg', name:'btn_submit', type:'submit' do
84
+ sl:> "Submit"
85
+ sl:> end
86
+ sl:> ; (Enter ';' to run the script)
87
+
88
+ <button class="btn btn-success btn-lg" name="btn_submit" type="submit">
89
+ Submit</button>
90
+ ```
91
+
92
+ #### [Syntax]
93
+
94
+ - Pure Ruby Syntax
95
+
96
+ ```ruby
97
+ tag_name "class", [attributes: id, name, style, etc.] do; <content>; end
98
+
99
+ e.g.
100
+ div "panel panel-lg", css: "border: 5 dotted green", id: "msgbox" do
101
+ button "btn btn-primary" do
102
+ "Ok"
103
+ end
104
+ button "btn btn-default" do
105
+ "Cancel"
106
+ end
107
+ end
108
+
109
+ (of course {} syntax is also spported)
110
+ ```
111
+ - All html tags are supported
112
+
113
+ - Default Build-in Html Shortcuts
114
+
115
+ ```ruby
116
+ [attribute]
117
+ css => "style"
118
+ ln => "href"
119
+ url => "href"
120
+ char => "charset"
121
+ fn => "src"
122
+ lang => "language"
123
+ xn => "xmlns"
124
+ mf => "manifest"
125
+
126
+ e.g.
127
+
128
+ div css:'border: 10 solid blue' do; "hello"; end
129
+ =>
130
+ <div style="border: 10 solid blue">
131
+ Hello
132
+ <div>
133
+
134
+ [tag]
135
+ _ => "<div>$content</div>"
136
+ js => "<script language='javscript'>$content</script>"
137
+ use => "<script type='text/javascript' src='$content'></script>"
138
+ use => "<link rel='stylesheet' href='$content'></link>"
139
+ # depends on which file loaded 'use' will determine which tag to replace.
140
+
141
+ e.g.
142
+
143
+ _ do; "hello"; end
144
+ =>
145
+ <div>hello</div>
146
+
147
+
148
+ js %{
149
+ console.log("hello slight");
150
+ }
151
+ =>
152
+ <script language="javascript">
153
+ console.log("hello slight");
154
+ </script>
155
+
156
+
157
+ use 'resource/bootstrap.js'
158
+ =>
159
+ <script type='text/javascript' src='resource/bootstrap.js'></script>
160
+
161
+
162
+ use 'resource/bootstrap.css'
163
+ =>
164
+ <link rel='stylesheet' href='resource/bootstrap.css'></link>
165
+ ```
166
+
167
+ #### [Customize]
168
+ - general usage (more details please refer to example)
169
+
170
+ ```ruby
171
+ conf = Slight::Configuration.new do |c|
172
+ c.shortcut :A, :endpoint, "href" #add an attribute shortcut
173
+ c.shortcut :T, "box", "div" #add a tag shortcut
174
+ end
175
+
176
+ custom_engine = Slight::Engine.new(conf)
177
+ ```
178
+
179
+ - supported configuration
180
+
181
+ ```ruby
182
+ conf = Slight::Configuration.new do |c|
183
+ c.shortcut :A, :endpoint, "href" #add an attribute shortcut
184
+ c.shortcut :T, "box", "div" #add a tag shotcut
185
+
186
+ # set output IO
187
+ c.setIO STDOUT
188
+
189
+ # undef ruby methods in slight context
190
+ c.blinding :p, :select, :puts, :send, :class
191
+
192
+ # use Filter
193
+ # Before-Filters accept original source pass the output to Slight compiler.
194
+ # After-Filters accept output from Slight compiler pass the output to end user.
195
+ c.use FilterA, :before
196
+ c.use FilterB, :after
197
+ end
198
+ ```
199
+
200
+ #### [Tilt]
201
+ - Working with Tilt
202
+ ```ruby
203
+ require 'slight/tilt'
204
+
205
+ script = %q{
206
+ div "btn btn-succes #{btn_size}" do
207
+ @btn_txt
208
+ end
209
+ }
210
+
211
+ @btn_txt = 'Pls,Click-Me.'
212
+ body = Proc.new { script }
213
+
214
+ template = Tilt.new('tilt_example.rb', 5, {}, &body)
215
+ puts template.render(self, :btn_size => "btn-lg")
216
+
217
+ # <div class="btn btn-succes btn-lg">
218
+ # Pls,Click-Me.
219
+ # </div>
220
+ ```
221
+
222
+
223
+ Any questions or suggestions are welcome. You can reach me at: nemo1023#gmail.com
data/bin/repl/repl.rb CHANGED
@@ -1,170 +1,170 @@
1
- $:.unshift File.expand_path('../../../lib', __FILE__)
2
-
3
- require_relative 'utils.rb'
4
- require 'slight'
5
- @default_engine = Slight::Engine.new
6
- @slout = STDOUT
7
-
8
- at_exit{
9
- puts "\n--bye--".light_blue
10
- @slout.close
11
- }
12
-
13
- Signal.trap("INT") do
14
- puts "Terminating...".light_blue
15
- puts "*** Exit now ***".light_blue
16
- exit 1
17
- end
18
-
19
- def main
20
- print_logo
21
- buff = ""
22
- loop do
23
- print "sl:> "
24
- case line = STDIN.readline.sub(/[\n\r]/,'').strip
25
- when /^\\/ # build-in commands
26
- case line
27
- when "\\h"
28
- print_help
29
- when "\\eg"
30
- print_example
31
- when "\\q"
32
- puts "*** Exit now ***".light_blue
33
- exit 0
34
- when /\\(v|version|ver)/
35
- puts "ver #{Slight::VERSION}\n\n"
36
- else
37
- puts "Invalid command. type \\h for help.".red
38
- end
39
- when /^@/
40
- if buff.size == 0 then
41
- fn = line.sub('@','')
42
- puts "LOAD PATH=\"#{fn}\"".light_blue
43
- sl_handler(fn, is_file=true)
44
- buff.clear
45
- puts ""
46
- else
47
- buff << line << "\n"
48
- end
49
- when /^>@/
50
- fn = line.split('@')[1] || ""
51
- case fn.strip
52
- when "off"
53
- unless @slout == STDOUT
54
- puts "spool turned off".light_blue
55
- @slout.close
56
- @slout = STDOUT
57
- else
58
- puts "spool was alread turned off".red
59
- end
60
- when ""
61
- puts "spool turned off. output path not set.".red
62
- else
63
- unless @slout == STDOUT then
64
- puts "spool was alread turned on".red
65
- else
66
- puts "spool turned on".light_blue
67
- puts "OUTPUT PATH=\"#{fn}\"".light_blue
68
- @slout = File.open(fn, 'w+')
69
- end
70
- end
71
- when ";"
72
- if buff.size > 0 then
73
- sl_handler(buff)
74
- buff.clear
75
- @slout.flush #if @slout == STDOUT
76
- puts ""
77
- end
78
- else
79
- buff << line << "\n"
80
- end
81
- end
82
- end
83
-
84
- def sl_handler(buff, is_file=false)
85
- if is_file
86
- output = @default_engine.render(buff)
87
- else
88
- output = @default_engine.render("console",buff)
89
- end
90
-
91
- if @slout == STDOUT
92
- @slout.puts output.green
93
- else
94
- @slout.puts output
95
- end
96
- rescue Exception => err
97
- errno = err.message.split(":")[1].to_i - 1
98
- buff.split("\n").each_with_index do |line, i|
99
- if i == errno then
100
- puts "=>#{i+1} #{line}".red
101
- else
102
- puts " #{i+1} #{line}".yellow
103
- end
104
- end
105
- puts ""
106
- STDERR.puts err.message.red
107
- #STDERR.puts [err.inspect, err.backtrace.join("\n")].join("\n")
108
- end
109
-
110
- def print_help
111
- puts " @file => load and compile file dynamically. E.g. @/tmp/page.slight".green
112
- puts " >@ => set output. E.g. Open: >@/tmp/output. Turn off: >@off".green
113
- puts " \\eg => example".green
114
- puts " \\q => exit".green
115
- puts " \\v => show version (also: \\ver, \\version)".green
116
- puts
117
- end
118
-
119
- def print_example
120
- eg1_in=%{
121
- html do
122
- head do
123
- titile "My Page"
124
- end
125
- body do
126
- button "btn btn-primary" do
127
- "Click me"
128
- end
129
- end
130
- end
131
- }
132
-
133
- eg1_out=%{
134
- <html>
135
- <head>
136
- <title>My Page</title>
137
- </head>
138
- <body>
139
- <button class="btn btn-primary">Click me</button>
140
- </body>
141
- </html>
142
- }.green
143
-
144
- eg2_in=%{
145
- div("panel panel-lg", css:"color:green"){
146
- span{"Hello World"}
147
- }
148
- }
149
-
150
- eg2_out=%{
151
- <div class="panel panel-lg", style="color:green">
152
- <span>Hello World</span>
153
- </div>
154
- }.green
155
-
156
- puts eg1_in
157
- puts "=>\n" + eg1_out
158
- puts
159
- puts eg2_in
160
- puts "=>\n" + eg2_out
161
-
162
- end
163
-
164
- def print_logo
165
- puts "**************************\n* Welcome to Slight REPL *".green
166
- puts "**************************".green
167
- puts "\\h for help.\n\n".green
168
- end
169
-
170
- main
1
+ $:.unshift File.expand_path('../../../lib', __FILE__)
2
+
3
+ require_relative 'utils.rb'
4
+ require 'slight'
5
+ @default_engine = Slight::Engine.new
6
+ @slout = STDOUT
7
+
8
+ at_exit{
9
+ puts "\n--bye--".light_blue
10
+ @slout.close
11
+ }
12
+
13
+ Signal.trap("INT") do
14
+ puts "Terminating...".light_blue
15
+ puts "*** Exit now ***".light_blue
16
+ exit 1
17
+ end
18
+
19
+ def main
20
+ print_logo
21
+ buff = ""
22
+ loop do
23
+ print "sl:> "
24
+ case line = STDIN.readline.sub(/[\n\r]/,'').strip
25
+ when /^\\/ # build-in commands
26
+ case line
27
+ when "\\h"
28
+ print_help
29
+ when "\\eg"
30
+ print_example
31
+ when "\\q"
32
+ puts "*** Exit now ***".light_blue
33
+ exit 0
34
+ when /\\(v|version|ver)/
35
+ puts "ver #{Slight::VERSION}\n\n"
36
+ else
37
+ puts "Invalid command. type \\h for help.".red
38
+ end
39
+ when /^@/
40
+ if buff.size == 0 then
41
+ fn = line.sub('@','')
42
+ puts "LOAD PATH=\"#{fn}\"".light_blue
43
+ sl_handler(fn, is_file=true)
44
+ buff.clear
45
+ puts ""
46
+ else
47
+ buff << line << "\n"
48
+ end
49
+ when /^>@/
50
+ fn = line.split('@')[1] || ""
51
+ case fn.strip
52
+ when "off"
53
+ unless @slout == STDOUT
54
+ puts "spool turned off".light_blue
55
+ @slout.close
56
+ @slout = STDOUT
57
+ else
58
+ puts "spool was alread turned off".red
59
+ end
60
+ when ""
61
+ puts "spool turned off. output path not set.".red
62
+ else
63
+ unless @slout == STDOUT then
64
+ puts "spool was alread turned on".red
65
+ else
66
+ puts "spool turned on".light_blue
67
+ puts "OUTPUT PATH=\"#{fn}\"".light_blue
68
+ @slout = File.open(fn, 'w+')
69
+ end
70
+ end
71
+ when ";"
72
+ if buff.size > 0 then
73
+ sl_handler(buff)
74
+ buff.clear
75
+ @slout.flush #if @slout == STDOUT
76
+ puts ""
77
+ end
78
+ else
79
+ buff << line << "\n"
80
+ end
81
+ end
82
+ end
83
+
84
+ def sl_handler(buff, is_file=false)
85
+ if is_file
86
+ output = @default_engine.render(buff)
87
+ else
88
+ output = @default_engine.render("console",buff)
89
+ end
90
+
91
+ if @slout == STDOUT
92
+ @slout.puts output.green
93
+ else
94
+ @slout.puts output
95
+ end
96
+ rescue Exception => err
97
+ errno = err.message.split(":")[1].to_i - 1
98
+ buff.split("\n").each_with_index do |line, i|
99
+ if i == errno then
100
+ puts "=>#{i+1} #{line}".red
101
+ else
102
+ puts " #{i+1} #{line}".yellow
103
+ end
104
+ end
105
+ puts ""
106
+ STDERR.puts err.message.red
107
+ #STDERR.puts [err.inspect, err.backtrace.join("\n")].join("\n")
108
+ end
109
+
110
+ def print_help
111
+ puts " @file => load and compile file dynamically. E.g. @/tmp/page.slight".green
112
+ puts " >@ => set output. E.g. Open: >@/tmp/output. Turn off: >@off".green
113
+ puts " \\eg => example".green
114
+ puts " \\q => exit".green
115
+ puts " \\v => show version (also: \\ver, \\version)".green
116
+ puts
117
+ end
118
+
119
+ def print_example
120
+ eg1_in=%{
121
+ html do
122
+ head do
123
+ titile "My Page"
124
+ end
125
+ body do
126
+ button "btn btn-primary" do
127
+ "Click me"
128
+ end
129
+ end
130
+ end
131
+ }
132
+
133
+ eg1_out=%{
134
+ <html>
135
+ <head>
136
+ <title>My Page</title>
137
+ </head>
138
+ <body>
139
+ <button class="btn btn-primary">Click me</button>
140
+ </body>
141
+ </html>
142
+ }.green
143
+
144
+ eg2_in=%{
145
+ div("panel panel-lg", css:"color:green"){
146
+ span{"Hello World"}
147
+ }
148
+ }
149
+
150
+ eg2_out=%{
151
+ <div class="panel panel-lg", style="color:green">
152
+ <span>Hello World</span>
153
+ </div>
154
+ }.green
155
+
156
+ puts eg1_in
157
+ puts "=>\n" + eg1_out
158
+ puts
159
+ puts eg2_in
160
+ puts "=>\n" + eg2_out
161
+
162
+ end
163
+
164
+ def print_logo
165
+ puts "**************************\n* Welcome to Slight REPL *".green
166
+ puts "**************************".green
167
+ puts "\\h for help.\n\n".green
168
+ end
169
+
170
+ main
data/bin/repl/utils.rb CHANGED
@@ -1,29 +1,29 @@
1
- # from stack overflow
2
- class String
3
- # colorization
4
- def colorize(color_code); "\e[#{color_code}m#{self}\e[0m"; end
5
- def light_blue; "\e[36m#{self}\e[0m"; end
6
- def black; "\e[30m#{self}\e[0m"; end
7
- def red; "\e[31m#{self}\e[0m"; end
8
- def green; "\e[32m#{self}\e[0m"; end
9
- def yellow; "\e[33m#{self}\e[0m"; end
10
- def blue; "\e[34m#{self}\e[0m"; end
11
- def magenta; "\e[35m#{self}\e[0m"; end
12
- def cyan; "\e[36m#{self}\e[0m"; end
13
- def gray; "\e[37m#{self}\e[0m"; end
14
-
15
- def bg_black; "\e[40m#{self}\e[0m"; end
16
- def bg_red; "\e[41m#{self}\e[0m"; end
17
- def bg_green; "\e[42m#{self}\e[0m"; end
18
- def bg_brown; "\e[43m#{self}\e[0m"; end
19
- def bg_blue; "\e[44m#{self}\e[0m"; end
20
- def bg_magenta; "\e[45m#{self}\e[0m"; end
21
- def bg_cyan; "\e[46m#{self}\e[0m"; end
22
- def bg_gray; "\e[47m#{self}\e[0m"; end
23
-
24
- def bold; "\e[1m#{self}\e[22m"; end
25
- def italic; "\e[3m#{self}\e[23m"; end
26
- def underline; "\e[4m#{self}\e[24m"; end
27
- def blink; "\e[5m#{self}\e[25m"; end
28
- def reverse_color; "\e[7m#{self}\e[27m"; end
29
- end
1
+ # from stack overflow
2
+ class String
3
+ # colorization
4
+ def colorize(color_code); "\e[#{color_code}m#{self}\e[0m"; end
5
+ def light_blue; "\e[36m#{self}\e[0m"; end
6
+ def black; "\e[30m#{self}\e[0m"; end
7
+ def red; "\e[31m#{self}\e[0m"; end
8
+ def green; "\e[32m#{self}\e[0m"; end
9
+ def yellow; "\e[33m#{self}\e[0m"; end
10
+ def blue; "\e[34m#{self}\e[0m"; end
11
+ def magenta; "\e[35m#{self}\e[0m"; end
12
+ def cyan; "\e[36m#{self}\e[0m"; end
13
+ def gray; "\e[37m#{self}\e[0m"; end
14
+
15
+ def bg_black; "\e[40m#{self}\e[0m"; end
16
+ def bg_red; "\e[41m#{self}\e[0m"; end
17
+ def bg_green; "\e[42m#{self}\e[0m"; end
18
+ def bg_brown; "\e[43m#{self}\e[0m"; end
19
+ def bg_blue; "\e[44m#{self}\e[0m"; end
20
+ def bg_magenta; "\e[45m#{self}\e[0m"; end
21
+ def bg_cyan; "\e[46m#{self}\e[0m"; end
22
+ def bg_gray; "\e[47m#{self}\e[0m"; end
23
+
24
+ def bold; "\e[1m#{self}\e[22m"; end
25
+ def italic; "\e[3m#{self}\e[23m"; end
26
+ def underline; "\e[4m#{self}\e[24m"; end
27
+ def blink; "\e[5m#{self}\e[25m"; end
28
+ def reverse_color; "\e[7m#{self}\e[27m"; end
29
+ end
data/bin/slight CHANGED
@@ -1,2 +1,2 @@
1
- #!/usr/bin/env ruby
2
- require_relative '../example/default_engine.rb'
1
+ #!/usr/bin/env ruby
2
+ require_relative '../example/default_engine.rb'