yodel 0.0.4 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,7 +11,7 @@ class RequestHandler
11
11
  env['rack.session']['a'] = 1
12
12
 
13
13
  # split the request path into a standard path and trailing file extension if present
14
- components = PATH_FORMAT_REGEX.match(request.path)
14
+ components = PATH_FORMAT_REGEX.match(request.path.downcase)
15
15
  return fail_with "Unable to parse request path: #{request.path}" if components.nil?
16
16
  path, format = components.captures
17
17
  path = path[0...-1] if path.end_with?('/') && path.length != 1
@@ -38,7 +38,6 @@ class CommandRunner
38
38
  case command
39
39
  when 'server'
40
40
  require '../requires'
41
- require '../middleware/development_server'
42
41
 
43
42
  Yodel.config.extensions_folder = $extensions_folder if $extensions_folder
44
43
  Yodel.config.web_port = $web_port if $web_port
@@ -50,9 +49,11 @@ class CommandRunner
50
49
  end
51
50
 
52
51
  if $reload
52
+ require '../middleware/development_server'
53
53
  Rack::Server.start(app: DevelopmentServer.new, Port: Yodel.config.web_port)
54
54
  else
55
- require File.expand_path('../../yodel')
55
+ require '../middleware/rack_server'
56
+ require '../../yodel'
56
57
  Rack::Server.start(app: Application.new, Port: Yodel.config.web_port)
57
58
  end
58
59
 
@@ -0,0 +1,17 @@
1
+ module Rack
2
+ class Server
3
+
4
+ alias :original_start :start
5
+ def start
6
+ trap(:TERM) do
7
+ if server.respond_to?(:shutdown)
8
+ server.shutdown
9
+ else
10
+ exit
11
+ end
12
+ end
13
+ original_start
14
+ end
15
+
16
+ end
17
+ end
@@ -57,6 +57,29 @@ class ManyEmbeddedAssociation < Association
57
57
  raise "ManyEmbedded values must be enumerable (#{name})" unless value.respond_to?(:each)
58
58
  EmbeddedRecordArray.new(record, self, all(value, record))
59
59
  end
60
+
61
+ def from_json(value, record)
62
+ # TODO: change to constructing a new array here instead of removing elements at the end
63
+ store = record.get(name)
64
+ existing_records = store.each_with_object({}) {|record, ids| ids[record.id.to_s] = record}
65
+
66
+ # update and add existing/new records
67
+ value.each do |new_record|
68
+ next unless new_record.is_a?(Hash)
69
+ new_record_id = new_record['_id']
70
+ new_record.delete('_id')
71
+ if existing_records.key?(new_record_id)
72
+ existing_records[new_record_id].from_json(new_record)
73
+ existing_records.delete(new_record_id)
74
+ else
75
+ process_json_item(new_record, store, record).save
76
+ end
77
+ end
78
+
79
+ # any remaining ids in existing_records were deleted
80
+ existing_records.values.each(&:destroy)
81
+ record.get(name)
82
+ end
60
83
  end
61
84
 
62
85
  Field::TYPES['many_embedded'] = ManyEmbeddedAssociation
@@ -22,7 +22,13 @@ class Attachment
22
22
  end
23
23
 
24
24
  def relative_directory_path
25
- @relative_directory_path ||= File.join(@field.name, @record.id.to_s)
25
+ @relative_directory_path ||= begin
26
+ if @record.is_a?(EmbeddedRecord)
27
+ File.join("#{@record.embedded_field.name}_#{@field.name}", @record.parent_record.id.to_s, @record.id.to_s)
28
+ else
29
+ File.join(@field.name, @record.id.to_s)
30
+ end
31
+ end
26
32
  end
27
33
 
28
34
  def path
@@ -9,7 +9,9 @@ class Image < Attachment
9
9
  return unless exist?
10
10
 
11
11
  # determine image dimensions
12
- dimensions = `#{Yodel.config.identify_path} -ping -format "%w %h" #{path}`
12
+ # FIXME: uploaded file names with '..' and slashes etc. could be a security issue
13
+ escaped_path = "\"#{path.gsub('"', '\"')}\""
14
+ dimensions = `#{Yodel.config.identify_path} -ping -format "%w %h" #{escaped_path}`
13
15
  unless ('0'..'9').include?(dimensions[0])
