yodel 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (200) hide show
  1. data/.document +5 -0
  2. data/.gitignore +9 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +63 -0
  5. data/LICENSE +1 -0
  6. data/README.rdoc +20 -0
  7. data/Rakefile +1 -0
  8. data/bin/yodel +4 -0
  9. data/lib/yodel.rb +22 -0
  10. data/lib/yodel/application/application.rb +44 -0
  11. data/lib/yodel/application/extension.rb +59 -0
  12. data/lib/yodel/application/request_handler.rb +48 -0
  13. data/lib/yodel/application/yodel.rb +25 -0
  14. data/lib/yodel/command/command.rb +94 -0
  15. data/lib/yodel/command/deploy.rb +67 -0
  16. data/lib/yodel/command/dns_server.rb +16 -0
  17. data/lib/yodel/command/installer.rb +229 -0
  18. data/lib/yodel/config/config.rb +30 -0
  19. data/lib/yodel/config/environment.rb +16 -0
  20. data/lib/yodel/config/yodel.rb +21 -0
  21. data/lib/yodel/exceptions/destroyed_record.rb +2 -0
  22. data/lib/yodel/exceptions/domain_not_found.rb +16 -0
  23. data/lib/yodel/exceptions/duplicate_layout.rb +2 -0
  24. data/lib/yodel/exceptions/exceptions.rb +3 -0
  25. data/lib/yodel/exceptions/inconsistent_lock_state.rb +2 -0
  26. data/lib/yodel/exceptions/invalid_field.rb +2 -0
  27. data/lib/yodel/exceptions/invalid_index.rb +2 -0
  28. data/lib/yodel/exceptions/invalid_mixin.rb +2 -0
  29. data/lib/yodel/exceptions/invalid_model_field.rb +2 -0
  30. data/lib/yodel/exceptions/layout_not_found.rb +2 -0
  31. data/lib/yodel/exceptions/mass_assignment.rb +2 -0
  32. data/lib/yodel/exceptions/missing_migration.rb +2 -0
  33. data/lib/yodel/exceptions/missing_root_directory.rb +15 -0
  34. data/lib/yodel/exceptions/unable_to_acquire_lock.rb +2 -0
  35. data/lib/yodel/exceptions/unauthorised.rb +2 -0
  36. data/lib/yodel/exceptions/unknown_field.rb +2 -0
  37. data/lib/yodel/middleware/development_server.rb +180 -0
  38. data/lib/yodel/middleware/error_pages.rb +72 -0
  39. data/lib/yodel/middleware/public_assets.rb +78 -0
  40. data/lib/yodel/middleware/request.rb +16 -0
  41. data/lib/yodel/middleware/site_detector.rb +22 -0
  42. data/lib/yodel/mime_types/default_mime_set.rb +28 -0
  43. data/lib/yodel/mime_types/mime_type.rb +68 -0
  44. data/lib/yodel/mime_types/mime_type_set.rb +41 -0
  45. data/lib/yodel/mime_types/mime_types.rb +6 -0
  46. data/lib/yodel/mime_types/yodel.rb +15 -0
  47. data/lib/yodel/models/api/api.rb +1 -0
  48. data/lib/yodel/models/api/api_call.rb +87 -0
  49. data/lib/yodel/models/core/associations/association.rb +37 -0
  50. data/lib/yodel/models/core/associations/associations.rb +22 -0
  51. data/lib/yodel/models/core/associations/counts/many_association.rb +18 -0
  52. data/lib/yodel/models/core/associations/counts/one_association.rb +22 -0
  53. data/lib/yodel/models/core/associations/embedded/embedded_association.rb +47 -0
  54. data/lib/yodel/models/core/associations/embedded/embedded_record_array.rb +12 -0
  55. data/lib/yodel/models/core/associations/embedded/many_embedded_association.rb +62 -0
  56. data/lib/yodel/models/core/associations/embedded/one_embedded_association.rb +49 -0
  57. data/lib/yodel/models/core/associations/query/many_query_association.rb +10 -0
  58. data/lib/yodel/models/core/associations/query/one_query_association.rb +10 -0
  59. data/lib/yodel/models/core/associations/query/query_association.rb +64 -0
  60. data/lib/yodel/models/core/associations/record_association.rb +38 -0
  61. data/lib/yodel/models/core/associations/store/many_store_association.rb +32 -0
  62. data/lib/yodel/models/core/associations/store/one_store_association.rb +14 -0
  63. data/lib/yodel/models/core/associations/store/store_association.rb +51 -0
  64. data/lib/yodel/models/core/attachments/attachment.rb +73 -0
  65. data/lib/yodel/models/core/attachments/image.rb +38 -0
  66. data/lib/yodel/models/core/core.rb +15 -0
  67. data/lib/yodel/models/core/fields/alias_field.rb +32 -0
  68. data/lib/yodel/models/core/fields/array_field.rb +64 -0
  69. data/lib/yodel/models/core/fields/attachment_field.rb +42 -0
  70. data/lib/yodel/models/core/fields/boolean_field.rb +28 -0
  71. data/lib/yodel/models/core/fields/change_sensitive_array.rb +96 -0
  72. data/lib/yodel/models/core/fields/change_sensitive_hash.rb +53 -0
  73. data/lib/yodel/models/core/fields/color_field.rb +4 -0
  74. data/lib/yodel/models/core/fields/date_field.rb +35 -0
  75. data/lib/yodel/models/core/fields/decimal_field.rb +19 -0
  76. data/lib/yodel/models/core/fields/email_field.rb +10 -0
  77. data/lib/yodel/models/core/fields/enum_field.rb +33 -0
  78. data/lib/yodel/models/core/fields/field.rb +154 -0
  79. data/lib/yodel/models/core/fields/fields.rb +29 -0
  80. data/lib/yodel/models/core/fields/fields_field.rb +31 -0
  81. data/lib/yodel/models/core/fields/filter_mixin.rb +9 -0
  82. data/lib/yodel/models/core/fields/filtered_string_field.rb +5 -0
  83. data/lib/yodel/models/core/fields/filtered_text_field.rb +5 -0
  84. data/lib/yodel/models/core/fields/function_field.rb +28 -0
  85. data/lib/yodel/models/core/fields/hash_field.rb +54 -0
  86. data/lib/yodel/models/core/fields/html_field.rb +15 -0
  87. data/lib/yodel/models/core/fields/image_field.rb +11 -0
  88. data/lib/yodel/models/core/fields/integer_field.rb +25 -0
  89. data/lib/yodel/models/core/fields/password_field.rb +21 -0
  90. data/lib/yodel/models/core/fields/self_field.rb +27 -0
  91. data/lib/yodel/models/core/fields/string_field.rb +15 -0
  92. data/lib/yodel/models/core/fields/tags_field.rb +7 -0
  93. data/lib/yodel/models/core/fields/text_field.rb +7 -0
  94. data/lib/yodel/models/core/fields/time_field.rb +36 -0
  95. data/lib/yodel/models/core/functions/function.rb +471 -0
  96. data/lib/yodel/models/core/functions/functions.rb +2 -0
  97. data/lib/yodel/models/core/functions/trigger.rb +14 -0
  98. data/lib/yodel/models/core/log/log.rb +33 -0
  99. data/lib/yodel/models/core/log/log_entry.rb +12 -0
  100. data/lib/yodel/models/core/model/abstract_model.rb +59 -0
  101. data/lib/yodel/models/core/model/model.rb +460 -0
  102. data/lib/yodel/models/core/model/mongo_model.rb +25 -0
  103. data/lib/yodel/models/core/model/site_model.rb +17 -0
  104. data/lib/yodel/models/core/mongo/mongo.rb +3 -0
  105. data/lib/yodel/models/core/mongo/primary_key_factory.rb +12 -0
  106. data/lib/yodel/models/core/mongo/query.rb +68 -0
  107. data/lib/yodel/models/core/mongo/record_index.rb +89 -0
  108. data/lib/yodel/models/core/record/abstract_record.rb +411 -0
  109. data/lib/yodel/models/core/record/embedded_record.rb +47 -0
  110. data/lib/yodel/models/core/record/mongo_record.rb +83 -0
  111. data/lib/yodel/models/core/record/record.rb +386 -0
  112. data/lib/yodel/models/core/record/section.rb +21 -0
  113. data/lib/yodel/models/core/record/site_record.rb +31 -0
  114. data/lib/yodel/models/core/site/migration.rb +52 -0
  115. data/lib/yodel/models/core/site/remote.rb +61 -0
  116. data/lib/yodel/models/core/site/site.rb +202 -0
  117. data/lib/yodel/models/core/validations/email_address_validation.rb +24 -0
  118. data/lib/yodel/models/core/validations/embedded_records_validation.rb +31 -0
  119. data/lib/yodel/models/core/validations/errors.rb +51 -0
  120. data/lib/yodel/models/core/validations/excluded_from_validation.rb +10 -0
  121. data/lib/yodel/models/core/validations/excludes_combinations_validation.rb +18 -0
  122. data/lib/yodel/models/core/validations/format_validation.rb +10 -0
  123. data/lib/yodel/models/core/validations/included_in_validation.rb +10 -0
  124. data/lib/yodel/models/core/validations/includes_combinations_validation.rb +14 -0
  125. data/lib/yodel/models/core/validations/length_validation.rb +28 -0
  126. data/lib/yodel/models/core/validations/password_confirmation_validation.rb +11 -0
  127. data/lib/yodel/models/core/validations/required_validation.rb +9 -0
  128. data/lib/yodel/models/core/validations/unique_validation.rb +9 -0
  129. data/lib/yodel/models/core/validations/validation.rb +39 -0
  130. data/lib/yodel/models/core/validations/validations.rb +15 -0
  131. data/lib/yodel/models/email/email.rb +79 -0
  132. data/lib/yodel/models/migrations/01_record_model.rb +29 -0
  133. data/lib/yodel/models/migrations/02_page_model.rb +45 -0
  134. data/lib/yodel/models/migrations/03_layout_model.rb +38 -0
  135. data/lib/yodel/models/migrations/04_group_model.rb +61 -0
  136. data/lib/yodel/models/migrations/05_user_model.rb +24 -0
  137. data/lib/yodel/models/migrations/06_snippet_model.rb +13 -0
  138. data/lib/yodel/models/migrations/07_search_page_model.rb +32 -0
  139. data/lib/yodel/models/migrations/08_default_site_options.rb +21 -0
  140. data/lib/yodel/models/migrations/09_security_page_models.rb +36 -0
  141. data/lib/yodel/models/migrations/10_record_proxy_page_model.rb +17 -0
  142. data/lib/yodel/models/migrations/11_email_model.rb +28 -0
  143. data/lib/yodel/models/migrations/12_api_call_model.rb +23 -0
  144. data/lib/yodel/models/migrations/13_redirect_page_model.rb +13 -0
  145. data/lib/yodel/models/migrations/14_menu_model.rb +20 -0
  146. data/lib/yodel/models/models.rb +8 -0
  147. data/lib/yodel/models/pages/form_builder.rb +379 -0
  148. data/lib/yodel/models/pages/html_decorator.rb +132 -0
  149. data/lib/yodel/models/pages/layout.rb +120 -0
  150. data/lib/yodel/models/pages/menu.rb +32 -0
  151. data/lib/yodel/models/pages/page.rb +378 -0
  152. data/lib/yodel/models/pages/pages.rb +7 -0
  153. data/lib/yodel/models/pages/record_proxy_page.rb +188 -0
  154. data/lib/yodel/models/pages/redirect_page.rb +11 -0
  155. data/lib/yodel/models/search/search.rb +1 -0
  156. data/lib/yodel/models/search/search_page.rb +58 -0
  157. data/lib/yodel/models/security/facebook_login_page.rb +55 -0
  158. data/lib/yodel/models/security/group.rb +10 -0
  159. data/lib/yodel/models/security/guests_group.rb +5 -0
  160. data/lib/yodel/models/security/login_page.rb +20 -0
  161. data/lib/yodel/models/security/logout_page.rb +13 -0
  162. data/lib/yodel/models/security/noone_group.rb +5 -0
  163. data/lib/yodel/models/security/owner_group.rb +8 -0
  164. data/lib/yodel/models/security/password.rb +5 -0
  165. data/lib/yodel/models/security/password_reset_page.rb +47 -0
  166. data/lib/yodel/models/security/security.rb +10 -0
  167. data/lib/yodel/models/security/user.rb +33 -0
  168. data/lib/yodel/public/core/css/core.css +257 -0
  169. data/lib/yodel/public/core/css/reset.css +48 -0
  170. data/lib/yodel/public/core/images/cross.png +0 -0
  171. data/lib/yodel/public/core/images/spinner.gif +0 -0
  172. data/lib/yodel/public/core/images/tick.png +0 -0
  173. data/lib/yodel/public/core/images/yodel.png +0 -0
  174. data/lib/yodel/public/core/js/jquery.min.js +18 -0
  175. data/lib/yodel/public/core/js/json2.js +480 -0
  176. data/lib/yodel/public/core/js/yodel_jquery.js +238 -0
  177. data/lib/yodel/request/authentication.rb +76 -0
  178. data/lib/yodel/request/flash.rb +28 -0
  179. data/lib/yodel/request/request.rb +4 -0
  180. data/lib/yodel/requires.rb +47 -0
  181. data/lib/yodel/task_queue/queue_daemon.rb +33 -0
  182. data/lib/yodel/task_queue/queue_worker.rb +32 -0
  183. data/lib/yodel/task_queue/stats_thread.rb +27 -0
  184. data/lib/yodel/task_queue/task.rb +62 -0
  185. data/lib/yodel/task_queue/task_queue.rb +40 -0
  186. data/lib/yodel/types/date.rb +5 -0
  187. data/lib/yodel/types/object_id.rb +11 -0
  188. data/lib/yodel/types/time.rb +5 -0
  189. data/lib/yodel/version.rb +3 -0
  190. data/system/Library/LaunchDaemons/com.yodelcms.dns.plist +26 -0
  191. data/system/Library/LaunchDaemons/com.yodelcms.server.plist +26 -0
  192. data/system/etc/resolver/yodel +2 -0
  193. data/system/usr/local/bin/yodel_command_runner +2 -0
  194. data/system/usr/local/etc/yodel/development_settings.rb +28 -0
  195. data/system/usr/local/etc/yodel/production_settings.rb +27 -0
  196. data/system/var/log/yodel.log +0 -0
  197. data/test/helper.rb +18 -0
  198. data/test/test_yodel.rb +4 -0
  199. data/yodel.gemspec +47 -0
  200. metadata +501 -0
