RubyApp 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. data/Gemfile.lock +2 -2
  2. data/lib/ruby_app/configuration.yml +7 -0
  3. data/lib/ruby_app/elements/pages/.cache/default_page.css +37 -0
  4. data/lib/ruby_app/elements/pages/.cache/default_page.js +205 -0
  5. data/lib/ruby_app/elements/pages/test_pages/.cache/button_test_page.css +37 -0
  6. data/lib/ruby_app/elements/pages/test_pages/.cache/button_test_page.js +212 -0
  7. data/lib/ruby_app/elements/pages/test_pages/.cache/default_test_page.css +47 -0
  8. data/lib/ruby_app/elements/pages/test_pages/.cache/default_test_page.js +212 -0
  9. data/lib/ruby_app/elements/pages/test_pages/.cache/dialog_test_page.css +75 -0
  10. data/lib/ruby_app/elements/pages/test_pages/.cache/dialog_test_page.js +230 -0
  11. data/lib/ruby_app/elements/pages/test_pages/.cache/input_test_page.css +47 -0
  12. data/lib/ruby_app/elements/pages/test_pages/.cache/input_test_page.js +241 -0
  13. data/lib/ruby_app/elements/pages/test_pages/.cache/link_test_page.css +37 -0
  14. data/lib/ruby_app/elements/pages/test_pages/.cache/link_test_page.js +212 -0
  15. data/lib/ruby_app/elements/pages/test_pages/.cache/linked_test_page.css +37 -0
  16. data/lib/ruby_app/elements/pages/test_pages/.cache/linked_test_page.js +205 -0
  17. data/lib/ruby_app/elements/pages/test_pages/.cache/list_test_page.css +47 -0
  18. data/lib/ruby_app/elements/pages/test_pages/.cache/list_test_page.js +226 -0
  19. data/lib/ruby_app/elements/pages/test_pages/.cache/markdown_test_page.css +37 -0
  20. data/lib/ruby_app/elements/pages/test_pages/.cache/markdown_test_page.js +205 -0
  21. data/lib/ruby_app/elements/pages/test_pages/.cache/test_page.css +47 -0
  22. data/lib/ruby_app/elements/pages/test_pages/.cache/test_page.js +220 -0
  23. data/lib/ruby_app/mixins/render_mixin.rb +4 -0
  24. data/lib/ruby_app/mixins/template_mixin.rb +5 -0
  25. data/lib/ruby_app/rack/request.rb +1 -1
  26. data/lib/ruby_app/rack/response.rb +1 -1
  27. data/lib/ruby_app/rack/route.rb +2 -1
  28. data/lib/ruby_app/rack/session.rb +1 -1
  29. data/lib/ruby_app/response.rb +24 -0
  30. data/lib/ruby_app/version.rb +1 -1
  31. data/rakefile +26 -10
  32. metadata +88 -68
@@ -10,6 +10,10 @@ module RubyApp
10
10
  module RenderMixin
11
11
  require 'ruby_app'
12
12
 
13
+ def cache(format)
14
+ return self.is_a?(Class) ? self.get_cache(format) : self.class.get_cache(format)
15
+ end
16
+
13
17
  def templates(format)
14
18
  return self.is_a?(Class) ? self.get_templates(format) : self.class.get_templates(format)
15
19
  end
@@ -33,6 +33,11 @@ module RubyApp
33
33
  return (File.exists?(template) ? [template] : []).concat((!self.exclude_parent_template?(format) && self.superclass.respond_to?(:get_templates) ) ? self.superclass.get_templates(format) : [])
34
34
  end
35
35
 
36
+ def get_cache(format)
37
+ template = self.get_template(format)
38
+ return File.join(File.dirname(template), '.cache', File.basename(template)).gsub(/\.haml/, '')
39
+ end
40
+
36
41
  end
37
42
 
38
43
  end
@@ -1,9 +1,9 @@
1
1
  module RubyApp
2
2
 
3
3
  module Rack
4
+ require 'ruby_app'
4
5
 
5
6
  class Request
6
- require 'ruby_app'
7
7
 
8
8
  def initialize(application)
9
9
  @application = application
