yodel 0.0.4 → 0.0.7

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.
@@ -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