14
16
  raise "Invalid image format or unknown Image Magick error: #{dimensions}"
15
17
  else
@@ -25,7 +27,7 @@ class Image < Attachment
25
27
  w = [iw, w].min.to_i
26
28
  h = [ih, h].min.to_i
27
29
 
28
- command = "#{Yodel.config.convert_path} #{path} "
30
+ command = "#{Yodel.config.convert_path} #{escaped_path} "
29
31
  command += "-crop '#{w}x#{h}+#{(iw-w)/2}+#{(ih-h)/2}' "
30
32
  command += "-resize '#{sw}x#{sh}' "
31
33
  command += "-quality #{Yodel.config.image_quality} "
@@ -3,6 +3,10 @@ class AttachmentField < Field
3
3
  :file
4
4
  end
5
5
 
6
+ def default
7
+ Attachment.new({}, nil, self).to_hash
8
+ end
9
+
6
10
  def untypecast(value, record)
7
11
  # expecting an Attachment object, or a hash of the original data
8
12
  value.to_hash
@@ -3,6 +3,10 @@ class ImageField < AttachmentField
3
3
  :image
4
4
  end
5
5
 
6
+ def default
7
+ Image.new({}, nil, self).to_hash
8
+ end
9
+
6
10
  def typecast(value, record)
7
11
  Image.new(value, record, self)
8
12
  end
@@ -274,6 +274,7 @@ class AbstractRecord
274
274
 
275
275
  def update(values, do_save=true)
276
276
  raise DestroyedRecord if destroyed?
277
+ return if values.empty?
277
278
  values.stringify_keys!
278
279
  values.each do |name, value|
279
280
  ensure_field_is_valid(name)
@@ -9,6 +9,18 @@ class EmbeddedRecord < AbstractRecord
9
9
  super(values, new_record)
10
10
  end
11
11
 
12
+ def id
13
+ @values['_id']
14
+ end
15
+
16
+ def set_id(new_id)
17
+ @values['_id'] = new_id
18
+ end
19
+
20
+ def default_values
21
+ super.merge({'_id' => PrimaryKeyFactory.pk})
22
+ end
23
+
12
24
  def site
13
25
  parent_record.site
14
26
  end
@@ -32,6 +44,10 @@ class EmbeddedRecord < AbstractRecord
32
44
  embedded_field.fields
33
45
  end
34
46
 
47
+ def field_sections
48
+ @sections ||= {nil => Section.new(nil, fields.values)}
49
+ end
50
+
35
51
  def perform_save
36
52
  embedded_field.save(self, parent_record)
37
53
  end
@@ -78,22 +78,14 @@ class Record < SiteRecord
78
78
  end
79
79
 
80
80
  def field_sections
81
- if @sections.nil?
81
+ @sections ||= begin
82
82
  keyed_sections = Hash.new do |hash, key|
83
83
  hash[key] = Section.new(key)
84
84
  end
85
85
  fields.each do |name, field|
86
86
  keyed_sections[field.section] << field
87
87
  end
88
- @sections = keyed_sections.values
89
- end
90
-
91
- @sections
92
- end
93
-
94
- def fields_for_section(section)
95
- fields.select do |name, field|
96
- field.display? && field.section == section && field.default_input_type.present? && field.default_input_type != :embedded
88
+ keyed_sections
97
89
  end
98
90
  end
99
91
 
@@ -1,9 +1,10 @@
1
1
  class Section < Array
2
2
  attr_reader :name
3
3
 
4
- def initialize(name)
5
- @name = name
4
+ def initialize(name, initial_fields=[])
6
5
  super()
6
+ @name = name
7
+ push(*initial_fields)
7
8
  end
8
9
 
9
10
  def display?
@@ -16,6 +17,6 @@ class Section < Array
16
17
 
17
18
  private
18
19
  def display_field?(field)
19
- field.display? && field.default_input_type.present? && field.default_input_type != :embedded
20
+ field.display? && field.default_input_type.present?
20
21
  end
21
22
  end
@@ -36,16 +36,23 @@ class FormBuilder
36
36
  end
37
37
 
38
38
  def form_for_section(section)