@@ -1,9 +1,9 @@
1
1
  module RubyApp
2
2
 
3
3
  module Rack
4
+ require 'ruby_app'
4
5
 
5
6
  class Response
6
- require 'ruby_app'
7
7
 
8
8
  def initialize(application)
9
9
  @application = application
@@ -40,7 +40,8 @@ module RubyApp
40
40
  RubyApp::Response['Content-Type'] = RubyApp::Element.get_content_type(format)
41
41
  page = RubyApp::Session.pages.last
42
42
  RubyApp::Log.duration("GET #{page.class} #{format}") do
43
- RubyApp::Response.write(page.render(format.to_sym))
43
+ RubyApp::Response.write_from_cache(page, format.to_sym)
44
+ #RubyApp::Response.write(page.render(format.to_sym))
44
45
  end
45
46
  end
46
47
 
@@ -1,9 +1,9 @@
1
1
  module RubyApp
2
2
 
3
3
  module Rack
4
+ require 'ruby_app'
4
5
 
5
6
  class Session
6
- require 'ruby_app'
7
7
 
8
8
  def initialize(application)
9
9
  @application = application
@@ -9,6 +9,7 @@ module RubyApp
9
9
 
10
10
  class Response < ::Rack::Response
11
11
  extend RubyApp::Mixins::DelegateMixin
12
+ extend RubyApp::Mixins::ConfigurationMixin
12
13
 
13
14
  def rendered?(template)
14
15
  return @rendered.key?(template)
@@ -32,6 +33,29 @@ module RubyApp
32
33
  @content[element] = {}
33
34
  end
34
35
 
36
+ def write_from_cache(element, format)
37
+ if RubyApp::Response.configuration.cache.formats.include?(format)
38
+ cache = element.cache(format)
39
+ if RubyApp::Response.configuration.cache.read? && File.exists?(cache)
40
+ RubyApp::Log.debug("#{RubyApp::Log.prefix(self, __method__)} READ #{cache.inspect}")
41
+ self.write(File.read(cache))
42
+ else
43
+ content = element.render(format)
44
+ if RubyApp::Response.configuration.cache.write? && !File.exists?(cache)
45
+ FileUtils.mkdir_p(File.dirname(cache))
46
+ RubyApp::Log.debug("#{RubyApp::Log.prefix(self, __method__)} WRITE #{cache.inspect}")
47
+ File.open(cache, 'w') do |file|
48
+ file.write(content)
49
+ file.flush
50
+ end
51
+ end
52
+ self.write(content)
53
+ end
54
+ else
55
+ self.write(element.render(format))
56
+ end
57
+ end
58
+
35
59
  def self.get
36
60
  return Thread.current[:_response]
37
61
  end
@@ -1,4 +1,4 @@
1
1
  module RubyApp
2
- VERSION = "0.2.4"
2
+ VERSION = "0.2.5"
3
3
  ROOT = File.expand_path(File.dirname(__FILE__))
4
4
  end
data/rakefile CHANGED
@@ -10,12 +10,12 @@ namespace :ruby_app do
10
10
 
11
11
  desc 'Create console'
12
12
  task :console do |task|
13
- system("cd ./lib/ruby_app && clear && bundle exec ../../bin/ruby_app console")
13
+ system('cd ./lib/ruby_app && clear && bundle exec ../../bin/ruby_app console')
14
14
  end
15
15
 
16
16
  desc 'Run'
17
- task :run do |task|
18
- system("cd ./lib/ruby_app && clear && bundle exec ../../bin/ruby_app run")
17
+ task :run => ['ruby_app:cache:destroy'] do |task|
18
+ system('cd ./lib/ruby_app && clear && bundle exec ../../bin/ruby_app run')
19
19
  end
20
20
 
21
21
  desc 'Get version'
@@ -25,18 +25,19 @@ namespace :ruby_app do
25
25
 
26
26
  desc 'Push to master, release, and increment version'
27
27
  task :release do |task|
28
- system "git push origin master && rake release"
28
+ system('git push origin master && rake release')
29
29
  version_file = File.join(RubyApp::ROOT, %w[version.rb])
30
30
  RubyApp::VERSION =~ /(\d+)\.(\d+)\.(\d+)/
