utopia 0.12.6 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -2
  3. data/Gemfile +6 -0
  4. data/README.md +48 -14
  5. data/Rakefile +5 -0
  6. data/bin/utopia +132 -15
  7. data/lib/utopia.rb +13 -10
  8. data/lib/utopia/content.rb +140 -0
  9. data/lib/utopia/content/link.rb +124 -0
  10. data/lib/utopia/content/links.rb +228 -0
  11. data/lib/utopia/content/node.rb +387 -0
  12. data/lib/utopia/content/processor.rb +128 -0
  13. data/lib/utopia/content/tag.rb +102 -0
  14. data/lib/utopia/controller.rb +137 -0
  15. data/lib/utopia/controller/action.rb +112 -0
  16. data/lib/utopia/controller/base.rb +174 -0
  17. data/lib/utopia/{middleware/controller → controller}/variables.rb +36 -38
  18. data/lib/utopia/exception_handler.rb +79 -0
  19. data/lib/utopia/extensions/array.rb +2 -2
  20. data/lib/utopia/localization.rb +143 -0
  21. data/lib/utopia/mail_exceptions.rb +136 -0
  22. data/lib/utopia/middleware.rb +7 -22
  23. data/lib/utopia/path.rb +150 -60
  24. data/lib/utopia/redirector.rb +152 -0
  25. data/lib/utopia/{extensions/hash.rb → session.rb} +4 -6
  26. data/lib/utopia/session/encrypted_cookie.rb +46 -48
  27. data/lib/utopia/{middleware/directory_index.rb → session/lazy_hash.rb} +44 -27
  28. data/lib/utopia/static.rb +255 -0
  29. data/lib/utopia/tags/deferred.rb +12 -8
  30. data/lib/utopia/tags/environment.rb +18 -6
  31. data/lib/utopia/tags/node.rb +12 -8
  32. data/lib/utopia/tags/override.rb +12 -12
  33. data/lib/utopia/version.rb +1 -1
  34. data/setup/.bowerrc +3 -0
  35. data/{lib/utopia/setup → setup}/Gemfile +1 -1
  36. data/setup/Rakefile +4 -0
  37. data/{lib/utopia/setup → setup}/cache/head/readme.txt +0 -0
  38. data/{lib/utopia/setup → setup}/cache/meta/readme.txt +0 -0
  39. data/setup/config.ru +64 -0
  40. data/{lib/utopia/setup → setup}/lib/readme.txt +0 -0
  41. data/{lib/utopia/setup → setup}/pages/_heading.xnode +0 -0
  42. data/{lib/utopia/setup → setup}/pages/_page.xnode +1 -1
  43. data/{lib/utopia/setup → setup}/pages/_static/icon.png +0 -0
  44. data/setup/pages/_static/site.css +70 -0
  45. data/{lib/utopia/setup → setup}/pages/errors/exception.xnode +0 -0
  46. data/{lib/utopia/setup → setup}/pages/errors/file-not-found.xnode +0 -0
  47. data/{lib/utopia/setup → setup}/pages/links.yaml +0 -0
  48. data/setup/pages/welcome/index.xnode +17 -0
  49. data/{lib/utopia/setup → setup}/public/readme.txt +0 -0
  50. data/spec/utopia/content/link_spec.rb +108 -0
  51. data/spec/utopia/content/links/foo/index.xnode +0 -0
  52. data/spec/utopia/content/links/foo/links.yaml +2 -0
  53. data/spec/utopia/content/links/foo/test.de.xnode +0 -0
  54. data/spec/utopia/content/links/foo/test.en.xnode +0 -0
  55. data/spec/utopia/content/links/links.yaml +9 -0
  56. data/spec/utopia/content/links/welcome.xnode +0 -0
  57. data/spec/utopia/content/localized/five/index.en.xnode +0 -0
  58. data/spec/utopia/content/localized/four/index.en.xnode +0 -0
  59. data/spec/utopia/content/localized/four/index.zh.xnode +0 -0
  60. data/spec/utopia/content/localized/four/links.yaml +4 -0
  61. data/spec/utopia/content/localized/links.yaml +16 -0
  62. data/spec/utopia/content/localized/one.xnode +0 -0
  63. data/spec/utopia/content/localized/three/index.xnode +0 -0
  64. data/spec/utopia/content/localized/two.en.xnode +0 -0
  65. data/spec/utopia/content/localized/two.zh.xnode +0 -0
  66. data/spec/utopia/content/node/ordered/first.xnode +0 -0
  67. data/spec/utopia/content/node/ordered/index.xnode +0 -0
  68. data/spec/utopia/content/node/ordered/links.yaml +4 -0
  69. data/spec/utopia/content/node/ordered/second.xnode +0 -0
  70. data/spec/utopia/content/node/related/foo.en.xnode +0 -0
  71. data/spec/utopia/content/node/related/foo.ja.xnode +0 -0
  72. data/spec/utopia/content/node/related/links.yaml +4 -0
  73. data/spec/utopia/content/node_spec.rb +63 -0
  74. data/spec/utopia/{middleware/content_spec.rb → content/processor_spec.rb} +34 -23
  75. data/spec/utopia/content_spec.rb +87 -0
  76. data/spec/utopia/content_spec.ru +10 -0
  77. data/spec/utopia/{middleware/controller_spec.rb → controller_spec.rb} +61 -16
  78. data/spec/utopia/controller_spec.ru +4 -0
  79. data/spec/utopia/extensions_spec.rb +6 -17
  80. data/spec/utopia/localization_spec.rb +60 -0
  81. data/spec/utopia/localization_spec.ru +11 -0
  82. data/{lib/utopia/tags.rb → spec/utopia/middleware_spec.rb} +8 -14
  83. data/spec/utopia/{middleware/content_root → pages}/_heading.xnode +0 -0
  84. data/spec/utopia/pages/content/_show-value.xnode +1 -0
  85. data/spec/utopia/pages/content/test-partial.xnode +1 -0
  86. data/spec/utopia/pages/controller/controller.rb +28 -0
  87. data/spec/utopia/pages/controller/index.xnode +1 -0
  88. data/spec/utopia/pages/controller/nested/controller.rb +4 -0
  89. data/spec/utopia/{middleware/content_root → pages}/index.xnode +0 -0
  90. data/spec/utopia/pages/localized.de.txt +1 -0
  91. data/spec/utopia/pages/localized.en.txt +1 -0
  92. data/spec/utopia/pages/localized.jp.txt +1 -0
  93. data/spec/utopia/pages/node/index.xnode +1 -0
  94. data/spec/utopia/pages/test.txt +1 -0
  95. data/spec/utopia/path_spec.rb +109 -0
  96. data/spec/utopia/rack_spec.rb +2 -0
  97. data/spec/utopia/session_spec.rb +82 -0
  98. data/spec/utopia/session_spec.ru +20 -0
  99. data/spec/utopia/spec_helper.rb +16 -0
  100. data/{lib/utopia/extensions/string.rb → spec/utopia/static_spec.rb} +24 -15
  101. data/spec/utopia/static_spec.ru +4 -0
  102. data/utopia.gemspec +3 -3
  103. metadata +138 -54
  104. data/lib/utopia/extensions/regexp.rb +0 -33
  105. data/lib/utopia/link.rb +0 -288
  106. data/lib/utopia/middleware/all.rb +0 -33
  107. data/lib/utopia/middleware/content.rb +0 -157
  108. data/lib/utopia/middleware/content/node.rb +0 -386
  109. data/lib/utopia/middleware/content/processor.rb +0 -123
  110. data/lib/utopia/middleware/controller.rb +0 -130
  111. data/lib/utopia/middleware/controller/action.rb +0 -121
  112. data/lib/utopia/middleware/controller/base.rb +0 -184
  113. data/lib/utopia/middleware/exception_handler.rb +0 -80
  114. data/lib/utopia/middleware/localization.rb +0 -147
  115. data/lib/utopia/middleware/localization/name.rb +0 -69
  116. data/lib/utopia/middleware/mail_exceptions.rb +0 -138
  117. data/lib/utopia/middleware/redirector.rb +0 -146
  118. data/lib/utopia/middleware/requester.rb +0 -126
  119. data/lib/utopia/middleware/static.rb +0 -295
  120. data/lib/utopia/setup.rb +0 -60
  121. data/lib/utopia/setup/config.ru +0 -47
  122. data/lib/utopia/setup/pages/_static/background.png +0 -0
  123. data/lib/utopia/setup/pages/_static/site.css +0 -48
  124. data/lib/utopia/setup/pages/welcome/index.xnode +0 -7
  125. data/lib/utopia/tag.rb +0 -105
  126. data/lib/utopia/tags/all.rb +0 -34