39
- buffer = Ember::Template.buffer_from_block(@block)
40
- section.displayed_fields.each do |field|
41
- buffer << field_row(field.name, field)
42
- end
43
- ''
39
+ section.displayed_fields.collect do |field|
40
+ field_row(field.name, field)
41
+ end.join('')
44
42
  end
45
43
 
46
44
  def field_row(name, field=nil)
47
45
  field = @record.fields[name.to_s] if field.nil?
48
- "<div class='contains-field-type-#{field.options['type']}'>" << label(name).to_s << "<div>" << field(name).to_s << status(name).to_s << "</div></div>"
46
+ html = "<div class='contains-field-type-#{field.options['type']}'>"
47
+ html << label(name).to_s << "<div>"
48
+
49
+ if field.default_input_type == :embedded
50
+ html << field(name, blank_record: true).to_s
51
+ else
52
+ html << field(name).to_s
53
+ end
54
+
55
+ html << status(name).to_s << "</div></div>"
49
56
  end
50
57
 
51
58
 
@@ -64,10 +71,13 @@ class FormBuilder
64
71
  value = value.id if value.is_a?(AbstractRecord)
65
72
  value = value.to_s("F") if value.is_a?(BigDecimal)
66
73
  element = build_element(:input, {type: type.to_s, value: value.to_s})
74
+
67
75
  when :textarea
68
76
  element = build_element(:textarea, {}, value.to_s)
77
+
69
78
  when :html
70
79
  element = build_element(:textarea, {class: 'html'}, value.to_s)
80
+
71
81
  when :file, :image
72
82
  elements = []
73
83
  elements << build_element(:input, {type: 'hidden', name: input_name + '[_action]', value: 'set'})
@@ -88,6 +98,7 @@ class FormBuilder
88
98
  elements << build_element(:span, {}, "Delete")
89
99
  elements << build_element(:input, {type: 'file', value: value.name, name: input_name + '[_value]'})
90
100
  element = build_element(:span, {}, elements)
101
+
91
102
  when :radio
92
103
  base = {type: 'radio', name: input_name}
93
104
  true_button = build_element(:input, base.merge(condition('checked', value, ['true', true])))
@@ -95,13 +106,17 @@ class FormBuilder
95
106
  true_text = options.delete(:true) || 'Yes'
96
107
  false_text = options.delete(:false) || 'No'
97
108
  element = build_element(:span, {}, [true_text, true_button, false_text, false_button])
109
+
98
110
  when :enum
99
111
  element = build_select(value, field.options['options'], show_blank: field.show_blank, blank_text: field.blank_text)
112
+
100
113
  when :store_one
101
114
  element = build_select(value, field.record_options(@record), show_blank: field.show_blank, blank_text: field.blank_text, group_by: field.group_by, name_field: 'name', value_field: 'id')
115
+
102
116
  when :store_many
103
117
  element = build_select(value.collect(&:id), field.record_options(@record), show_blank: false, name_field: 'name', value_field: 'id', multiple: true)
104
118
  input_name += '[]'
119
+
105
120
  when :date, :datetime
106
121
  # day
107
122
  day_select = build_select(value.try(:day).to_s, (1..31), show_blank: true, blank_text: '', name_field: 'to_s', value_field: 'to_s')
@@ -134,23 +149,29 @@ class FormBuilder
134
149
  end
135
150
 
136
151
  element = build_element(:span, {}, elements)
152
+
137
153
  when :embedded
138
- if block_given?
139
- if value.respond_to?(:each)
140
- value.each do |document|
141
- self.class.new(document, @action, {embedded_record: field, prefix: name, id: @id}, &block).render
142
- end
143
- else
144
- self.class.new(value, @action, {embedded_record: field, prefix: name, id: @id}, &block).render
145
- end
154
+ elements = []
146
155
 
147
- if options.delete(:blank_record)
148
- self.class.new(value.new, @action, {embedded_record: field, blank_record: true, prefix: name, id: @id}, &block).render
156
+ if value.respond_to?(:each)
157
+ value.each do |document|
158
+ elements << self.class.new(document, @action, {embedded_record: field, prefix: name, id: @id}, &block).render
149
159
  end
160
+ else
161
+ elements << self.class.new(value, @action, {embedded_record: field, prefix: name, id: @id}, &block).render
162
+ end
163
+
164
+ if options.delete(:blank_record)
165
+ elements << self.class.new(value.new, @action, {embedded_record: field, blank_record: true, prefix: name, id: @id}, &block).render
150
166
  end