31
- system "sed 's|[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*|#{$1}.#{$2}.#{$3.to_i + 1}|g' < '#{version_file}' > '#{version_file}.out'; rm '#{version_file}'; mv '#{version_file}.out' '#{version_file}'"
32
- system "git commit --all --message='Incrementing version'"
31
+ system("sed 's|[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*|#{$1}.#{$2}.#{$3.to_i + 1}|g' < '#{version_file}' > '#{version_file}.out'; rm '#{version_file}'; mv '#{version_file}.out' '#{version_file}'")
32
+ system('git commit --all --message=\'Incrementing version\'')
33
33
  end
34
34
 
35
35
  namespace :test do
36
36
 
37
37
  desc 'Run all tests'
38
- task :all => ['test:specs',
39
- 'test:features']
38
+ task :all => ['ruby_app:cache:destroy',
39
+ 'ruby_app:test:specs',
40
+ 'ruby_app:test:features']
40
41
 
41
42
  desc 'Run RSpec tests'
42
43
  task :specs, :file, :line do |task, arguments|
@@ -47,14 +48,14 @@ namespace :ruby_app do
47
48
  system("bundle exec rspec #{arguments.file} --format=documentation --colour")
48
49
  end
49
50
  else
50
- system("bundle exec rspec spec/ --format=documentation --colour")
51
+ system('bundle exec rspec spec/ --format=documentation --colour')
51
52
  end
52
53
  end
53
54
 
54
55
  desc 'Run feature tests for all features or the given feature file'
55
56
  task :features, :file do |task, arguments|
56
57
  unless arguments.file
57
- system("bundle exec cucumber --format pretty --tags ~@broken --require features")
58
+ system('bundle exec cucumber --format pretty --tags ~@broken --require features')
58
59
  else
59
60
  system("bundle exec cucumber --format pretty --tags ~@broken --require features '#{arguments.file}'")
60
61
  end
@@ -62,4 +63,19 @@ namespace :ruby_app do
62
63
 
63
64
  end
64
65
 
66
+ namespace :cache do
67
+
68
+ desc 'List all cached files'
69
+ task :list do
70
+ system('find . | grep \'\\.cache\'')
71
+ end
72
+
73
+ desc 'Remove all cached files'
74
+ task :destroy do
75
+ puts 'Removing cached files ...'
76
+ system('find . -name \'.cache\' | xargs rm -rv')
77
+ end
78
+
79
+ end
80
+
65
81
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: RubyApp
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 4
10
- version: 0.2.4
9
+ - 5
10
+ version: 0.2.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Frank G. Ficnar
@@ -15,9 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-03-22 00:00:00 Z
18
+ date: 2012-03-23 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
+ prerelease: false
22
+ name: BlueCloth
21
23
  version_requirements: &id001 !ruby/object:Gem::Requirement
22
24
  none: false
23
25
  requirements:
@@ -27,11 +29,11 @@ dependencies:
27
29
  segments:
28
30
  - 0
29
31
  version: "0"
30
- requirement: *id001
31
32
  type: :runtime
32
- prerelease: false
33
- name: BlueCloth
33
+ requirement: *id001
34
34
  - !ruby/object:Gem::Dependency
35
+ prerelease: false
36
+ name: chronic
35
37
  version_requirements: &id002 !ruby/object:Gem::Requirement
36
38
  none: false
37
39
  requirements:
@@ -41,11 +43,11 @@ dependencies:
41
43
  segments:
42
44
  - 0
43
45
  version: "0"
44
- requirement: *id002
45
46
  type: :runtime
46
- prerelease: false
47
- name: chronic
47
+ requirement: *id002
48
48
  - !ruby/object:Gem::Dependency
49
+ prerelease: false
50
+ name: chronic_duration
49
51
  version_requirements: &id003 !ruby/object:Gem::Requirement
50
52
  none: false
51
53
  requirements:
@@ -55,11 +57,11 @@ dependencies:
55
57
  segments:
56
58
  - 0
57
59
  version: "0"
58
- requirement: *id003
59
60
  type: :runtime