@@ -0,0 +1,16 @@
1
+
2
+ if ENV['TRAVIS']
3
+ require 'coveralls'
4
+ Coveralls.wear!
5
+ end
6
+
7
+ if ENV['COVERAGE']
8
+ require 'simplecov'
9
+
10
+ SimpleCov.start do
11
+ add_filter "/spec/"
12
+ end if ENV["COVERAGE"]
13
+ end
14
+
15
+ require 'rack/mock'
16
+ require 'rack/test'
@@ -1,4 +1,5 @@
1
- # Copyright, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
1
+ #!/usr/bin/env rspec
2
+ # Copyright, 2014, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
3
  #
3
4
  # Permission is hereby granted, free of charge, to any person obtaining a copy
4
5
  # of this software and associated documentation files (the "Software"), to deal
@@ -18,22 +19,30 @@
18
19
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
20
  # THE SOFTWARE.
20
21
 
21
- require 'trenni/strings'
22
+ require_relative 'spec_helper'
22
23
 
23
- class String
24
- def to_html
25
- Trenni::Strings::to_html(self)
26
- end
27
-
28
- def to_quoted_string
29
- Trenni::Strings::to_quoted_string(self)
30
- end
24
+ require 'rack'
25
+ require 'rack/test'
31
26
 
32
- def to_title
33
- Trenni::Strings::to_title(self)
34
- end
27
+ require 'utopia/static'
35
28
 