151
167
 
152
- buffer = Ember::Template.buffer_from_block(@block)
153
- buffer << build_element(:input, {'type' => 'hidden', 'data-field' => input_name}).to_s
168
+ if block_given?
169
+ buffer = Ember::Template.buffer_from_block(@block)
170
+ buffer << build_element(:input, {'type' => 'hidden', 'data-field' => input_name}).to_s
171
+ else
172
+ elements << build_element(:input, {'type' => 'hidden', 'data-field' => input_name})
173
+ element = build_element(:span, {}, elements)
174
+ end
154
175
  end
155
176
 
156
177
  element.tap do |element|
@@ -171,6 +192,9 @@ class FormBuilder
171
192
  @record
172
193
  end
173
194
 
195
+ def prefix
196
+ @prefix
197
+ end
174
198
 
175
199
  def label(name, text=nil, options={})
176
200
  text ||= name.to_s.humanize
@@ -244,46 +268,60 @@ class FormBuilder
244
268
  end
245
269
 
246
270
  def render
247
- if @embedded_record
248
- buffer = Ember::Template.buffer_from_block(@block)
249
- buffer << Ember::Template.content_from_block(@block, self)
271
+ # render a default form
272
+ if @block.nil?
273
+ if @embedded_record
274
+ form_for_section(@record.field_sections[nil])
275
+ else
276
+ form_element(@record.field_sections[nil])
277
+ end
278
+
279
+ # render a user supplied form
250
280
  else
251
- Ember::Template.wrap_content_block(@block, self) do |content|
252
- params = {
253
- 'action' => @action,
254
- 'method' => 'post',
255
- 'enctype' => 'multipart/form-data',
256
- 'data-remote' => (!!@remote).to_s,
257
- 'id' => @id
258
- }.merge(@params)
259
-
260
- elements = [
261
- Hpricot::Text.new(content.join),
262
- Hpricot::Elem.new('input', {type: 'hidden', name: '_method', value: @method})
263
- ]
264
-
265
- if @success_function
266
- params['data-success-function'] = "#{@id}_success"
267
- elements << Hpricot::Text.new(define_callback_function('success', 'record', @success_function))
268
- end
269
-
270
- if @errors_function
271
- params['data-errors-function'] = "#{@id}_errors"
272
- elements << Hpricot::Text.new(define_callback_function('errors', 'errors', @errors_function))
273
- end
274
-
275
- if @failure_function
276
- params['data-failure-function'] = "#{@id}_failure"
277
- elements << Hpricot::Text.new(define_callback_function('failure', 'xhr', @failure_function))
278
- end
279
-
280
- Hpricot::Elem.new('form', params, elements)
281
+ if @embedded_record
282
+ buffer = Ember::Template.buffer_from_block(@block)
283
+ buffer << Ember::Template.content_from_block(@block, self)
284
+ else
285
+ Ember::Template.wrap_content_block(@block, self) {|content| form_element(content.join)}
281
286
  end
282
287
  end
288
+
283
289
  end
284
290
 
285
291
 
286
292
  private
293
+ def form_element(content)
294
+ params = {
295
+ 'action' => @action,
296
+ 'method' => 'post',
297
+ 'enctype' => 'multipart/form-data',
298
+ 'data-remote' => (!!@remote).to_s,
299
+ 'id' => @id
300
+ }.merge(@params)
301
+
302
+ elements = [
303
+ Hpricot::Text.new(content),
304
+ Hpricot::Elem.new('input', {type: 'hidden', name: '_method', value: @method})
305
+ ]
306
+
307
+ if @success_function
308
+ params['data-success-function'] = "#{@id}_success"
309
+ elements << Hpricot::Text.new(define_callback_function('success', 'record', @success_function))
310
+ end
311
+
312
+ if @errors_function
313
+ params['data-errors-function'] = "#{@id}_errors"
314
+ elements << Hpricot::Text.new(define_callback_function('errors', 'errors', @errors_function))
315
+ end
316
+
317
+ if @failure_function
318
+ params['data-failure-function'] = "#{@id}_failure"
319
+ elements << Hpricot::Text.new(define_callback_function('failure', 'xhr', @failure_function))
320
+ end
321
+
322
+ Hpricot::Elem.new('form', params, elements)
323
+ end
324
+
287
325
  def render_status(name, handles, message, state, new_text, valid_text, invalid_text)