60
- prerelease: false
61
- name: chronic_duration
61
+ requirement: *id003
62
62
  - !ruby/object:Gem::Dependency
63
+ prerelease: false
64
+ name: facets
63
65
  version_requirements: &id004 !ruby/object:Gem::Requirement
64
66
  none: false
65
67
  requirements:
@@ -69,11 +71,11 @@ dependencies:
69
71
  segments:
70
72
  - 0
71
73
  version: "0"
72
- requirement: *id004
73
74
  type: :runtime
74
- prerelease: false
75
- name: facets
75
+ requirement: *id004
76
76
  - !ruby/object:Gem::Dependency
77
+ prerelease: false
78
+ name: fileutils
77
79
  version_requirements: &id005 !ruby/object:Gem::Requirement
78
80
  none: false
79
81
  requirements:
@@ -83,11 +85,11 @@ dependencies:
83
85
  segments:
84
86
  - 0
85
87
  version: "0"
86
- requirement: *id005
87
88
  type: :runtime
88
- prerelease: false
89
- name: fileutils
89
+ requirement: *id005
90
90
  - !ruby/object:Gem::Dependency
91
+ prerelease: false
92
+ name: haml
91
93
  version_requirements: &id006 !ruby/object:Gem::Requirement
92
94
  none: false
93
95
  requirements:
@@ -97,11 +99,11 @@ dependencies:
97
99
  segments:
98
100
  - 0
99
101
  version: "0"
100
- requirement: *id006
101
102
  type: :runtime
102
- prerelease: false
103
- name: haml
103
+ requirement: *id006
104
104
  - !ruby/object:Gem::Dependency
105
+ prerelease: false
106
+ name: json
105
107
  version_requirements: &id007 !ruby/object:Gem::Requirement
106
108
  none: false
107
109
  requirements:
@@ -111,11 +113,11 @@ dependencies:
111
113
  segments:
112
114
  - 0
113
115
  version: "0"
114
- requirement: *id007
115
116
  type: :runtime
116
- prerelease: false
117
- name: json
117
+ requirement: *id007
118
118
  - !ruby/object:Gem::Dependency
119
+ prerelease: false
120
+ name: mime-types
119
121
  version_requirements: &id008 !ruby/object:Gem::Requirement
120
122
  none: false
121
123
  requirements:
@@ -125,11 +127,11 @@ dependencies:
125
127
  segments:
126
128
  - 0
127
129
  version: "0"
128
- requirement: *id008
129
130
  type: :runtime
130
- prerelease: false
131
- name: mime-types
131
+ requirement: *id008
132
132
  - !ruby/object:Gem::Dependency
133
+ prerelease: false
134
+ name: r18n-core
133
135
  version_requirements: &id009 !ruby/object:Gem::Requirement
134
136
  none: false
135
137
  requirements:
@@ -139,11 +141,11 @@ dependencies:
139
141
  segments:
140
142
  - 0
141
143
  version: "0"
142
- requirement: *id009
143
144
  type: :runtime
144
- prerelease: false
145
- name: r18n-core
145
+ requirement: *id009
146
146
  - !ruby/object:Gem::Dependency
147
+ prerelease: false
148
+ name: rack
147
149
  version_requirements: &id010 !ruby/object:Gem::Requirement
148
150
  none: false
149
151
  requirements:
@@ -153,11 +155,11 @@ dependencies:
153
155
  segments:
154
156
  - 0
155
157
  version: "0"
156
- requirement: *id010
157
158
  type: :runtime
158
- prerelease: false
159
- name: rack
159
+ requirement: *id010
160
160
  - !ruby/object:Gem::Dependency
161
+ prerelease: false
162
+ name: ruby-event
161
163
  version_requirements: &id011 !ruby/object:Gem::Requirement
162
164
  none: false
163
165
  requirements:
@@ -167,11 +169,11 @@ dependencies:
167
169
  segments:
168
170
  - 0
169
171
  version: "0"
170
- requirement: *id011
171
172
  type: :runtime
172
- prerelease: false
173
- name: ruby-event
173
+ requirement: *id011
174
174
  - !ruby/object:Gem::Dependency
