utopia 1.1.1 → 1.1.2

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: 614d40f19533fc62a561a328da3eb0c6967d3932
4
- data.tar.gz: b0be93ad3767370b1be9fe9348d634cea1d33bdb
3
+ metadata.gz: d2e3b4571e1608dc18393ab64c06466768a317fb
4
+ data.tar.gz: 570850efbb213cd4991dbfcbb05af634cb7b393e
5
5
  SHA512:
6
- metadata.gz: 7767bc2f59c64cfb51a54c0c702fa852c20e060c3b0e66b79e21838e2ecf910f545ea487180c97d12507d63dc1693c7f2cd98dd667170d2802b7ebac0e225e35
7
- data.tar.gz: 6c7689c25c3fa8d40c84f41312ac3f42fa36bac19423ba6a352455d1cc21ec871a6c5b6768e37c58777a682a4e65fce0853074616d6b565374354782268527cb
6
+ metadata.gz: 89d4c62731b34d5d7092b9eae18b8230ece7e0ed5afb0a4f6e899515f92e8064adeba3be65456ff0f205b32c532d986d6b25f9703e2e05e95a7803c44fe592f4
7
+ data.tar.gz: be1417acf04b2bbf7bc0e1060200db741884771275cf41604eb8ac8bbf67bb94a29634b3bdf38f500bf4d46e8d538e5b7880d813ef4bbf124e473d63a8bd5842
data/README.md CHANGED
@@ -1,12 +1,12 @@
1
- # Utopia
1
+ # ![Utopia](materials/utopia.png?raw=true)
2
2
 
3
3
  Utopia is a website generation framework which provides a robust set of tools
4
4
  to build highly complex dynamic websites. It uses the filesystem heavily for
5
5
  content and provides functions for interacting with files and directories as
6
6
  structure representing the website.
7
7
 