288
326
  if @status_template
289
327
  element = Ember::Template.content_from_block(@status_template, name, message, state).join
@@ -10,7 +10,6 @@ require 'uri'
10
10
 
11
11
  # load bundled gems
12
12
  require 'rubygems'
13
- require 'bundler'
14
13
  require 'rack'
15
14
  require 'plucky' # requires mongo
16
15
  require 'ember'
@@ -18,10 +17,7 @@ require 'mail'
18
17
  require 'hpricot'
19
18
  require 'json'
20
19
  require 'rack/contrib'
21
- require 'rubydns'
22
20
  require 'git'
23
- require 'highline'
24
- require 'mini_magick'
25
21
  require 'linguistics'
26
22
 
27
23
  # manually load active support extensions
@@ -1,3 +1,3 @@
1
1
  module Yodel
2
- VERSION = '0.0.4'
2
+ VERSION = '0.0.7'
3
3
  end
@@ -17,30 +17,30 @@ Gem::Specification.new do |s|
17
17
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
18
  s.require_paths = ['lib']
19
19
 
20
- s.add_runtime_dependency 'bundler', '~> 1.0.21'
21
- s.add_runtime_dependency 'rack', '~> 1.3.3'
22
- s.add_runtime_dependency 'mongo', '~> 1.3.1'
23
- s.add_runtime_dependency 'bson', '~> 1.3.1'
24
- s.add_runtime_dependency 'bson_ext', '~> 1.3.1'
25
- s.add_runtime_dependency 'plucky', '~> 0.4.1'
26
- s.add_runtime_dependency 'activesupport', '~> 3.0.3'
27
- s.add_runtime_dependency 'ember', '~> 0.3.1'
28
- s.add_runtime_dependency 'mail', '~> 2.3.0'
29
- s.add_runtime_dependency 'hpricot', '~> 0.8.4'
30
- s.add_runtime_dependency 'json', '~> 1.6.1'
31
- s.add_runtime_dependency 'rack-contrib', '~> 1.1.0'
32
- s.add_runtime_dependency 'rubydns', '~> 0.3.3'
33
- s.add_runtime_dependency 'git', '~> 1.2.5'
34
- s.add_runtime_dependency 'highline', '~> 1.6.2'
35
- s.add_runtime_dependency 'linguistics', '~> 1.0.9'
20
+ s.add_runtime_dependency 'bundler', '~> 1.0.21'
21
+ s.add_runtime_dependency 'rack', '~> 1.3.3'
22
+ s.add_runtime_dependency 'mongo', '~> 1.3.1'
23
+ s.add_runtime_dependency 'bson', '~> 1.3.1'
24
+ s.add_runtime_dependency 'bson_ext', '~> 1.3.1'
25
+ s.add_runtime_dependency 'plucky', '~> 0.4.1'
26
+ s.add_runtime_dependency 'activesupport', '~> 3.0.3'
27
+ s.add_runtime_dependency 'ember', '~> 0.3.1'
28
+ s.add_runtime_dependency 'mail', '~> 2.3.0'
29
+ s.add_runtime_dependency 'hpricot', '~> 0.8.4'
30
+ s.add_runtime_dependency 'json', '~> 1.6.1'
31
+ s.add_runtime_dependency 'rack-contrib', '~> 1.1.0'
32
+ s.add_runtime_dependency 'rubydns', '~> 0.3.3'
33
+ s.add_runtime_dependency 'git', '~> 1.2.5'
34
+ s.add_runtime_dependency 'highline', '~> 1.6.2'
35
+ s.add_runtime_dependency 'linguistics', '~> 1.0.9'
36
36
 
37
37
  # extensions
38
- s.add_runtime_dependency 'yodel_admin'
39
- s.add_runtime_dependency 'yodel_queue'
40
- s.add_runtime_dependency 'yodel_blog'
41
- s.add_runtime_dependency 'yodel_shop'
42
-
38
+ s.add_runtime_dependency 'yodel_admin', '0.0.7'
39
+ s.add_runtime_dependency 'yodel_queue', '0.0.7'
40
+ s.add_runtime_dependency 'yodel_blog', '0.0.7'
41
+ s.add_runtime_dependency 'yodel_shop', '0.0.7'
42
+
43
43
  # environment support sites