@@ -0,0 +1,27 @@
1
+ class StatsThread
2
+ PERIOD = 60
3
+
4
+ def initialize
5
+ @processed = 0
6
+ @running = true
7
+ Thread.new do
8
+ while @running
9
+ sleep(PERIOD)
10
+ puts "Processed #{@processed} tasks"
11
+ @processed = 0
12
+ end
13
+ end
14
+ end
15
+
16
+ def stop
17
+ @running = false
18
+ end
19
+
20
+ def kill
21
+ @thread.kill
22
+ end
23
+
24
+ def processed_task
25
+ @processed += 1
26
+ end
27
+ end
@@ -0,0 +1,62 @@
1
+ class Task < SiteRecord
2
+ FAILED_TASK_DELAY = 2 * 60 # 2 minutes
3
+ MAX_TASK_ATTEMPTS = 5
4
+
5
+ collection :queue
6
+ field :type, :string
7
+ field :params, :hash
8
+ field :due, :time
9
+ field :created_at, :time
10
+ field :locked, :time
11
+ field :repeat_in, :integer
12
+ field :attempts, :integer, default: 0
13
+ field :stack_trace, :string
14
+
15
+ def self.add_task(type, params, site, due=nil)
16
+ task = Task.new(site)
17
+ task.type = type.to_s
18
+ task.params = params
19
+ task.due = due
20
+ task.save
21
+ end
22
+
23
+ def execute
24
+ # TODO: plugins need a way of inserting themselves in to this switch
25
+ case self.type
26
+ when 'deliver_email'
27
+ email = site.emails.find(params['_id'])
28
+ email.perform_delivery(params)
29
+ when 'call_api'
30
+ api_call = site.api_calls.find(params['_id'])
31
+ api_call.perform_call(params)
32
+ when 'perform_destroy_stale_carts'
33
+ Cart.perform_destroy_stale_carts(site)
34
+ end
35
+
36
+ # if the task repeats, place it on the queue again by reseting the
37
+ # due time and removing the locked time making it available again
38
+ if repeat_in?
39
+ self.due = Time.at(Time.now.utc.to_i + repeat_in)
40
+ self.locked = nil
41
+ self.save
42
+ else
43
+ self.destroy
44
+ end
45
+
46
+ rescue
47
+ # increase the attempt count after any exceptions. after N attempts
48
+ # the task is halted and assumed to have failed. manual intervention
49
+ # is required to start it again. delay its execution on the queue for
50
+ # a certain amount of time to potentially allow resource issues to
51
+ # "fix themselves" (such as loss of network).
52
+ self.attempts += 1
53
+
54
+ if self.attempts < MAX_TASK_ATTEMPTS
55
+ self.due = Time.at(Time.now.utc.to_i + FAILED_TASK_DELAY)
56
+ self.locked = nil
57
+ end
58
+
59
+ self.stack_trace = "Error: #{$!}\n#{$@.join("\n")}"
60
+ self.save
61
+ end
62
+ end
@@ -0,0 +1,40 @@
1
+ Dir.chdir(File.dirname(__FILE__)) do
2
+ require './queue_daemon'
3
+ require './queue_worker'
4
+ require './stats_thread'
5
+ require './task'
6
+ end
7
+
8
+ class TaskQueue
9
+ MAX_TASK_ATTEMPTS = 5
10
+
11
+ def initialize(immediate)
12
+ @immediate = immediate
13
+ end
14
+
15
+ def pop
16
+ options = {query: conditions, update: {'$set' => {locked: Time.now}}, sort: ['created_at', 1]}
17
+ document = Task.collection.find_and_modify(options)
18
+ return nil if document.nil?
19
+ site = Site.find(document['_site_id'])
20
+
21
+ # FIXME: write error to log here
22
+ if site.nil?
23
+ Task.collection.remove(_id: document['_id'])
24
+ return nil
25
+ end
26
+
27
+ Task.new(site, document)
28
+ rescue Mongo::OperationFailure
29
+ return nil
30
+ end
31
+
32
+ def conditions
33
+ if @immediate
34
+ query = {due: nil}
35
+ else
36
+ query = {due: {'$lte' => Time.now.utc}}
37
+ end
38
+ query.merge(locked: nil, attempts: {'$lt' => MAX_TASK_ATTEMPTS})
39
+ end
40
+ end
@@ -0,0 +1,5 @@
1
+ class Date
2
+ def to_json(*a)
3
+ "new Date(#{year}, #{month}, #{day})".to_json(*a)
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ module BSON
2
+ class ObjectId
3
+ def to_json(*a)
4
+ to_s.to_json(*a)
5
+ end
6
+
7
+ def self.from_json(record, field, value, action)
8
+ BSON::ObjectId.from_string(value)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ class Time
2
+ def to_json(*a)
3
+ "new Date(#{year}, #{month}, #{day}, #{hour}, #{min}, #{sec})".to_json(*a)
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module Yodel
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,26 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>Label</key>
6
+ <string>com.yodelcms.dns</string>
7
+ <key>ProgramArguments</key>
8
+ <array>
9
+ <string>/usr/local/bin/yodel_command_runner</string>
10
+ <string>dns</string>
11
+ </array>
12
+ <key>KeepAlive</key>
13
+ <true/>
14
+ <key>RunAtLoad</key>
15
+ <true/>
16
+ <key>StandardOutPath</key>
17
+ <string>/var/log/yodel_dns.log</string>
18
+ <key>StandardErrorPath</key>
19
+ <string>/var/log/yodel_dns.log</string>
20
+ <key>EnvironmentVariables</key>
21
+ <dict>
22
+ <key>INLINEDIR</key>
23
+ <string><%= sites_root %></string>
24
+ </dict>
25
+ </dict>
26
+ </plist>
@@ -0,0 +1,26 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>Label</key>
6
+ <string>com.yodelcms.server</string>
7
+ <key>ProgramArguments</key>
8
+ <array>
9
+ <string>/usr/local/bin/yodel_command_runner</string>
10
+ <string>server</string>
11
+ </array>
12
+ <key>KeepAlive</key>
13
+ <true/>
14
+ <key>RunAtLoad</key>
15
+ <true/>
16
+ <key>StandardOutPath</key>
17
+ <string>/var/log/yodel.log</string>
18
+ <key>StandardErrorPath</key>
19
+ <string>/var/log/yodel.log</string>
20
+ <key>EnvironmentVariables</key>
21
+ <dict>
22
+ <key>INLINEDIR</key>
23
+ <string><%= sites_root %></string>
24
+ </dict>
25
+ </dict>
26
+ </plist>
@@ -0,0 +1,2 @@
1
+ nameserver 127.0.0.1
2
+ port <%= dns_port %>
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env bash
2
+ <%= ruby_path %> -E utf-8 -e 'require "yodel/command/command"; CommandRunner.run' $1
@@ -0,0 +1,28 @@
1
+ Yodel.config.define do |config|
2
+ # mongo
3
+ config.database_hostname = '<%= database_hostname %>'
4
+ config.database_port = <%= database_port %>
5
+ config.database = '<%= database_name %>'
6
+
7
+ # yodel
8
+ config.session_key = 'yodel.session'
9
+ config.session_secret = 'yodel.session'
10
+ config.sites_root = '<%= sites_root %>'
11
+ config.owner_user = <%= user %>
12
+ config.owner_group = <%= group %>
13
+
14
+ # environment
15
+ config.web_port = <%= web_port %>
16
+ config.dns_port = <%= dns_port %>
17
+ config.git_path = `which git`.strip
18
+
19
+ # logging
20
+ config.logger = Logger.new('/var/log/yodel.log')
21
+ config.sev_threshold = Logger::INFO
22
+ end
23
+
24
+ Yodel.env.development!
25
+
26
+ Mail.defaults do
27
+ delivery_method :sendmail
28
+ end
@@ -0,0 +1,27 @@
1
+ Yodel.config.define do |config|
2
+ # mongo
3
+ config.database_hostname = '<%= database_hostname %>'
4
+ config.database_port = <%= database_port %>
5
+ config.database = '<%= database_name %>'
6
+
7
+ # yodel
8
+ config.session_key = 'yodel.session'
9
+ config.session_secret = 'yodel.session'
10
+ config.sites_root = '<%= sites_root %>'
11
+
12
+ # environment
13
+ config.dns_port = <%= dns_port %>
14
+ config.git_path = `which git`.strip
15
+ config.public_directory = '<%= public_directory %>'
16
+ config.deploy_command = 'yodel'
17
+
18
+ # logging
19
+ config.logger = Logger.new('/var/log/yodel.log')
20
+ config.sev_threshold = Logger::INFO
21
+ end
22
+
23
+ Yodel.env.production!
24
+
25
+ Mail.defaults do
26
+ delivery_method :sendmail
27
+ end
File without changes
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'yodel'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,4 @@
1
+ require 'helper'
2
+
3
+ class TestYodel < Test::Unit::TestCase
4
+ end
@@ -0,0 +1,47 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'yodel/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'yodel'
7
+ s.version = Yodel::VERSION
8
+ s.authors = ['Will Cannings']
9
+ s.email = ['me@willcannings.com']
10
+ s.homepage = 'http://yodelcms.com'
11
+ s.summary = 'Yodel CMS'
12
+ s.description = 'Yodel CMS'
13
+ s.licenses = ["Public Domain"]
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ['lib']
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 'mini_magick', '~> 3.3'
36
+ s.add_runtime_dependency 'linguistics', '~> 1.0.9'
37
+
38
+ # extensions
39
+ s.add_runtime_dependency 'yodel_admin'
40
+ s.add_runtime_dependency 'yodel_queue'
41
+ s.add_runtime_dependency 'yodel_blog'
42
+ s.add_runtime_dependency 'yodel_shop'
43
+
44
+ # environment support sites
45
+ s.add_runtime_dependency 'yodel_development_environment'
46
+ s.add_runtime_dependency 'yodel_production_environment'
47
+ end
metadata ADDED
@@ -0,0 +1,501 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yodel
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Will Cannings
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-12-09 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: &70308430598920 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.21
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70308430598920
25
+ - !ruby/object:Gem::Dependency
26
+ name: rack
27
+ requirement: &70308430597580 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 1.3.3
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70308430597580
36
+ - !ruby/object:Gem::Dependency
37
+ name: mongo
38
+ requirement: &70308430596000 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 1.3.1
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70308430596000
47
+ - !ruby/object:Gem::Dependency
48
+ name: bson
49
+ requirement: &70308430594940 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 1.3.1
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70308430594940
58
+ - !ruby/object:Gem::Dependency
59
+ name: bson_ext
60
+ requirement: &70308430593740 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: 1.3.1
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *70308430593740
69
+ - !ruby/object:Gem::Dependency
70
+ name: plucky
71
+ requirement: &70308430569480 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: 0.4.1
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *70308430569480
80
+ - !ruby/object:Gem::Dependency
81
+ name: activesupport
82
+ requirement: &70308430568120 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: 3.0.3
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: *70308430568120
91
+ - !ruby/object:Gem::Dependency
92
+ name: ember
93
+ requirement: &70308430566900 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ~>
97
+ - !ruby/object:Gem::Version
98
+ version: 0.3.1
99
+ type: :runtime
100
+ prerelease: false
101
+ version_requirements: *70308430566900
102
+ - !ruby/object:Gem::Dependency
103
+ name: mail
104
+ requirement: &70308430566300 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 2.3.0
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: *70308430566300
113
+ - !ruby/object:Gem::Dependency
114
+ name: hpricot
115
+ requirement: &70308430565480 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ~>
119
+ - !ruby/object:Gem::Version
120
+ version: 0.8.4
121
+ type: :runtime
122
+ prerelease: false
123
+ version_requirements: *70308430565480
124
+ - !ruby/object:Gem::Dependency
125
+ name: json
126
+ requirement: &70308430564580 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: 1.6.1
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: *70308430564580
135
+ - !ruby/object:Gem::Dependency
136
+ name: rack-contrib
137
+ requirement: &70308430559860 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ~>
141
+ - !ruby/object:Gem::Version
142
+ version: 1.1.0
143
+ type: :runtime
144
+ prerelease: false
145
+ version_requirements: *70308430559860
146
+ - !ruby/object:Gem::Dependency
147
+ name: rubydns
148
+ requirement: &70308430559240 !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ~>
152
+ - !ruby/object:Gem::Version
153
+ version: 0.3.3
154
+ type: :runtime
155
+ prerelease: false
156
+ version_requirements: *70308430559240
157
+ - !ruby/object:Gem::Dependency
158
+ name: git
159
+ requirement: &70308430558500 !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ~>
163
+ - !ruby/object:Gem::Version
164
+ version: 1.2.5
165
+ type: :runtime
166
+ prerelease: false
167
+ version_requirements: *70308430558500
168
+ - !ruby/object:Gem::Dependency
169
+ name: highline
170
+ requirement: &70308430557500 !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ~>
174
+ - !ruby/object:Gem::Version
175
+ version: 1.6.2
176
+ type: :runtime
177
+ prerelease: false
178
+ version_requirements: *70308430557500
179
+ - !ruby/object:Gem::Dependency
180
+ name: mini_magick
181
+ requirement: &70308430556260 !ruby/object:Gem::Requirement
182
+ none: false
183
+ requirements:
184
+ - - ~>
185
+ - !ruby/object:Gem::Version
186
+ version: '3.3'
187
+ type: :runtime
188
+ prerelease: false
189
+ version_requirements: *70308430556260
190
+ - !ruby/object:Gem::Dependency
191
+ name: linguistics
192
+ requirement: &70308430554780 !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ~>
196
+ - !ruby/object:Gem::Version
197
+ version: 1.0.9
198
+ type: :runtime
199
+ prerelease: false
200
+ version_requirements: *70308430554780
201
+ - !ruby/object:Gem::Dependency
202
+ name: yodel_admin
203
+ requirement: &70308430554200 !ruby/object:Gem::Requirement
204
+ none: false
205
+ requirements:
206
+ - - ! '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ type: :runtime
210
+ prerelease: false
211
+ version_requirements: *70308430554200
212
+ - !ruby/object:Gem::Dependency
213
+ name: yodel_queue
214
+ requirement: &70308430553420 !ruby/object:Gem::Requirement
215
+ none: false
216
+ requirements:
217
+ - - ! '>='
218
+ - !ruby/object:Gem::Version
219
+ version: '0'
220
+ type: :runtime
221
+ prerelease: false
222
+ version_requirements: *70308430553420
223
+ - !ruby/object:Gem::Dependency
224
+ name: yodel_blog
225
+ requirement: &70308430552980 !ruby/object:Gem::Requirement
226
+ none: false
227
+ requirements:
228
+ - - ! '>='
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ type: :runtime
232
+ prerelease: false
233
+ version_requirements: *70308430552980
234
+ - !ruby/object:Gem::Dependency
235
+ name: yodel_shop
236
+ requirement: &70308430552400 !ruby/object:Gem::Requirement
237
+ none: false
238
+ requirements:
239
+ - - ! '>='
240
+ - !ruby/object:Gem::Version
241
+ version: '0'
242
+ type: :runtime
243
+ prerelease: false
244
+ version_requirements: *70308430552400
245
+ - !ruby/object:Gem::Dependency
246
+ name: yodel_development_environment
247
+ requirement: &70308430551520 !ruby/object:Gem::Requirement
248
+ none: false
249
+ requirements:
250
+ - - ! '>='
251
+ - !ruby/object:Gem::Version
252
+ version: '0'
253
+ type: :runtime
254
+ prerelease: false
255
+ version_requirements: *70308430551520
256
+ - !ruby/object:Gem::Dependency
257
+ name: yodel_production_environment
258
+ requirement: &70308430550760 !ruby/object:Gem::Requirement
259
+ none: false
260
+ requirements:
261
+ - - ! '>='
262
+ - !ruby/object:Gem::Version
263
+ version: '0'
264
+ type: :runtime
265
+ prerelease: false
266
+ version_requirements: *70308430550760
267
+ description: Yodel CMS
268
+ email:
269
+ - me@willcannings.com
270
+ executables:
271
+ - yodel
272
+ extensions: []
273
+ extra_rdoc_files: []
274
+ files:
275
+ - .document
276
+ - .gitignore
277
+ - Gemfile
278
+ - Gemfile.lock
279
+ - LICENSE
280
+ - README.rdoc
281
+ - Rakefile
282
+ - bin/yodel
283
+ - lib/yodel.rb
284
+ - lib/yodel/application/application.rb
285
+ - lib/yodel/application/extension.rb
286
+ - lib/yodel/application/request_handler.rb
287
+ - lib/yodel/application/yodel.rb
288
+ - lib/yodel/command/command.rb
289
+ - lib/yodel/command/deploy.rb
290
+ - lib/yodel/command/dns_server.rb
291
+ - lib/yodel/command/installer.rb
292
+ - lib/yodel/config/config.rb
293
+ - lib/yodel/config/environment.rb
294
+ - lib/yodel/config/yodel.rb
295
+ - lib/yodel/exceptions/destroyed_record.rb
296
+ - lib/yodel/exceptions/domain_not_found.rb
297
+ - lib/yodel/exceptions/duplicate_layout.rb
298
+ - lib/yodel/exceptions/exceptions.rb
299
+ - lib/yodel/exceptions/inconsistent_lock_state.rb
300
+ - lib/yodel/exceptions/invalid_field.rb
301
+ - lib/yodel/exceptions/invalid_index.rb
302
+ - lib/yodel/exceptions/invalid_mixin.rb
303
+ - lib/yodel/exceptions/invalid_model_field.rb
304
+ - lib/yodel/exceptions/layout_not_found.rb
305
+ - lib/yodel/exceptions/mass_assignment.rb
306
+ - lib/yodel/exceptions/missing_migration.rb
307
+ - lib/yodel/exceptions/missing_root_directory.rb
308
+ - lib/yodel/exceptions/unable_to_acquire_lock.rb
309
+ - lib/yodel/exceptions/unauthorised.rb
310
+ - lib/yodel/exceptions/unknown_field.rb
311
+ - lib/yodel/middleware/development_server.rb
312
+ - lib/yodel/middleware/error_pages.rb
313
+ - lib/yodel/middleware/public_assets.rb
314
+ - lib/yodel/middleware/request.rb
315
+ - lib/yodel/middleware/site_detector.rb
316
+ - lib/yodel/mime_types/default_mime_set.rb
317
+ - lib/yodel/mime_types/mime_type.rb
318
+ - lib/yodel/mime_types/mime_type_set.rb
319
+ - lib/yodel/mime_types/mime_types.rb
320
+ - lib/yodel/mime_types/yodel.rb
321
+ - lib/yodel/models/api/api.rb
322
+ - lib/yodel/models/api/api_call.rb
323
+ - lib/yodel/models/core/associations/association.rb
324
+ - lib/yodel/models/core/associations/associations.rb
325
+ - lib/yodel/models/core/associations/counts/many_association.rb
326
+ - lib/yodel/models/core/associations/counts/one_association.rb
327
+ - lib/yodel/models/core/associations/embedded/embedded_association.rb
328
+ - lib/yodel/models/core/associations/embedded/embedded_record_array.rb
329
+ - lib/yodel/models/core/associations/embedded/many_embedded_association.rb
330
+ - lib/yodel/models/core/associations/embedded/one_embedded_association.rb
331
+ - lib/yodel/models/core/associations/query/many_query_association.rb
332
+ - lib/yodel/models/core/associations/query/one_query_association.rb
333
+ - lib/yodel/models/core/associations/query/query_association.rb
334
+ - lib/yodel/models/core/associations/record_association.rb
335
+ - lib/yodel/models/core/associations/store/many_store_association.rb
336
+ - lib/yodel/models/core/associations/store/one_store_association.rb
337
+ - lib/yodel/models/core/associations/store/store_association.rb
338
+ - lib/yodel/models/core/attachments/attachment.rb
339
+ - lib/yodel/models/core/attachments/image.rb
340
+ - lib/yodel/models/core/core.rb
341
+ - lib/yodel/models/core/fields/alias_field.rb
342
+ - lib/yodel/models/core/fields/array_field.rb
343
+ - lib/yodel/models/core/fields/attachment_field.rb
344
+ - lib/yodel/models/core/fields/boolean_field.rb
345
+ - lib/yodel/models/core/fields/change_sensitive_array.rb
346
+ - lib/yodel/models/core/fields/change_sensitive_hash.rb
347
+ - lib/yodel/models/core/fields/color_field.rb
348
+ - lib/yodel/models/core/fields/date_field.rb
349
+ - lib/yodel/models/core/fields/decimal_field.rb
350
+ - lib/yodel/models/core/fields/email_field.rb
351
+ - lib/yodel/models/core/fields/enum_field.rb
352
+ - lib/yodel/models/core/fields/field.rb
353
+ - lib/yodel/models/core/fields/fields.rb
354
+ - lib/yodel/models/core/fields/fields_field.rb
355
+ - lib/yodel/models/core/fields/filter_mixin.rb
356
+ - lib/yodel/models/core/fields/filtered_string_field.rb
357
+ - lib/yodel/models/core/fields/filtered_text_field.rb
358
+ - lib/yodel/models/core/fields/function_field.rb
359
+ - lib/yodel/models/core/fields/hash_field.rb
360
+ - lib/yodel/models/core/fields/html_field.rb
361
+ - lib/yodel/models/core/fields/image_field.rb
362
+ - lib/yodel/models/core/fields/integer_field.rb
363
+ - lib/yodel/models/core/fields/password_field.rb
364
+ - lib/yodel/models/core/fields/self_field.rb
365
+ - lib/yodel/models/core/fields/string_field.rb
366
+ - lib/yodel/models/core/fields/tags_field.rb
367
+ - lib/yodel/models/core/fields/text_field.rb
368
+ - lib/yodel/models/core/fields/time_field.rb
369
+ - lib/yodel/models/core/functions/function.rb
370
+ - lib/yodel/models/core/functions/functions.rb
371
+ - lib/yodel/models/core/functions/trigger.rb
372
+ - lib/yodel/models/core/log/log.rb
373
+ - lib/yodel/models/core/log/log_entry.rb
374
+ - lib/yodel/models/core/model/abstract_model.rb
375
+ - lib/yodel/models/core/model/model.rb
376
+ - lib/yodel/models/core/model/mongo_model.rb
377
+ - lib/yodel/models/core/model/site_model.rb
378
+ - lib/yodel/models/core/mongo/mongo.rb
379
+ - lib/yodel/models/core/mongo/primary_key_factory.rb
380
+ - lib/yodel/models/core/mongo/query.rb
381
+ - lib/yodel/models/core/mongo/record_index.rb
382
+ - lib/yodel/models/core/record/abstract_record.rb
383
+ - lib/yodel/models/core/record/embedded_record.rb
384
+ - lib/yodel/models/core/record/mongo_record.rb
385
+ - lib/yodel/models/core/record/record.rb
386
+ - lib/yodel/models/core/record/section.rb
387
+ - lib/yodel/models/core/record/site_record.rb
388
+ - lib/yodel/models/core/site/migration.rb
389
+ - lib/yodel/models/core/site/remote.rb
390
+ - lib/yodel/models/core/site/site.rb
391
+ - lib/yodel/models/core/validations/email_address_validation.rb
392
+ - lib/yodel/models/core/validations/embedded_records_validation.rb
393
+ - lib/yodel/models/core/validations/errors.rb
394
+ - lib/yodel/models/core/validations/excluded_from_validation.rb
395
+ - lib/yodel/models/core/validations/excludes_combinations_validation.rb
396
+ - lib/yodel/models/core/validations/format_validation.rb
397
+ - lib/yodel/models/core/validations/included_in_validation.rb
398
+ - lib/yodel/models/core/validations/includes_combinations_validation.rb
399
+ - lib/yodel/models/core/validations/length_validation.rb
400
+ - lib/yodel/models/core/validations/password_confirmation_validation.rb
401
+ - lib/yodel/models/core/validations/required_validation.rb
402
+ - lib/yodel/models/core/validations/unique_validation.rb
403
+ - lib/yodel/models/core/validations/validation.rb
404
+ - lib/yodel/models/core/validations/validations.rb
405
+ - lib/yodel/models/email/email.rb
406
+ - lib/yodel/models/migrations/01_record_model.rb
407
+ - lib/yodel/models/migrations/02_page_model.rb
408
+ - lib/yodel/models/migrations/03_layout_model.rb
409
+ - lib/yodel/models/migrations/04_group_model.rb
410
+ - lib/yodel/models/migrations/05_user_model.rb
411
+ - lib/yodel/models/migrations/06_snippet_model.rb
412
+ - lib/yodel/models/migrations/07_search_page_model.rb
413
+ - lib/yodel/models/migrations/08_default_site_options.rb
414
+ - lib/yodel/models/migrations/09_security_page_models.rb
415
+ - lib/yodel/models/migrations/10_record_proxy_page_model.rb
416
+ - lib/yodel/models/migrations/11_email_model.rb
417
+ - lib/yodel/models/migrations/12_api_call_model.rb
418
+ - lib/yodel/models/migrations/13_redirect_page_model.rb
419
+ - lib/yodel/models/migrations/14_menu_model.rb
420
+ - lib/yodel/models/models.rb
421
+ - lib/yodel/models/pages/form_builder.rb
422
+ - lib/yodel/models/pages/html_decorator.rb
423
+ - lib/yodel/models/pages/layout.rb
424
+ - lib/yodel/models/pages/menu.rb
425
+ - lib/yodel/models/pages/page.rb
426
+ - lib/yodel/models/pages/pages.rb
427
+ - lib/yodel/models/pages/record_proxy_page.rb
428
+ - lib/yodel/models/pages/redirect_page.rb
429
+ - lib/yodel/models/search/search.rb
430
+ - lib/yodel/models/search/search_page.rb
431
+ - lib/yodel/models/security/facebook_login_page.rb
432
+ - lib/yodel/models/security/group.rb
433
+ - lib/yodel/models/security/guests_group.rb
434
+ - lib/yodel/models/security/login_page.rb
435
+ - lib/yodel/models/security/logout_page.rb
436
+ - lib/yodel/models/security/noone_group.rb
437
+ - lib/yodel/models/security/owner_group.rb
438
+ - lib/yodel/models/security/password.rb
439
+ - lib/yodel/models/security/password_reset_page.rb
440
+ - lib/yodel/models/security/security.rb
441
+ - lib/yodel/models/security/user.rb
442
+ - lib/yodel/public/core/css/core.css
443
+ - lib/yodel/public/core/css/reset.css
444
+ - lib/yodel/public/core/images/cross.png
445
+ - lib/yodel/public/core/images/spinner.gif
446
+ - lib/yodel/public/core/images/tick.png
447
+ - lib/yodel/public/core/images/yodel.png
448
+ - lib/yodel/public/core/js/jquery.min.js
449
+ - lib/yodel/public/core/js/json2.js
450
+ - lib/yodel/public/core/js/yodel_jquery.js
451
+ - lib/yodel/request/authentication.rb
452
+ - lib/yodel/request/flash.rb
453
+ - lib/yodel/request/request.rb
454
+ - lib/yodel/requires.rb
455
+ - lib/yodel/task_queue/queue_daemon.rb
456
+ - lib/yodel/task_queue/queue_worker.rb
457
+ - lib/yodel/task_queue/stats_thread.rb
458
+ - lib/yodel/task_queue/task.rb
459
+ - lib/yodel/task_queue/task_queue.rb
460
+ - lib/yodel/types/date.rb
461
+ - lib/yodel/types/object_id.rb
462
+ - lib/yodel/types/time.rb
463
+ - lib/yodel/version.rb
464
+ - system/Library/LaunchDaemons/com.yodelcms.dns.plist
465
+ - system/Library/LaunchDaemons/com.yodelcms.server.plist
466
+ - system/etc/resolver/yodel
467
+ - system/usr/local/bin/yodel_command_runner
468
+ - system/usr/local/etc/yodel/development_settings.rb
469
+ - system/usr/local/etc/yodel/production_settings.rb
470
+ - system/var/log/yodel.log
471
+ - test/helper.rb
472
+ - test/test_yodel.rb
473
+ - yodel.gemspec
474
+ homepage: http://yodelcms.com
475
+ licenses:
476
+ - Public Domain
477
+ post_install_message:
478
+ rdoc_options: []
479
+ require_paths:
480
+ - lib
481
+ required_ruby_version: !ruby/object:Gem::Requirement
482
+ none: false
483
+ requirements:
484
+ - - ! '>='
485
+ - !ruby/object:Gem::Version
486
+ version: '0'
487
+ required_rubygems_version: !ruby/object:Gem::Requirement
488
+ none: false
489
+ requirements:
490
+ - - ! '>='
491
+ - !ruby/object:Gem::Version
492
+ version: '0'
493
+ requirements: []
494
+ rubyforge_project:
495
+ rubygems_version: 1.8.10
496
+ signing_key:
497
+ specification_version: 3
498
+ summary: Yodel CMS
499
+ test_files:
500
+ - test/helper.rb
501
+ - test/test_yodel.rb