8
- [![Build Status](https://secure.travis-ci.org/ioquatix/utopia.png)](http://travis-ci.org/ioquatix/utopia)
9
- [![Code Climate](https://codeclimate.com/github/ioquatix/utopia.png)](https://codeclimate.com/github/ioquatix/utopia)
8
+ [![Build Status](https://secure.travis-ci.org/ioquatix/utopia.svg)](http://travis-ci.org/ioquatix/utopia)
9
+ [![Code Climate](https://codeclimate.com/github/ioquatix/utopia.svg)](https://codeclimate.com/github/ioquatix/utopia)
10
10
  [![Coverage Status](https://coveralls.io/repos/ioquatix/utopia/badge.svg)](https://coveralls.io/r/ioquatix/utopia)
11
11
 
12
12
  ## Installation
@@ -26,17 +26,21 @@ require_relative 'content/processor'
26
26
 
27
27
  require 'trenni/template'
28
28
 
29
+ require 'concurrent/map'
30
+
29
31
  module Utopia
30
32
  class Content
31
33
  INDEX = 'index'.freeze
32
34
 
33
35
  def initialize(app, **options)
34
36
  @app = app
35
-
37
+
36
38
  @root = File.expand_path(options[:root] || Utopia::default_root)
37
-
38
- @templates = options[:cache_templates] ? {} : nil
39
-
39
+
40
+ if options[:cache_templates]
41
+ @templates = Concurrent::Map.new
42
+ end
43
+
40
44
  @tags = options.fetch(:tags, {})
41
45
  end
42
46
 
@@ -45,14 +49,14 @@ module Utopia
45
49
 
46
50
  def fetch_xml(path)
47
51
  if @templates
48
- @templates.fetch(path) do |key|
49
- @templates[key] = Trenni::Template.load(path)
52
+ @templates.fetch_or_store(path.to_s) do
53
+ Trenni::Template.load(path)
50
54
  end
51
55
  else
52
56
  Trenni::Template.load(path)
53
57
  end
54
58
  end
55
-
59
+
56
60
  # Look up a named tag such as <entry />
57
61
  def lookup_tag(name, parent_path)
58
62
  if @tags.key? name
@@ -90,10 +90,13 @@ module Utopia
90
90
  :indices => true,
91
91
  }
92
92
 
93
- def initialize(root, top = Path.new, options = DEFAULT_OPTIONS)
93
+ def initialize(root, top = Path.root, options = DEFAULT_OPTIONS)
94
+ raise ArgumentError.new("top path must be absolute") unless top.absolute?
95
+
94
96
  @top = top
95
97
  @options = options
96
98
 
99
+ # top.components.first == '', but this isn't a problem here.
97
100
  @path = File.join(root, top.components)
98
101
  @metadata = self.class.metadata(@path)
99
102
 
@@ -18,282 +18,14 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
 
21
- require 'set'
22
-
23
21
  require_relative 'processor'
24
22
  require_relative 'links'
23
+ require_relative 'transaction'
24
+
25
+ require 'pathname'
25
26
 
26
27
  module Utopia
27
28
  class Content
28
- class UnbalancedTagError < StandardError
29
- def initialize(tag)
30
- @tag = tag
31
-
32
- super("Unbalanced tag #{tag.name}")
33
- end
34
-
35
- attr :tag
36
- end
37
-
38
- # A single request through content middleware.
39
- class Transaction
40
- # The state of a single tag being rendered.
41
- class State
42
- def initialize(tag, node)
43
- @node = node
44
-
45
- @buffer = StringIO.new
46
- @overrides = {}
47
-
48
- @tags = []
49
- @attributes = tag.to_hash
50
-
51
- @content = nil
52
- @deferred = []
53
- end
54
-
55
- attr :attributes
56
- attr :overrides
57
- attr :content
58
- attr :node
59
- attr :tags
60
-
61
- attr :deferred
62
-
63
- def defer(value = nil, &block)
64
- @deferred << block
65
-
66
- Tag.closed("deferred", :id => @deferred.size - 1).to_html
67
- end
68
-
69
- def [](key)
70
- @attributes[key.to_s]
71
- end
72
-
73
- def call(transaction)
74
- @content = @buffer.string
75
- @buffer = StringIO.new
76
-
77
- if node.respond_to? :call
78
- node.call(transaction, self)
79
- else
80
- transaction.parse_xml(@content)
81
- end
82
-
83
- return @buffer.string
84
- end
85
-
86
- def lookup(tag)
87
- if override = @overrides[tag.name]
88
- if override.respond_to? :call
89
- return override.call(tag)
90
- elsif String === override
91
- return Tag.new(override, tag.attributes)
92
- else
93
- return override
94
- end
95
- else
96
- return tag
97
- end
98
- end
99
-
100
- def cdata(text)
101
- @buffer.write(text)
102
- end
103
-
104
- def markup(text)
105
- cdata(text)
106
- end
107
-
108
- def tag_complete(tag)
109
- tag.write_full_html(@buffer)
110
- end
111
-
112
- def tag_begin(tag)
113
- @tags << tag
114
- tag.write_open_html(@buffer)
115
- end
116
-
117
- def tag_end(tag)
118
- raise UnbalancedTagError(tag) unless @tags.pop.name == tag.name
119
-
120
- tag.write_close_html(@buffer)
121
- end
122
- end
123
-
124
- def initialize(request, response)
125
- @begin_tags = []
126
- @end_tags = []
127
-
128
- @request = request
129
- @response = response
130
- end
131
-
132
- attr :request
133
- attr :response
134
-
135
- # A helper method for accessing controller variables from view:
136
- def controller
137
- @request.env[VARIABLES_KEY]
138
- end
139
-
140
- def parse_xml(xml_data)
141
- Processor.parse_xml(xml_data, self)
142
- end
143
-
144
- # Begin tags represents a list from outer to inner most tag.
145
- # At any point in parsing xml, begin_tags is a list of the inner most tag,
146
- # then the next outer tag, etc. This list is used for doing dependent lookups.
147
- attr :begin_tags
148
-
149
- # End tags represents a list of execution order. This is the order that end tags
150
- # have appeared when evaluating nodes.
151
- attr :end_tags
152
-
153
- def attributes
154
- return current.attributes
155
- end
156
-
157
- def current
158
- @begin_tags[-1]
159
- end
160
-
161
- def content
162
- @end_tags[-1].content
163
- end
164
-
165
- def parent
166
- end_tags[-2]
167
- end
168
-
169
- def first
170
- @begin_tags[0]
171
- end
172
-
173
- def tag(name, attributes = {}, &block)
174
- tag = Tag.new(name, attributes)
175
-
176
- node = tag_begin(tag)
177
-
178
- yield node if block_given?
179
-
180
- tag_end(tag)
181
- end
182
-
183
- def tag_complete(tag, node = nil)
184
- if tag.name == "content"
185
- current.markup(content)
186
- else
187
- node ||= lookup(tag)
188
-
189
- if node
190
- tag_begin(tag, node)
191
- tag_end(tag)
192
- else
193
- current.tag_complete(tag)
194
- end
195
- end
196
- end
197
-
198
- def tag_begin(tag, node = nil)
199
- node ||= lookup(tag)
200
-
201
- if node
202
- state = State.new(tag, node)
203
- @begin_tags << state
204
-
205
- if node.respond_to? :tag_begin
206
- node.tag_begin(self, state)
207
- end
208
-
209
- return node
210
- end
211
-
212
- current.tag_begin(tag)
213
-
214
- return nil
215
- end
216
-
217
- def cdata(text)
218
- current.cdata(text)
219
- end
220
-
221
- def partial(*args, &block)
222
- if block_given?
223
- current.defer(&block)
224
- else
225
- current.defer do
226
- tag(*args)
227
- end
228
- end
229
- end
230
-
231
- alias deferred_tag partial
232
-
233
- def tag_end(tag = nil)
234
- top = current
235
-
236
- if top.tags.empty?
237
- if top.node.respond_to? :tag_end
238
- top.node.tag_end(self, top)
239
- end
240
-
241
- @end_tags << top
242
- buffer = top.call(self)
243
-
244
- @begin_tags.pop
245
- @end_tags.pop
246
-
247
- if current
248
- current.markup(buffer)
249
- end
250
-
251
- return buffer
252
- else
253
- current.tag_end(tag)
254
- end
255
-
256
- return nil
257
- end
258
-
259
- def render_node(node, attributes = {})
260
- state = State.new(attributes, node)
261
- @begin_tags << state
262
-
263
- return tag_end
264
- end
265
-
266
- # Takes an instance of Tag
267
- def lookup(tag)
268
- result = tag
269
- node = nil
270
-
271
- @begin_tags.reverse_each do |state|
272
- result = state.lookup(result)
273
-
274
- node ||= state.node if state.node.respond_to? :lookup
275
-
276
- return result if Node === result
277
- end
278
-
279
- @end_tags.reverse_each do |state|
280
- return state.node.lookup(result) if state.node.respond_to? :lookup
281
- end
282
-
283
- return nil
284
- end
285
-
286
- def method_missing(name, *args)
287
- @begin_tags.reverse_each do |state|
288
- if state.node.respond_to? name
289
- return state.node.send(name, *args)
290
- end
291
- end
292
-
293
- super
294
- end
295
- end
296
-
297
29
  class Node
298
30
  def initialize(controller, uri_path, request_path, file_path)
299
31
  @controller = controller
@@ -385,4 +117,4 @@ module Utopia
385
117
  end
386
118
  end
387
119
  end
388
- end
120
+ end
@@ -49,8 +49,7 @@ module Utopia
49
49
  attr :closing_tag
50
50
 
51
51
  def to_s
52
- "Unbalanced Tag Error. " \
53
- "Line #{@starting_line[:line_number]}: #{@current_tag} has been closed by #{@closing_tag} on line #{@ending_line[:line_number]}!"
52
+ "Unbalanced Tag Error. Line #{@starting_line[:line_number]}: #{@current_tag} has been closed by #{@closing_tag} on line #{@ending_line[:line_number]}!"
54
53
  end
55
54
  end
56
55
 
@@ -0,0 +1,295 @@
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_relative 'processor'
22
+ require_relative 'links'
23
+
24
+ module Utopia
25
+ class Content
26
+ class UnbalancedTagError < StandardError
27
+ def initialize(tag)
28
+ @tag = tag
29
+
30
+ super("Unbalanced tag #{tag.name}")
31
+ end
32
+
33
+ attr :tag
34
+ end
35
+
36
+ # A single request through content middleware.
37
+ class Transaction
38
+ # The state of a single tag being rendered.
39
+ class State
40
+ def initialize(tag, node)
41
+ @node = node
42
+
43
+ @buffer = StringIO.new
44
+ @overrides = {}
45
+
46
+ @tags = []
47
+ @attributes = tag.to_hash
48
+
49
+ @content = nil
50
+ @deferred = []
51
+ end
52
+
53
+ attr :attributes
54
+ attr :overrides
55
+ attr :content
56
+ attr :node
57
+ attr :tags
58
+
59
+ attr :deferred
60
+
61
+ def defer(value = nil, &block)
62
+ @deferred << block
63
+
64
+ Tag.closed("deferred", :id => @deferred.size - 1).to_html
65
+ end
66
+
67
+ def [](key)
68
+ @attributes[key.to_s]
69
+ end
70
+
71
+ def call(transaction)
72
+ @content = @buffer.string
73
+ @buffer = StringIO.new
74
+
75
+ if node.respond_to? :call
76
+ node.call(transaction, self)
77
+ else
78
+ transaction.parse_xml(@content)
79
+ end
80
+
81
+ return @buffer.string
82
+ end
83
+
84
+ def lookup(tag)
85
+ if override = @overrides[tag.name]
86
+ if override.respond_to? :call
87
+ return override.call(tag)
88
+ elsif String === override
89
+ return Tag.new(override, tag.attributes)
90
+ else
91
+ return override
92
+ end
93
+ else
94
+ return tag
95
+ end
96
+ end
97
+
98
+ def cdata(text)
99
+ @buffer.write(text)
100
+ end
101
+
102
+ def markup(text)
103
+ cdata(text)
104
+ end
105
+
106
+ def tag_complete(tag)
107
+ tag.write_full_html(@buffer)
108
+ end
109
+
110
+ def tag_begin(tag)
111
+ @tags << tag
112
+ tag.write_open_html(@buffer)
113
+ end
114
+
115
+ def tag_end(tag)
116
+ raise UnbalancedTagError(tag) unless @tags.pop.name == tag.name
117
+
118
+ tag.write_close_html(@buffer)
119
+ end
120
+ end
121
+
122
+ def initialize(request, response)
123
+ @begin_tags = []
124
+ @end_tags = []
125
+
126
+ @request = request
127
+ @response = response
128
+ end
129
+
130
+ attr :request
131
+ attr :response
132
+
133
+ # A helper method for accessing controller variables from view:
134
+ def controller
135
+ @request.env[VARIABLES_KEY]
136
+ end
137
+
138
+ def parse_xml(xml_data)
139
+ Processor.parse_xml(xml_data, self)
140
+ end
141
+
142
+ # Begin tags represents a list from outer to inner most tag.
143
+ # At any point in parsing xml, begin_tags is a list of the inner most tag,
144
+ # then the next outer tag, etc. This list is used for doing dependent lookups.
145
+ attr :begin_tags
146
+
147
+ # End tags represents a list of execution order. This is the order that end tags
148
+ # have appeared when evaluating nodes.
149
+ attr :end_tags
150
+
151
+ def attributes
152
+ return current.attributes
153
+ end
154
+
155
+ def current
156
+ @begin_tags[-1]
157
+ end
158
+
159
+ def content
160
+ @end_tags[-1].content
161
+ end
162
+
163
+ def parent
164
+ end_tags[-2]
165
+ end
166
+
167
+ def first
168
+ @begin_tags[0]
169
+ end
170
+
171
+ def tag(name, attributes = {}, &block)
172
+ tag = Tag.new(name, attributes)
173
+
174
+ node = tag_begin(tag)
175
+
176
+ yield node if block_given?
177
+
178
+ tag_end(tag)
179
+ end
180
+
181
+ def tag_complete(tag, node = nil)
182
+ if tag.name == "content"
183
+ current.markup(content)
184
+ else
185
+ node ||= lookup(tag)
186
+
187
+ if node
188
+ tag_begin(tag, node)
189
+ tag_end(tag)
190
+ else
191
+ current.tag_complete(tag)
192
+ end
193
+ end
194
+ end
195
+
196
+ def tag_begin(tag, node = nil)
197
+ node ||= lookup(tag)
198
+
199
+ if node
200
+ state = State.new(tag, node)
201
+ @begin_tags << state
202
+
203
+ if node.respond_to? :tag_begin
204
+ node.tag_begin(self, state)
205
+ end
206
+
207
+ return node
208
+ end
209
+
210
+ current.tag_begin(tag)
211
+
212
+ return nil
213
+ end
214
+
215
+ def cdata(text)
216
+ current.cdata(text)
217
+ end
218
+
219
+ def partial(*args, &block)
220
+ if block_given?
221
+ current.defer(&block)
222
+ else
223
+ current.defer do
224
+ tag(*args)
225
+ end
226
+ end
227
+ end
228
+
229
+ alias deferred_tag partial
230
+
231
+ def tag_end(tag = nil)
232
+ top = current
233
+
234
+ if top.tags.empty?
235
+ if top.node.respond_to? :tag_end
236
+ top.node.tag_end(self, top)
237
+ end
238
+
239
+ @end_tags << top
240
+ buffer = top.call(self)
241
+
242
+ @begin_tags.pop
243
+ @end_tags.pop
244
+
245
+ if current
246
+ current.markup(buffer)
247
+ end
248
+
249
+ return buffer
250
+ else
251
+ current.tag_end(tag)
252
+ end
253
+
254
+ return nil
255
+ end
256
+
257
+ def render_node(node, attributes = {})
258
+ state = State.new(attributes, node)
259
+ @begin_tags << state
260
+
261
+ return tag_end
262
+ end
263
+
264
+ # Takes an instance of Tag
265
+ def lookup(tag)
266
+ result = tag
267
+ node = nil
268
+
269
+ @begin_tags.reverse_each do |state|
270
+ result = state.lookup(result)
271
+
272
+ node ||= state.node if state.node.respond_to? :lookup
273
+
274
+ return result if Node === result
275
+ end
276
+
277
+ @end_tags.reverse_each do |state|
278
+ return state.node.lookup(result) if state.node.respond_to? :lookup
279
+ end
280
+
281
+ return nil
282
+ end
283
+
284
+ def method_missing(name, *args)
285
+ @begin_tags.reverse_each do |state|
286
+ if state.node.respond_to? name
287
+ return state.node.send(name, *args)
288
+ end
289
+ end
290
+
291
+ super
292
+ end
293
+ end
294
+ end
295
+ end
@@ -27,6 +27,8 @@ require_relative 'controller/base'
27
27
 
28
28
  require_relative 'controller/rewrite'
29
29
 
30
+ require 'concurrent/map'
31
+
30
32
  module Utopia
31
33
  module Controllers
32
34
  def self.class_name_for_controller(controller)
@@ -48,18 +50,18 @@ module Utopia
48
50
  def initialize(app, **options)
49
51
  @app = app
50
52
  @root = options[:root] || Utopia::default_root
51
-
52
- @controllers = {}
53
53
 
54
- @cache_controllers = options[:cache_controllers] || false
54
+ if options[:cache_controllers]
55
+ @controllers = Concurrent::Map.new
56
+ end
55
57
  end
56
58
 
57
59
  attr :app
58
60
 
59
61
  def lookup_controller(path)
60
- if @cache_controllers
61
- return @controllers.fetch(path.to_s) do |key|
62
- @controllers[key] = load_controller_file(path)
62
+ if @controllers
63
+ @controllers.fetch_or_store(path.to_s) do
64
+ load_controller_file(path)
63
65
  end
64
66
  else
65
67
  return load_controller_file(path)
data/lib/utopia/path.rb CHANGED
@@ -82,6 +82,10 @@ module Utopia
82
82
  super
83
83
  end
84
84
 
85
+ def self.root
86
+ self.new([''])
87
+ end
88
+
85
89
  # Returns the length of the prefix which is shared by two strings.
86
90
  def self.prefix_length(a, b)
87
91
  [a.size, b.size].min.times{|i| return i if a[i] != b[i]}
@@ -115,19 +119,7 @@ module Utopia
115
119
  def self.[] path
116
120
  self.create(path)
117
121
  end
118
-
119
- # Expand a relative path relative to a root.
120
- def self.expand(path, root)
121
- case path
122
- when Path
123
- return path.expand(root)
124
- when String
125
- return path if path.start_with?('/')
126
- end
127
-
128
- Path[path].expand(root)
129
- end
130
-
122
+
131
123
  def self.split(path)
132
124
  case path
133
125
  when Path
@@ -198,14 +190,6 @@ module Utopia
198
190
  to_str
199
191
  end
200
192
 
201
- def match(pattern)
202
- to_str.match(pattern)
203
- end
204
-
205
- def =~ (pattern)
206
- to_str =~ pattern
207
- end
208
-
209
193
  def to_a
210
194
  @components
211
195
  end
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Utopia
22
- VERSION = "1.1.1"
22
+ VERSION = "1.1.2"
23
23
  end
Binary file
@@ -0,0 +1,25 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+ width="420px" height="76.993px" viewBox="0 0 420 76.993" enable-background="new 0 0 420 76.993" xml:space="preserve">
6
+ <g>
7
+ <rect y="-0.246" fill="#F79433" width="420" height="74.246"/>
8
+ <rect y="54" fill="#4E8DD8" width="420" height="23"/>
9
+ <g>
10
+ <path fill="#FFFFFF" d="M74.365,68.163c2.379-2.981,4.189-6.661,5.131-10.939C80.41,53.068,81,48.311,81,43.083V0H18v43.083
11
+ c0,2.53,0.245,5.133,0.409,7.734c0.168,2.678,0.676,5.308,1.35,7.814c0.683,2.545,1.746,4.979,3.079,7.235
12
+ c1.368,2.315,3.276,4.356,5.631,6.066c2.328,1.69,5.265,3.045,8.711,4.016C38.803,76.408,40.609,77,42.555,77h13.91
13
+ c3.083,0,5.82-1.018,8.163-1.926C68.686,73.504,71.962,71.177,74.365,68.163z"/>
14
+ <polygon fill="#FFFFFF" points="151,18 151,0 88,-0.021 88,18 110.334,18 110.354,77 128.354,77 128.334,18 "/>
15
+ <path fill="#FFFFFF" d="M229.753,38.499c0-21.224-17.046-38.492-38-38.492s-38,17.269-38,38.492c0,21.227,17.046,38.494,38,38.494
16
+ S229.753,59.726,229.753,38.499z"/>
17
+ <path fill="#FFFFFF" d="M269.219,49c9.755,0,17.248-1.989,22.27-6.155c5.107-4.234,7.697-10.532,7.697-18.841
18
+ c0-3.135-0.394-5.739-1.171-8.158c-0.782-2.434-1.891-4.749-3.294-6.559c-1.407-1.811-3.11-3.328-5.065-4.526
19
+ c-1.903-1.165-4.019-2.116-6.289-2.833c-2.247-0.709-4.658-1.216-7.167-1.502C273.727,0.145,271.165,0,268.584,0H239v77h18V49
20
+ H269.219z"/>
21
+ <rect x="305" fill="#FFFFFF" width="18" height="77"/>
22
+ <polygon fill="#FFFFFF" points="362.936,0 333.343,77 409.529,77 378.159,0 "/>
23
+ </g>
24
+ </g>
25
+ </svg>
data/utopia.gemspec CHANGED
@@ -30,6 +30,8 @@ Gem::Specification.new do |spec|
30
30
 
31
31
  spec.add_dependency "mail", "~> 2.6.1"
32
32
 
33
+ spec.add_dependency "concurrent-ruby", "~> 1.0.0.pre5"
34
+
33
35
  spec.add_development_dependency "bundler", "~> 1.3"
34
36
  spec.add_development_dependency "rspec", "~> 3.1.0"
35
37
  spec.add_development_dependency "puma"
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: 1.1.1
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-22 00:00:00.000000000 Z
11
+ date: 2015-11-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: trenni
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 2.6.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: concurrent-ruby
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.0.0.pre5
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.0.0.pre5
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: bundler
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -162,6 +176,7 @@ files:
162
176
  - lib/utopia/content/node.rb
163
177
  - lib/utopia/content/processor.rb
164
178
  - lib/utopia/content/tag.rb
179
+ - lib/utopia/content/transaction.rb
165
180
  - lib/utopia/controller.rb
166
181
  - lib/utopia/controller/action.rb
167
182
  - lib/utopia/controller/base.rb
@@ -187,6 +202,8 @@ files:
187
202
  - lib/utopia/tags/node.rb
188
203
  - lib/utopia/tags/override.rb
189
204
  - lib/utopia/version.rb
205
+ - materials/utopia.png
206
+ - materials/utopia.svg
190
207
  - setup/.bowerrc
191
208
  - setup/server/git/hooks/post-receive
192
209
  - setup/site/Gemfile