44
- s.add_runtime_dependency 'yodel_development_environment'
45
- s.add_runtime_dependency 'yodel_production_environment'
44
+ s.add_runtime_dependency 'yodel_development_environment', '0.0.7'
45
+ s.add_runtime_dependency 'yodel_production_environment', '0.0.7'
46
46
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yodel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-18 00:00:00.000000000Z
12
+ date: 2012-01-07 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
- requirement: &70185758343000 !ruby/object:Gem::Requirement
16
+ requirement: &70203218619040 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.0.21
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70185758343000
24
+ version_requirements: *70203218619040
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rack
27
- requirement: &70185758336560 !ruby/object:Gem::Requirement
27
+ requirement: &70203218618320 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.3.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70185758336560
35
+ version_requirements: *70203218618320
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: mongo
38
- requirement: &70185758336040 !ruby/object:Gem::Requirement
38
+ requirement: &70203218617560 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.3.1
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70185758336040
46
+ version_requirements: *70203218617560
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bson
49
- requirement: &70185758335500 !ruby/object:Gem::Requirement
49
+ requirement: &70203218616920 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.3.1
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70185758335500
57
+ version_requirements: *70203218616920
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: bson_ext
60
- requirement: &70185758334940 !ruby/object:Gem::Requirement
60
+ requirement: &70203218616000 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.3.1
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70185758334940
68
+ version_requirements: *70203218616000
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: plucky
71
- requirement: &70185758334180 !ruby/object:Gem::Requirement
71
+ requirement: &70203218609180 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.4.1
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *70185758334180
79
+ version_requirements: *70203218609180
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: activesupport
82
- requirement: &70185758333040 !ruby/object:Gem::Requirement
82
+ requirement: &70203218608540 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 3.0.3
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *70185758333040
90
+ version_requirements: *70203218608540
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: ember
93
- requirement: &70185758332380 !ruby/object:Gem::Requirement
93
+ requirement: &70203218607000 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 0.3.1
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *70185758332380
101
+ version_requirements: *70203218607000
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: mail
104
- requirement: &70185758331740 !ruby/object:Gem::Requirement
104
+ requirement: &70203218606380 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 2.3.0
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *70185758331740
112
+ version_requirements: *70203218606380
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: hpricot
115
- requirement: &70185758330900 !ruby/object:Gem::Requirement
115
+ requirement: &70203218605160 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ~>
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 0.8.4
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *70185758330900
123
+ version_requirements: *70203218605160
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: json
126
- requirement: &70185758329800 !ruby/object:Gem::Requirement
126
+ requirement: &70203218604680 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ~>
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: 1.6.1
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *70185758329800
134
+ version_requirements: *70203218604680
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: rack-contrib
137
- requirement: &70185758328680 !ruby/object:Gem::Requirement
137
+ requirement: &70203218604200 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ~>
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: 1.1.0
143
143
  type: :runtime
144
144
  prerelease: false
145
- version_requirements: *70185758328680
145
+ version_requirements: *70203218604200
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: rubydns
148
- requirement: &70185758321500 !ruby/object:Gem::Requirement
148
+ requirement: &70203218603380 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ~>
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: 0.3.3
154
154
  type: :runtime
155
155
  prerelease: false
156
- version_requirements: *70185758321500
156
+ version_requirements: *70203218603380
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: git
159
- requirement: &70185758320840 !ruby/object:Gem::Requirement
159
+ requirement: &70203218602440 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ~>
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: 1.2.5
165
165
  type: :runtime
166
166
  prerelease: false
167
- version_requirements: *70185758320840
167
+ version_requirements: *70203218602440
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: highline
170
- requirement: &70185758319960 !ruby/object:Gem::Requirement
170
+ requirement: &70203218598720 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ~>
@@ -175,10 +175,10 @@ dependencies:
175
175
  version: 1.6.2
176
176
  type: :runtime
177
177
  prerelease: false
178
- version_requirements: *70185758319960
178
+ version_requirements: *70203218598720
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: linguistics
181
- requirement: &70185758319260 !ruby/object:Gem::Requirement
181
+ requirement: &70203218598160 !ruby/object:Gem::Requirement
182
182
  none: false