175
+ prerelease: false
176
+ name: ruby-openid
175
177
  version_requirements: &id012 !ruby/object:Gem::Requirement
176
178
  none: false
177
179
  requirements:
@@ -181,11 +183,11 @@ dependencies:
181
183
  segments:
182
184
  - 0
183
185
  version: "0"
184
- requirement: *id012
185
186
  type: :runtime
186
- prerelease: false
187
- name: ruby-openid
187
+ requirement: *id012
188
188
  - !ruby/object:Gem::Dependency
189
+ prerelease: false
190
+ name: sass
189
191
  version_requirements: &id013 !ruby/object:Gem::Requirement
190
192
  none: false
191
193
  requirements:
@@ -195,11 +197,11 @@ dependencies:
195
197
  segments:
196
198
  - 0
197
199
  version: "0"
198
- requirement: *id013
199
200
  type: :runtime
200
- prerelease: false
201
- name: sass
201
+ requirement: *id013
202
202
  - !ruby/object:Gem::Dependency
203
+ prerelease: false
204
+ name: term-ansicolor
203
205
  version_requirements: &id014 !ruby/object:Gem::Requirement
204
206
  none: false
205
207
  requirements:
@@ -209,11 +211,11 @@ dependencies:
209
211
  segments:
210
212
  - 0
211
213
  version: "0"
212
- requirement: *id014
213
214
  type: :runtime
214
- prerelease: false
215
- name: term-ansicolor
215
+ requirement: *id014
216
216
  - !ruby/object:Gem::Dependency
217
+ prerelease: false
218
+ name: yajl-ruby
217
219
  version_requirements: &id015 !ruby/object:Gem::Requirement
218
220
  none: false
219
221
  requirements:
@@ -223,11 +225,11 @@ dependencies:
223
225
  segments:
224
226
  - 0
225
227
  version: "0"
226
- requirement: *id015
227
228
  type: :runtime
228
- prerelease: false
229
- name: yajl-ruby
229
+ requirement: *id015
230
230
  - !ruby/object:Gem::Dependency
231
+ prerelease: false
232
+ name: capybara
231
233
  version_requirements: &id016 !ruby/object:Gem::Requirement
232
234
  none: false
233
235
  requirements:
@@ -237,11 +239,11 @@ dependencies:
237
239
  segments:
238
240
  - 0
239
241
  version: "0"
240
- requirement: *id016
241
242
  type: :development
242
- prerelease: false
243
- name: capybara
243
+ requirement: *id016
244
244
  - !ruby/object:Gem::Dependency
245
+ prerelease: false
246
+ name: cucumber
245
247
  version_requirements: &id017 !ruby/object:Gem::Requirement
246
248
  none: false
247
249
  requirements:
@@ -251,11 +253,11 @@ dependencies:
251
253
  segments:
252
254
  - 0
253
255
  version: "0"
254
- requirement: *id017
255
256
  type: :development
256
- prerelease: false
257
- name: cucumber
257
+ requirement: *id017
258
258
  - !ruby/object:Gem::Dependency
259
+ prerelease: false
260
+ name: launchy
259
261
  version_requirements: &id018 !ruby/object:Gem::Requirement
260
262
  none: false
261
263
  requirements:
@@ -265,11 +267,11 @@ dependencies:
265
267
  segments:
266
268
  - 0
267
269
  version: "0"
268
- requirement: *id018
269
270
  type: :development
270
- prerelease: false
271
- name: launchy
271
+ requirement: *id018
272
272
  - !ruby/object:Gem::Dependency
273
+ prerelease: false
274
+ name: rake
273
275
  version_requirements: &id019 !ruby/object:Gem::Requirement
274
276
  none: false
275
277
  requirements:
@@ -279,11 +281,11 @@ dependencies:
279
281
  segments:
280
282
  - 0
281
283
  version: "0"
282
- requirement: *id019
283
284
  type: :development
284
- prerelease: false
285
- name: rake
285
+ requirement: *id019
286
286
  - !ruby/object:Gem::Dependency
287
+ prerelease: false
288
+ name: rspec
287
289
  version_requirements: &id020 !ruby/object:Gem::Requirement
288
290
  none: false
289
291
  requirements:
@@ -293,11 +295,11 @@ dependencies:
293
295
  segments:
294
296
  - 0
295
297
  version: "0"
296
- requirement: *id020
297
298
  type: :development
298
- prerelease: false
299
- name: rspec
299
+ requirement: *id020
300
300
  - !ruby/object:Gem::Dependency
301
+ prerelease: false
302
+ name: rspec-mocks
301
303
  version_requirements: &id021 !ruby/object:Gem::Requirement
302
304
  none: false
303
305
  requirements:
@@ -307,10 +309,8 @@ dependencies:
307
309
  segments:
308
310
  - 0
309
311
  version: "0"
310
- requirement: *id021
311
312
  type: :development
312
- prerelease: false
313
- name: rspec-mocks
313
+ requirement: *id021
314
314
  description: A web application framework in Ruby
315
315
  email:
316
316
  - frank.ficnar@gmail.com
@@ -432,6 +432,8 @@ files:
432
432
  - lib/ruby_app/elements/navigation/page_link.js.haml
433
433
  - lib/ruby_app/elements/navigation/page_link.rb
434
434
  - lib/ruby_app/elements/page.rb
435
+ - lib/ruby_app/elements/pages/.cache/default_page.css
436
+ - lib/ruby_app/elements/pages/.cache/default_page.js
435
437
  - lib/ruby_app/elements/pages/authentication/open_id/authentication_page.rb
436
438
  - lib/ruby_app/elements/pages/authentication/open_id/ax_authentication_page.rb
437
439
  - lib/ruby_app/elements/pages/authentication/open_id/base/base_authentication_page.html.haml
@@ -457,6 +459,24 @@ files:
457
459
  - lib/ruby_app/elements/pages/settings_page.js.haml
458
460
  - lib/ruby_app/elements/pages/settings_page.rb
459
461
  - lib/ruby_app/elements/pages/test_pages.rb
462
+ - lib/ruby_app/elements/pages/test_pages/.cache/button_test_page.css
463
+ - lib/ruby_app/elements/pages/test_pages/.cache/button_test_page.js
464
+ - lib/ruby_app/elements/pages/test_pages/.cache/default_test_page.css
465
+ - lib/ruby_app/elements/pages/test_pages/.cache/default_test_page.js
466
+ - lib/ruby_app/elements/pages/test_pages/.cache/dialog_test_page.css
467
+ - lib/ruby_app/elements/pages/test_pages/.cache/dialog_test_page.js
468
+ - lib/ruby_app/elements/pages/test_pages/.cache/input_test_page.css
469
+ - lib/ruby_app/elements/pages/test_pages/.cache/input_test_page.js
470
+ - lib/ruby_app/elements/pages/test_pages/.cache/link_test_page.css
471
+ - lib/ruby_app/elements/pages/test_pages/.cache/link_test_page.js
472
+ - lib/ruby_app/elements/pages/test_pages/.cache/linked_test_page.css
473
+ - lib/ruby_app/elements/pages/test_pages/.cache/linked_test_page.js
474
+ - lib/ruby_app/elements/pages/test_pages/.cache/list_test_page.css
475
+ - lib/ruby_app/elements/pages/test_pages/.cache/list_test_page.js
476
+ - lib/ruby_app/elements/pages/test_pages/.cache/markdown_test_page.css
477
+ - lib/ruby_app/elements/pages/test_pages/.cache/markdown_test_page.js
478
+ - lib/ruby_app/elements/pages/test_pages/.cache/test_page.css
479
+ - lib/ruby_app/elements/pages/test_pages/.cache/test_page.js
460
480
  - lib/ruby_app/elements/pages/test_pages/button_test_page.css.haml
461
481
  - lib/ruby_app/elements/pages/test_pages/button_test_page.html.haml
462
482
  - lib/ruby_app/elements/pages/test_pages/button_test_page.js.haml
@@ -608,7 +628,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
608
628
  requirements: []
609
629
 
610
630
  rubyforge_project:
611
- rubygems_version: 1.8.10
631
+ rubygems_version: 1.8.13
612
632
  signing_key:
613
633
  specification_version: 3
614
634
  summary: A web application framework in Ruby