36
- def to_snake
37
- Trenni::Strings::to_snake(self)
29
+ module Utopia::StaticSpec
30
+ describe Utopia::Static do
31
+ include Rack::Test::Methods
32
+
33
+ let(:app) {Rack::Builder.parse_file(File.expand_path('../static_spec.ru', __FILE__)).first}
34
+
35
+ it "should give the correct mime type" do
36
+ get "/test.txt"
37
+
38
+ expect(last_response.header['Content-Type']).to be == 'text/plain'
39
+ end
40
+
41
+ it "should return partial content" do
42
+ get "/test.txt", {}, 'HTTP_RANGE' => 'bytes=0-4'
43
+
44
+ expect(last_response.status).to be == 206
45
+ expect(last_response.body).to be == "Hello"
46
+ end
38
47
  end
39
48
  end
@@ -0,0 +1,4 @@
1
+
2
+ use Utopia::Static, root: File.expand_path('../pages', __FILE__)
3
+
4
+ run lambda {|env| [404, {}, []]}
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
23
23
  spec.require_paths = ["lib"]
24
24
 
25
- spec.add_dependency "trenni", "~> 1.3.0"
25
+ spec.add_dependency "trenni", "~> 1.4.1"
26
26
  spec.add_dependency "mime-types", "~> 2.0"
27
27
 
28
28
  spec.add_dependency "rack", "~> 1.5"
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_dependency "mail", "~> 2.6.1"
32
32
 
33
33
  spec.add_development_dependency "bundler", "~> 1.3"
34
- spec.add_development_dependency "rspec", "~> 3.0.0"
35
- spec.add_development_dependency "thin"
34
+ spec.add_development_dependency "rspec", "~> 3.1.0"
35
+ spec.add_development_dependency "puma"
36
36
  spec.add_development_dependency "rake"
37
37
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: utopia
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.6
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-07 00:00:00.000000000 Z
11
+ date: 2015-01-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: trenni
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.3.0
19
+ version: 1.4.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.3.0
26
+ version: 1.4.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: mime-types
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -100,16 +100,16 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 3.0.0
103
+ version: 3.1.0
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 3.0.0
110
+ version: 3.1.0
111
111
  - !ruby/object:Gem::Dependency
