yodel 0.0.1

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