183
183
  requirements:
184
184
  - - ~>
@@ -186,73 +186,73 @@ dependencies:
186
186
  version: 1.0.9
187
187
  type: :runtime
188
188
  prerelease: false
189
- version_requirements: *70185758319260
189
+ version_requirements: *70203218598160
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: yodel_admin
192
- requirement: &70185758318680 !ruby/object:Gem::Requirement
192
+ requirement: &70203218597420 !ruby/object:Gem::Requirement
193
193
  none: false
194
194
  requirements:
195
- - - ! '>='
195
+ - - =
196
196
  - !ruby/object:Gem::Version
197
- version: '0'
197
+ version: 0.0.7
198
198
  type: :runtime
199
199
  prerelease: false
200
- version_requirements: *70185758318680
200
+ version_requirements: *70203218597420
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: yodel_queue
203
- requirement: &70185758318200 !ruby/object:Gem::Requirement
203
+ requirement: &70203218596520 !ruby/object:Gem::Requirement
204
204
  none: false
205
205
  requirements:
206
- - - ! '>='
206
+ - - =
207
207
  - !ruby/object:Gem::Version
208
- version: '0'
208
+ version: 0.0.7
209
209
  type: :runtime
210
210
  prerelease: false
211
- version_requirements: *70185758318200
211
+ version_requirements: *70203218596520
212
212
  - !ruby/object:Gem::Dependency
213
213
  name: yodel_blog
214
- requirement: &70185758317780 !ruby/object:Gem::Requirement
214
+ requirement: &70203218595820 !ruby/object:Gem::Requirement
215
215
  none: false
216
216
  requirements:
217
- - - ! '>='
217
+ - - =
218
218
  - !ruby/object:Gem::Version
219
- version: '0'
219
+ version: 0.0.7
220
220
  type: :runtime
221
221
  prerelease: false
222
- version_requirements: *70185758317780
222
+ version_requirements: *70203218595820
223
223
  - !ruby/object:Gem::Dependency
224
224
  name: yodel_shop
225
- requirement: &70185758317320 !ruby/object:Gem::Requirement
225
+ requirement: &70203218595240 !ruby/object:Gem::Requirement
226
226
  none: false
227
227
  requirements:
228
- - - ! '>='
228
+ - - =
229
229
  - !ruby/object:Gem::Version
230
- version: '0'
230
+ version: 0.0.7
231
231
  type: :runtime
232
232
  prerelease: false
233
- version_requirements: *70185758317320
233
+ version_requirements: *70203218595240
234
234
  - !ruby/object:Gem::Dependency
235
235
  name: yodel_development_environment
236
- requirement: &70185758316820 !ruby/object:Gem::Requirement
236
+ requirement: &70203218594480 !ruby/object:Gem::Requirement
237
237
  none: false
238
238
  requirements:
239
- - - ! '>='
239
+ - - =
240
240
  - !ruby/object:Gem::Version
241
- version: '0'
241
+ version: 0.0.7
242
242
  type: :runtime
243
243
  prerelease: false
244
- version_requirements: *70185758316820
244
+ version_requirements: *70203218594480
245
245
  - !ruby/object:Gem::Dependency
246
246
  name: yodel_production_environment
247
- requirement: &70185758316380 !ruby/object:Gem::Requirement
247
+ requirement: &70203218593600 !ruby/object:Gem::Requirement
248
248
  none: false
249
249
  requirements:
250
- - - ! '>='
250
+ - - =
251
251
  - !ruby/object:Gem::Version
252
- version: '0'
252
+ version: 0.0.7
253
253
  type: :runtime
254
254
  prerelease: false
255
- version_requirements: *70185758316380
255
+ version_requirements: *70203218593600
256
256
  description: Yodel CMS
257
257
  email:
258
258
  - me@willcannings.com
@@ -302,6 +302,7 @@ files:
302
302
  - lib/yodel/middleware/development_server.rb
303
303
  - lib/yodel/middleware/error_pages.rb
304
304
  - lib/yodel/middleware/public_assets.rb
305
+ - lib/yodel/middleware/rack_server.rb
305
306
  - lib/yodel/middleware/request.rb
306
307
  - lib/yodel/middleware/site_detector.rb
307
308
  - lib/yodel/mime_types/default_mime_set.rb