112
- name: thin
112
+ name: puma
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -154,64 +154,103 @@ files:
154
154
  - Rakefile
155
155
  - bin/utopia
156
156
  - lib/utopia.rb
157
+ - lib/utopia/content.rb
158
+ - lib/utopia/content/link.rb
159
+ - lib/utopia/content/links.rb
160
+ - lib/utopia/content/node.rb
161
+ - lib/utopia/content/processor.rb
162
+ - lib/utopia/content/tag.rb
163
+ - lib/utopia/controller.rb
164
+ - lib/utopia/controller/action.rb
165
+ - lib/utopia/controller/base.rb
166
+ - lib/utopia/controller/variables.rb
167
+ - lib/utopia/exception_handler.rb
157
168
  - lib/utopia/extensions/array.rb
158
169
  - lib/utopia/extensions/date.rb
159
- - lib/utopia/extensions/hash.rb
160
170
  - lib/utopia/extensions/rack.rb
161
- - lib/utopia/extensions/regexp.rb
162
- - lib/utopia/extensions/string.rb
163
171
  - lib/utopia/http.rb
164
- - lib/utopia/link.rb
172
+ - lib/utopia/localization.rb
173
+ - lib/utopia/mail_exceptions.rb
165
174
  - lib/utopia/middleware.rb
166
- - lib/utopia/middleware/all.rb
167
- - lib/utopia/middleware/content.rb
168
- - lib/utopia/middleware/content/node.rb
169
- - lib/utopia/middleware/content/processor.rb
170
- - lib/utopia/middleware/controller.rb
171
- - lib/utopia/middleware/controller/action.rb
172
- - lib/utopia/middleware/controller/base.rb
173
- - lib/utopia/middleware/controller/variables.rb
174
- - lib/utopia/middleware/directory_index.rb
175
- - lib/utopia/middleware/exception_handler.rb
176
- - lib/utopia/middleware/localization.rb
177
- - lib/utopia/middleware/localization/name.rb
178
- - lib/utopia/middleware/mail_exceptions.rb
179
- - lib/utopia/middleware/redirector.rb
180
- - lib/utopia/middleware/requester.rb
181
- - lib/utopia/middleware/static.rb
182
175
  - lib/utopia/path.rb
176
+ - lib/utopia/redirector.rb
177
+ - lib/utopia/session.rb
183
178
  - lib/utopia/session/encrypted_cookie.rb
184
- - lib/utopia/setup.rb
185
- - lib/utopia/setup/Gemfile
186
- - lib/utopia/setup/cache/head/readme.txt
187
- - lib/utopia/setup/cache/meta/readme.txt
188
- - lib/utopia/setup/config.ru
189
- - lib/utopia/setup/lib/readme.txt
190
- - lib/utopia/setup/pages/_heading.xnode
191
- - lib/utopia/setup/pages/_page.xnode
192
- - lib/utopia/setup/pages/_static/background.png
193
- - lib/utopia/setup/pages/_static/icon.png
194
- - lib/utopia/setup/pages/_static/site.css
195
- - lib/utopia/setup/pages/errors/exception.xnode
196
- - lib/utopia/setup/pages/errors/file-not-found.xnode
197
- - lib/utopia/setup/pages/links.yaml
198
- - lib/utopia/setup/pages/welcome/index.xnode
199
- - lib/utopia/setup/public/readme.txt
200
- - lib/utopia/tag.rb
201
- - lib/utopia/tags.rb
202
- - lib/utopia/tags/all.rb
179
+ - lib/utopia/session/lazy_hash.rb
180
+ - lib/utopia/static.rb
203
181
  - lib/utopia/tags/deferred.rb
204
182
  - lib/utopia/tags/environment.rb
205
183
  - lib/utopia/tags/node.rb
206
184
  - lib/utopia/tags/override.rb
207
185
  - lib/utopia/version.rb
186
+ - setup/.bowerrc
187
+ - setup/Gemfile
188
+ - setup/Rakefile
189
+ - setup/cache/head/readme.txt
190
+ - setup/cache/meta/readme.txt
191
+ - setup/config.ru
192
+ - setup/lib/readme.txt
193
+ - setup/pages/_heading.xnode
194
+ - setup/pages/_page.xnode
195
+ - setup/pages/_static/icon.png
196
+ - setup/pages/_static/site.css
197
+ - setup/pages/errors/exception.xnode
198
+ - setup/pages/errors/file-not-found.xnode
199
+ - setup/pages/links.yaml
200
+ - setup/pages/welcome/index.xnode
201
+ - setup/public/readme.txt
202
+ - spec/utopia/content/link_spec.rb
203
+ - spec/utopia/content/links/foo/index.xnode
204
+ - spec/utopia/content/links/foo/links.yaml
205
+ - spec/utopia/content/links/foo/test.de.xnode
206
+ - spec/utopia/content/links/foo/test.en.xnode
207
+ - spec/utopia/content/links/links.yaml
208
+ - spec/utopia/content/links/welcome.xnode
209
+ - spec/utopia/content/localized/five/index.en.xnode
210
+ - spec/utopia/content/localized/four/index.en.xnode
211
+ - spec/utopia/content/localized/four/index.zh.xnode
212
+ - spec/utopia/content/localized/four/links.yaml
213
+ - spec/utopia/content/localized/links.yaml
214
+ - spec/utopia/content/localized/one.xnode
215
+ - spec/utopia/content/localized/three/index.xnode
216
+ - spec/utopia/content/localized/two.en.xnode
217
+ - spec/utopia/content/localized/two.zh.xnode
218
+ - spec/utopia/content/node/ordered/first.xnode
219
+ - spec/utopia/content/node/ordered/index.xnode
220
+ - spec/utopia/content/node/ordered/links.yaml
221
+ - spec/utopia/content/node/ordered/second.xnode
222
+ - spec/utopia/content/node/related/foo.en.xnode
223
+ - spec/utopia/content/node/related/foo.ja.xnode
224
+ - spec/utopia/content/node/related/links.yaml
225
+ - spec/utopia/content/node_spec.rb
226
+ - spec/utopia/content/processor_spec.rb
227
+ - spec/utopia/content_spec.rb
228
+ - spec/utopia/content_spec.ru
229
+ - spec/utopia/controller_spec.rb
230
+ - spec/utopia/controller_spec.ru
208
231
  - spec/utopia/extensions_spec.rb
209
- - spec/utopia/middleware/content_root/_heading.xnode
210
- - spec/utopia/middleware/content_root/index.xnode
211
- - spec/utopia/middleware/content_spec.rb
212
- - spec/utopia/middleware/controller_spec.rb
232
+ - spec/utopia/localization_spec.rb
233
+ - spec/utopia/localization_spec.ru
234
+ - spec/utopia/middleware_spec.rb
235
+ - spec/utopia/pages/_heading.xnode
236
+ - spec/utopia/pages/content/_show-value.xnode
237
+ - spec/utopia/pages/content/test-partial.xnode
238
+ - spec/utopia/pages/controller/controller.rb
239
+ - spec/utopia/pages/controller/index.xnode
240
+ - spec/utopia/pages/controller/nested/controller.rb
241
+ - spec/utopia/pages/index.xnode
242
+ - spec/utopia/pages/localized.de.txt
243
+ - spec/utopia/pages/localized.en.txt
244
+ - spec/utopia/pages/localized.jp.txt
245
+ - spec/utopia/pages/node/index.xnode
246
+ - spec/utopia/pages/test.txt
213
247
  - spec/utopia/path_spec.rb
214
248
  - spec/utopia/rack_spec.rb
249
+ - spec/utopia/session_spec.rb
250
+ - spec/utopia/session_spec.ru
251
+ - spec/utopia/spec_helper.rb
252
+ - spec/utopia/static_spec.rb
253
+ - spec/utopia/static_spec.ru
215
254
  - utopia.gemspec
216
255
  homepage: https://github.com/ioquatix/utopia
217
256
  licenses: []
@@ -237,10 +276,55 @@ signing_key:
237
276
  specification_version: 4
238
277
  summary: Utopia is a framework for building dynamic content-driven websites.
239
278
  test_files:
279
+ - spec/utopia/content/link_spec.rb
280
+ - spec/utopia/content/links/foo/index.xnode
281
+ - spec/utopia/content/links/foo/links.yaml
282
+ - spec/utopia/content/links/foo/test.de.xnode
283
+ - spec/utopia/content/links/foo/test.en.xnode
284
+ - spec/utopia/content/links/links.yaml
285
+ - spec/utopia/content/links/welcome.xnode
286
+ - spec/utopia/content/localized/five/index.en.xnode
287
+ - spec/utopia/content/localized/four/index.en.xnode
288
+ - spec/utopia/content/localized/four/index.zh.xnode
289
+ - spec/utopia/content/localized/four/links.yaml
290
+ - spec/utopia/content/localized/links.yaml
291
+ - spec/utopia/content/localized/one.xnode
292
+ - spec/utopia/content/localized/three/index.xnode
293
+ - spec/utopia/content/localized/two.en.xnode
294
+ - spec/utopia/content/localized/two.zh.xnode
295
+ - spec/utopia/content/node/ordered/first.xnode
296
+ - spec/utopia/content/node/ordered/index.xnode
297
+ - spec/utopia/content/node/ordered/links.yaml
298
+ - spec/utopia/content/node/ordered/second.xnode
299
+ - spec/utopia/content/node/related/foo.en.xnode
300
+ - spec/utopia/content/node/related/foo.ja.xnode
301
+ - spec/utopia/content/node/related/links.yaml
302
+ - spec/utopia/content/node_spec.rb
303
+ - spec/utopia/content/processor_spec.rb
304
+ - spec/utopia/content_spec.rb
305
+ - spec/utopia/content_spec.ru
306
+ - spec/utopia/controller_spec.rb
307
+ - spec/utopia/controller_spec.ru
240
308
  - spec/utopia/extensions_spec.rb
241
- - spec/utopia/middleware/content_root/_heading.xnode
242
- - spec/utopia/middleware/content_root/index.xnode
243
- - spec/utopia/middleware/content_spec.rb
244
- - spec/utopia/middleware/controller_spec.rb
309
+ - spec/utopia/localization_spec.rb
310
+ - spec/utopia/localization_spec.ru
311
+ - spec/utopia/middleware_spec.rb
312
+ - spec/utopia/pages/_heading.xnode
313
+ - spec/utopia/pages/content/_show-value.xnode
314
+ - spec/utopia/pages/content/test-partial.xnode
315
+ - spec/utopia/pages/controller/controller.rb
316
+ - spec/utopia/pages/controller/index.xnode
317
+ - spec/utopia/pages/controller/nested/controller.rb
318
+ - spec/utopia/pages/index.xnode
319
+ - spec/utopia/pages/localized.de.txt
320
+ - spec/utopia/pages/localized.en.txt
321
+ - spec/utopia/pages/localized.jp.txt
322
+ - spec/utopia/pages/node/index.xnode
323
+ - spec/utopia/pages/test.txt
245
324
  - spec/utopia/path_spec.rb
246
325
  - spec/utopia/rack_spec.rb
326
+ - spec/utopia/session_spec.rb
327
+ - spec/utopia/session_spec.ru
328
+ - spec/utopia/spec_helper.rb
329
+ - spec/utopia/static_spec.rb
330
+ - spec/utopia/static_spec.ru
@@ -1,33 +0,0 @@
1
- # Copyright, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
- #
3
- # Permission is hereby granted, free of charge, to any person obtaining a copy
4
- # of this software and associated documentation files (the "Software"), to deal
5
- # in the Software without restriction, including without limitation the rights
6
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- # copies of the Software, and to permit persons to whom the Software is
8
- # furnished to do so, subject to the following conditions:
9
- #
10
- # The above copyright notice and this permission notice shall be included in
11
- # all copies or substantial portions of the Software.
12
- #
13
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- # THE SOFTWARE.
20
-
21
- class Regexp
22
- def self.starts_with(string)
23
- return /^#{Regexp.escape(string)}/
24
- end
25
-
26
- def self.ends_with(string)
27
- return /#{Regexp.escape(string)}$/
28
- end
29
-
30
- def self.contains(string)
31
- return Regexp.new(string)
32
- end
33
- end
@@ -1,288 +0,0 @@
1
- # Copyright, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
- #
3
- # Permission is hereby granted, free of charge, to any person obtaining a copy
4
- # of this software and associated documentation files (the "Software"), to deal
5
- # in the Software without restriction, including without limitation the rights
6
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- # copies of the Software, and to permit persons to whom the Software is
8
- # furnished to do so, subject to the following conditions:
9
- #
10
- # The above copyright notice and this permission notice shall be included in
11
- # all copies or substantial portions of the Software.
12
- #
13
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- # THE SOFTWARE.
20
-
21
- require 'yaml'
22
-
23
- require 'utopia/extensions/string'
24
- require 'utopia/extensions/hash'
25
- require 'utopia/extensions/array'
26
-
27
- module Utopia
28
-
29
- class Link
30
- XNODE_EXT = ".xnode"
31
-
32
- def initialize(kind, path, info = nil)
33
- path = Path.create(path)
34
-
35
- @info = info ? info.symbolize_keys : {}
36
- @locale = @info.delete(:locale) || path.locale(XNODE_EXT)
37
- @kind = kind
38
-
39
- case @kind
40
- when :file
41
- @name = path.basename(XNODE_EXT)
42
- @path = path
43
- when :directory
44
- @name = path.dirname.basename(XNODE_EXT)
45
- @path = path
46
- when :virtual
47
- @name = path.to_s
48
- @path = @info[:path] ? Path.create(@info[:path]) : nil
49
- end
50
-
51
- @components = @name.split(".")
52
- @title = components[0]
53
- end
54
-
55
- attr :kind
56
- attr :name
57
- attr :path
58
- attr :locale
59
- attr :info
60
- attr :components
61
-
62
- def [] (key)
63
- if key == :title
64
- return @title
65
- end
66
-
67
- return @info[key]
68
- end
69
-
70
- def href
71
- @info.fetch(:uri) do
72
- if @path
73
- @path.to_s
74
- else
75
- nil
76
- end
77
- end
78
- end
79
-
80
- def href?
81
- return href != nil
82
- end
83
-
84
- def title
85
- @info[:title] || @title.to_title
86
- end
87
-
88
- def to_href(options = {})
89
- options[:content] ||= title
90
- options[:class] ||= "link"
91
-
92
- if href?
93
- "<a class=#{options[:class].dump} href=\"#{href.to_html}\">#{options[:content].to_html}</a>"
94
- else
95
- "<span class=#{options[:class].dump}>#{options[:content].to_html}</span>"
96
- end
97
- end
98
-
99
- def eql? other
100
- if other && self.class == other.class
101
- return kind.eql?(other.kind) &&
102
- name.eql?(other.name) &&
103
- path.eql?(other.path) &&
104
- info.eql?(other.info)
105
- else
106
- return false
107
- end
108
- end
109
-
110
- def == other
111
- return other && kind == other.kind && name == other.name && path == other.path
112
- end
113
-
114
- def default_locale
115
- @locale == ''
116
- end
117
- end
118
-
119
- module Links
120
- XNODE_FILTER = /^(.+)\.xnode$/
121
- INDEX_XNODE_FILTER = /^(index(\..+)*)\.xnode$/
122
- LINKS_YAML = "links.yaml"
123
-
124
- def self.metadata(path)
125
- links_path = File.join(path, LINKS_YAML)
126
- if File.exist?(links_path)
127
- return YAML::load(File.read(links_path)) || {}
128
- else
129
- return {}
130
- end
131
- end
132
-
133
- def self.indices(path, &block)
134
- entries = Dir.entries(path).delete_if{|filename| !filename.match(INDEX_XNODE_FILTER)}
135
-
136
- if block_given?
137
- entries.each &block
138
- else
139
- return entries
140
- end
141
- end
142
-
143
- DEFAULT_OPTIONS = {
144
- :directories => true,
145
- :files => true,
146
- :virtual => true,
147
- :indices => false,
148
- :sort => :order,
149
- :display => :display,
150
- :locale => nil
151
- }
152
-
153
- def self.index(root, top = Path.new, options = {})
154
- options = DEFAULT_OPTIONS.merge(options)
155
- path = File.join(root, top.components)
156
- metadata = Links.metadata(path)
157
-
158
- virtual_metadata = metadata.dup
159
-
160
- links = []
161
-
162
- Dir.entries(path).each do |filename|
163
- next if filename.match(/^[\._]/)
164
-
165
- fullpath = File.join(path, filename)
166
-
167
- if File.directory?(fullpath) && options[:directories]
168
- name = filename
169
- indices_metadata = Links.metadata(fullpath)
170
- directory_metadata = metadata.delete(name) || {}
171
-
172
- indices = 0
173
- Links.indices(fullpath) do |index|
174
- index_name = File.basename(index, ".xnode")
175
- # Values in indices_metadata will override values in directory_metadata:
176
- index_metadata = directory_metadata.merge(indices_metadata[index_name] || {})
177
-
178
- directory_link = Link.new(:directory, top + [filename, index_name], index_metadata)
179
-
180
- # Check for localized directory metadata and update the link:
181
- if directory_link.locale
182
- localized_metadata = metadata.delete(name + "." + directory_link.locale)
183
-
184
- if localized_metadata
185
- directory_link.info.update(localized_metadata.symbolize_keys)
186
- end
187
- end
188
-
189
- links << directory_link
190
-
191
- indices += 1
192
- end
193
-
194
- if indices == 0
195
- # Specify a nil uri if no index could be found for the directory:
196
- links << Link.new(:directory, top + [filename, ""], {'uri' => nil}.merge(directory_metadata))
197
- end
198
- elsif filename.match(INDEX_XNODE_FILTER) && options[:indices] == false
199
- name = $1
200
- metadata.delete(name)
201
-
202
- # We don't include indices in the list of pages.
203
- next
204
- elsif filename.match(XNODE_FILTER) && options[:files]
205
- name = $1
206
-
207
- links << Link.new(:file, top + name, metadata.delete(name))
208
- end
209
- end
210
-
211
- if options[:virtual]
212
- metadata.each do |name, details|
213
- # Given a virtual named such as "welcome.cn", merge it with metadata from "welcome" if it exists:
214
- basename, locale = name.split(".", 2)
215
-
216
- if virtual_metadata[basename]
217
- details = virtual_metadata[basename].merge(details || {})
218
- name = basename
219
- details[:locale] = locale
220
- end
221
-
222
- links << Link.new(:virtual, name, details)
223
- end
224
- end
225
-
226
- if options[:display]
227
- links = links.delete_if{|link| link[options[:display]] == false}
228
- end
229
-
230
- if options[:name]
231
- case options[:name]
232
- when Regexp
233
- links.reject!{|link| !link.name.match(options[:name])}
234
- when String
235
- links.reject!{|link| link.name.index(options[:name]) != 0}
236
- end
237
- end
238
-
239
- if options[:locale]
240
- reduced = []
241
-
242
- links.group_by(&:name).each do |name, links|
243
- specific = nil
244
-
245
- links.each do |link|
246
- if link.locale == options[:locale]
247
- specific = link
248
- break
249
- elsif link.default_locale
250
- specific ||= link
251
- end
252
- end
253
-
254
- reduced << specific if specific
255
- end
256
-
257
- links = reduced
258
- end
259
-
260
- if options[:sort]
261
- sort_key = options[:sort]
262
- sort_default = options[:sort_default] || 0
263
-
264
- links = links.sort do |a, b|
265
- result = nil
266
-
267
- lhs = a[sort_key] || sort_default
268
- rhs = b[sort_key] || sort_default
269
-
270
- begin
271
- result ||= lhs <=> rhs
272
- rescue
273
- # LOG.debug("Invalid comparison between #{a.path} and #{b.path} using key #{options[:sort]}!")
274
- end
275
-
276
- if result == 0 || result == nil
277
- a.title <=> b.title
278
- else
279
- result
280
- end
281
- end
282
- end
283
-
284
- return links
285
- end
286
- end
287
-
288
- end