tim 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 (198) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +392 -0
  3. data/Rakefile +33 -0
  4. data/app/assets/javascripts/tim/application.js +15 -0
  5. data/app/assets/stylesheets/tim/application.css +13 -0
  6. data/app/controllers/tim/application_controller.rb +19 -0
  7. data/app/controllers/tim/base_images_controller.rb +59 -0
  8. data/app/controllers/tim/entrypoint_controller.rb +8 -0
  9. data/app/controllers/tim/image_versions_controller.rb +48 -0
  10. data/app/controllers/tim/provider_images_controller.rb +59 -0
  11. data/app/controllers/tim/target_images_controller.rb +61 -0
  12. data/app/controllers/tim/templates_controller.rb +47 -0
  13. data/app/filters/tim/user_keys_filter.rb +59 -0
  14. data/app/helpers/tim/application_helper.rb +4 -0
  15. data/app/models/tim/base.rb +6 -0
  16. data/app/models/tim/base_image.rb +15 -0
  17. data/app/models/tim/image_version.rb +13 -0
  18. data/app/models/tim/provider_image.rb +51 -0
  19. data/app/models/tim/target_image.rb +50 -0
  20. data/app/models/tim/template.rb +19 -0
  21. data/app/responders/tim/custom_responder.rb +24 -0
  22. data/app/validators/template_validator.rb +15 -0
  23. data/app/views/layouts/tim/application.html.erb +14 -0
  24. data/app/views/tim/base_images/_base_image.xml.haml +11 -0
  25. data/app/views/tim/base_images/_base_image_minimal.xml.haml +2 -0
  26. data/app/views/tim/base_images/_form.html.erb +17 -0
  27. data/app/views/tim/base_images/edit.html.erb +6 -0
  28. data/app/views/tim/base_images/index.html.erb +17 -0
  29. data/app/views/tim/base_images/index.xml.haml +4 -0
  30. data/app/views/tim/base_images/new.html.erb +5 -0
  31. data/app/views/tim/base_images/show.html.erb +5 -0
  32. data/app/views/tim/base_images/show.xml.haml +2 -0
  33. data/app/views/tim/entrypoint/index.xml.haml +7 -0
  34. data/app/views/tim/image_versions/_form.html.erb +17 -0
  35. data/app/views/tim/image_versions/_image_version.xml.haml +9 -0
  36. data/app/views/tim/image_versions/_image_version_minimal.xml.haml +2 -0
  37. data/app/views/tim/image_versions/edit.html.erb +6 -0
  38. data/app/views/tim/image_versions/index.html.erb +17 -0
  39. data/app/views/tim/image_versions/index.xml.haml +4 -0
  40. data/app/views/tim/image_versions/new.html.erb +5 -0
  41. data/app/views/tim/image_versions/show.html.erb +5 -0
  42. data/app/views/tim/image_versions/show.xml.haml +2 -0
  43. data/app/views/tim/images/_form.html.erb +17 -0
  44. data/app/views/tim/images/edit.html.erb +6 -0
  45. data/app/views/tim/images/index.html.erb +21 -0
  46. data/app/views/tim/images/new.html.erb +5 -0
  47. data/app/views/tim/images/show.html.erb +5 -0
  48. data/app/views/tim/layouts/application.html.erb +14 -0
  49. data/app/views/tim/provider_images/_form.html.erb +17 -0
  50. data/app/views/tim/provider_images/_provider_image.xml.haml +12 -0
  51. data/app/views/tim/provider_images/_provider_image_minimal.xml.haml +2 -0
  52. data/app/views/tim/provider_images/edit.html.erb +6 -0
  53. data/app/views/tim/provider_images/index.html.erb +17 -0
  54. data/app/views/tim/provider_images/index.xml.haml +4 -0
  55. data/app/views/tim/provider_images/new.html.erb +5 -0
  56. data/app/views/tim/provider_images/show.html.erb +5 -0
  57. data/app/views/tim/provider_images/show.xml.haml +2 -0
  58. data/app/views/tim/target_images/_form.html.erb +17 -0
  59. data/app/views/tim/target_images/_target_image.xml.haml +13 -0
  60. data/app/views/tim/target_images/_target_image_minimal.xml.haml +2 -0
  61. data/app/views/tim/target_images/edit.html.erb +6 -0
  62. data/app/views/tim/target_images/index.html.erb +21 -0
  63. data/app/views/tim/target_images/index.xml.haml +4 -0
  64. data/app/views/tim/target_images/new.html.erb +5 -0
  65. data/app/views/tim/target_images/show.html.erb +5 -0
  66. data/app/views/tim/target_images/show.xml.haml +2 -0
  67. data/app/views/tim/templates/_form.html.erb +17 -0
  68. data/app/views/tim/templates/_template.xml.haml +8 -0
  69. data/app/views/tim/templates/_template_minimal.xml.haml +2 -0
  70. data/app/views/tim/templates/edit.html.erb +6 -0
  71. data/app/views/tim/templates/index.html.erb +17 -0
  72. data/app/views/tim/templates/index.xml.haml +4 -0
  73. data/app/views/tim/templates/new.html.erb +5 -0
  74. data/app/views/tim/templates/show.html.erb +5 -0
  75. data/app/views/tim/templates/show.xml.haml +2 -0
  76. data/config/cucumber.yml +8 -0
  77. data/config/initializers/haml.rb +1 -0
  78. data/config/routes.rb +9 -0
  79. data/config/schemas/tdl.rng +282 -0
  80. data/config/user_keys.yml +26 -0
  81. data/db/migrate/20120906180351_create_tim_base_images.rb +12 -0
  82. data/db/migrate/20120906210106_create_tim_image_versions.rb +10 -0
  83. data/db/migrate/20120910175233_create_tim_templates.rb +9 -0
  84. data/db/migrate/20120911202321_create_tim_target_images.rb +14 -0
  85. data/db/migrate/20120911204329_create_tim_provider_images.rb +19 -0
  86. data/lib/generators/tim/install_generator.rb +15 -0
  87. data/lib/generators/tim/templates/README +6 -0
  88. data/lib/generators/tim/templates/tim.rb +8 -0
  89. data/lib/image_factory/image_factory.rb +4 -0
  90. data/lib/image_factory/model/base.rb +88 -0
  91. data/lib/image_factory/model/provider_image.rb +6 -0
  92. data/lib/image_factory/model/target_image.rb +6 -0
  93. data/lib/tasks/cucumber.rake +59 -0
  94. data/lib/tasks/tim_tasks.rake +4 -0
  95. data/lib/tim.rb +8 -0
  96. data/lib/tim/engine.rb +9 -0
  97. data/lib/tim/version.rb +3 -0
  98. data/spec/controllers/base_images_controller_spec.rb +131 -0
  99. data/spec/controllers/entrypoint_controller_spec.rb +32 -0
  100. data/spec/controllers/image_versions_controller_spec.rb +146 -0
  101. data/spec/controllers/provider_images_controller_spec.rb +156 -0
  102. data/spec/controllers/target_images_controller_spec.rb +153 -0
  103. data/spec/controllers/templates_controller_spec.rb +41 -0
  104. data/spec/decorators/controllers/templates_controller_decorator_spec.rb +13 -0
  105. data/spec/factories/tim/base_image.rb +10 -0
  106. data/spec/factories/tim/image_factory/provider_image.rb +10 -0
  107. data/spec/factories/tim/image_factory/status_detail.rb +0 -0
  108. data/spec/factories/tim/image_factory/target_image.rb +7 -0
  109. data/spec/factories/tim/image_version.rb +20 -0
  110. data/spec/factories/tim/provider_image.rb +9 -0
  111. data/spec/factories/tim/target_image.rb +10 -0
  112. data/spec/factories/tim/template.rb +23 -0
  113. data/spec/filters/user_keys_filter_spec.rb +41 -0
  114. data/spec/fixtures/template.xml +13 -0
  115. data/spec/models/base_image_spec.rb +39 -0
  116. data/spec/models/dummy/pool_family_spec.rb +14 -0
  117. data/spec/models/dummy/provider_account_spec.rb +18 -0
  118. data/spec/models/dummy/provider_type_spec.rb +18 -0
  119. data/spec/models/dummy/user_spec.rb +14 -0
  120. data/spec/models/image_version_spec.rb +27 -0
  121. data/spec/models/provider_image_spec.rb +69 -0
  122. data/spec/models/target_image_spec.rb +75 -0
  123. data/spec/models/template_spec.rb +16 -0
  124. data/spec/spec_helper.rb +56 -0
  125. data/spec/support/routes.rb +41 -0
  126. data/spec/validators/template_validator_spec.rb +19 -0
  127. data/spec/views/base_images_spec.rb +23 -0
  128. data/spec/views/image_versions_spec.rb +25 -0
  129. data/spec/views/provider_images_spec.rb +30 -0
  130. data/spec/views/target_images_spec.rb +25 -0
  131. data/spec/views/templates_spec.rb +24 -0
  132. data/test/dummy/Rakefile +7 -0
  133. data/test/dummy/app/assets/javascripts/application.js +15 -0
  134. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  135. data/test/dummy/app/controllers/application_controller.rb +3 -0
  136. data/test/dummy/app/decorators/tim/controllers/templates_controller_decorator.rb +8 -0
  137. data/test/dummy/app/helpers/application_helper.rb +2 -0
  138. data/test/dummy/app/models/pool_family.rb +3 -0
  139. data/test/dummy/app/models/provider_account.rb +3 -0
  140. data/test/dummy/app/models/provider_type.rb +3 -0
  141. data/test/dummy/app/models/tim/base_image.rb +6 -0
  142. data/test/dummy/app/models/user.rb +3 -0
  143. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  144. data/test/dummy/app/views/tim/base_images/_custom.xml.haml +1 -0
  145. data/test/dummy/app/views/tim/image_versions/_custom.xml.haml +1 -0
  146. data/test/dummy/app/views/tim/layouts/application.html.erb +14 -0
  147. data/test/dummy/app/views/tim/provider_images/_custom.xml.haml +1 -0
  148. data/test/dummy/app/views/tim/target_images/_custom.xml.haml +1 -0
  149. data/test/dummy/app/views/tim/templates/_custom.xml.haml +1 -0
  150. data/test/dummy/config.ru +4 -0
  151. data/test/dummy/config/application.rb +58 -0
  152. data/test/dummy/config/boot.rb +10 -0
  153. data/test/dummy/config/database.yml +28 -0
  154. data/test/dummy/config/environment.rb +5 -0
  155. data/test/dummy/config/environments/development.rb +37 -0
  156. data/test/dummy/config/environments/production.rb +67 -0
  157. data/test/dummy/config/environments/test.rb +37 -0
  158. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  159. data/test/dummy/config/initializers/inflections.rb +15 -0
  160. data/test/dummy/config/initializers/mime_types.rb +5 -0
  161. data/test/dummy/config/initializers/secret_token.rb +7 -0
  162. data/test/dummy/config/initializers/session_store.rb +8 -0
  163. data/test/dummy/config/initializers/tim.rb +8 -0
  164. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  165. data/test/dummy/config/locales/en.yml +5 -0
  166. data/test/dummy/config/routes.rb +4 -0
  167. data/test/dummy/db/development.sqlite3 +0 -0
  168. data/test/dummy/db/migrate/20120326103723532622_create_users.rb +9 -0
  169. data/test/dummy/db/migrate/20120423123114264114_create_pool_families.rb +7 -0
  170. data/test/dummy/db/migrate/20120911182850_add_pool_family_id_to_tim_base_image.rb +5 -0
  171. data/test/dummy/db/migrate/20120911202845_add_provider_type_id_to_tim_target_image.rb +5 -0
  172. data/test/dummy/db/migrate/20120911203222_create_provider_types.rb +7 -0
  173. data/test/dummy/db/migrate/20120911205431_create_provider_accounts.rb +7 -0
  174. data/test/dummy/db/schema.rb +86 -0
  175. data/test/dummy/db/test.sqlite3 +0 -0
  176. data/test/dummy/log/development.log +982 -0
  177. data/test/dummy/log/test.log +8629 -0
  178. data/test/dummy/public/404.html +26 -0
  179. data/test/dummy/public/422.html +26 -0
  180. data/test/dummy/public/500.html +26 -0
  181. data/test/dummy/public/favicon.ico +0 -0
  182. data/test/dummy/script/rails +6 -0
  183. data/test/dummy/test.rb +0 -0
  184. data/test/dummy/tmp/cache/assets/C7A/BB0/sprockets%2F13445f7a19078dd2df39517062aa6711 +0 -0
  185. data/test/dummy/tmp/cache/assets/C8C/CC0/sprockets%2F95d79f3b3096348427f3e4e38b5202e3 +0 -0
  186. data/test/dummy/tmp/cache/assets/CB0/2B0/sprockets%2F79106b90879c02a115d7f6f1c8390ac4 +0 -0
  187. data/test/dummy/tmp/cache/assets/CE0/690/sprockets%2F04c628c2a636286bfa92a4966b82b92a +0 -0
  188. data/test/dummy/tmp/cache/assets/D03/040/sprockets%2Fd9e94204d4b307145f12efc109b16c1f +0 -0
  189. data/test/dummy/tmp/cache/assets/D06/DC0/sprockets%2Fcd282851b6e4c463409ba3ece67e0510 +0 -0
  190. data/test/dummy/tmp/cache/assets/D23/5F0/sprockets%2F2a521f3183c6bbcd71bd26a5490b201e +0 -0
  191. data/test/dummy/tmp/cache/assets/D64/3A0/sprockets%2F56ac1aed10c39b12a88cb1b30f668f58 +0 -0
  192. data/test/dummy/tmp/cache/assets/D69/BD0/sprockets%2F0aaf75cf34556b33a9fec534fe4d0415 +0 -0
  193. data/test/dummy/tmp/cache/assets/D87/D80/sprockets%2Fefa3c8b210e87358c7add88cd6f49597 +0 -0
  194. data/test/dummy/tmp/cache/assets/D89/200/sprockets%2Ff9b4e953c874ed6a87de6490d055d9db +0 -0
  195. data/test/dummy/tmp/cache/assets/DF4/430/sprockets%2F403bb1de60cae4325cebd7e6c389b8ad +0 -0
  196. data/test/dummy/tmp/cache/assets/E00/500/sprockets%2Faaddc5b6f2cb6b98930cc54cf4c64a95 +0 -0
  197. data/test/dummy/tmp/cache/assets/EB3/CE0/sprockets%2Fd75a89c9fffacd99bce7eed96844eafc +0 -0
  198. metadata +432 -0
@@ -0,0 +1,26 @@
1
+ :template:
2
+ base_image: base_image_attributes
3
+
4
+ :base_image:
5
+ template: template_attributes
6
+ image_versions: image_versions_attributes
7
+ target_images: target_images_attributes
8
+ provider_images: provider_images_attributes
9
+
10
+ :image_version:
11
+ template: template_attributes
12
+ base_image: base_image_attributes
13
+ target_images: target_images_attributes
14
+ provider_images: provider_images_attributes
15
+
16
+ :target_image:
17
+ template: template_attributes
18
+ base_image: base_image_attributes
19
+ image_version: image_version_attributes
20
+ provider_images: provider_images_attributes
21
+
22
+ :provider_image:
23
+ template: template_attributes
24
+ base_image: base_image_attributes
25
+ image_version: image_version_attributes
26
+ target_image: target_image_attributes
@@ -0,0 +1,12 @@
1
+ class CreateTimBaseImages < ActiveRecord::Migration
2
+ def change
3
+ create_table :tim_base_images do |t|
4
+ t.string :name
5
+ t.string :description
6
+ t.integer :template_id
7
+ t.integer :user_id
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ class CreateTimImageVersions < ActiveRecord::Migration
2
+ def change
3
+ create_table :tim_image_versions do |t|
4
+ t.integer :base_image_id
5
+ t.integer :template_id
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ class CreateTimTemplates < ActiveRecord::Migration
2
+ def change
3
+ create_table :tim_templates do |t|
4
+ t.text :xml
5
+
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ class CreateTimTargetImages < ActiveRecord::Migration
2
+ def change
3
+ create_table :tim_target_images do |t|
4
+ t.string :factory_id
5
+ t.integer :image_version_id
6
+ t.string :target
7
+ t.string :status
8
+ t.string :status_detail
9
+ t.string :progress # Factory Target Image percent_complete
10
+
11
+ t.timestamps
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ class CreateTimProviderImages < ActiveRecord::Migration
2
+ def change
3
+ create_table :tim_provider_images do |t|
4
+ t.integer :id
5
+ t.string :factory_id
6
+ t.integer :target_image_id
7
+ t.string :provider
8
+ # The Cloud Specific ID. i.e. ami-12345678
9
+ t.string :external_image_id
10
+ t.string :provider_account_id
11
+ t.boolean :snapshot
12
+
13
+ t.string :status
14
+ t.string :status_detail
15
+ t.string :progress # Factory Target Image percent_complete
16
+ t.timestamps
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ require 'rails/generators'
2
+
3
+ module Tim
4
+ class InstallGenerator < Rails::Generators::Base
5
+ desc "Copy Tim default files"
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ def copy_config
9
+ copy_file "tim.rb", "config/initializers/tim.rb"
10
+ end
11
+ def show_readme
12
+ readme 'README' if behavior == :invoke
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ See the newly installed tim.rb in your initializers directory for
2
+ default settings.
3
+
4
+ As an example. you can choose different classes for Tim to hook
5
+ into for user, provider_account, and provider_type, just specify those
6
+ classes here.
@@ -0,0 +1,8 @@
1
+ Tim.user_class = "User"
2
+ Tim.provider_account_class = "ProviderAccount"
3
+ Tim.provider_type_class = "ProviderType"
4
+ # Image Factory URL
5
+ Tim::ImageFactory::Base.site = "http://localhost:8075/imagefactory"
6
+ # FIXME: We should be able to infer these from Routes
7
+ Tim::ImageFactory::TargetImage.callback_url = "http://localhost:3000/tim/target_images/"
8
+ Tim::ImageFactory::ProviderImage.callback_url = "http://localhost:3000/tim/provider_images/"
@@ -0,0 +1,4 @@
1
+ require "active_resource"
2
+ require File.join(File.dirname(__FILE__), 'model', 'base')
3
+ require File.join(File.dirname(__FILE__), 'model', 'target_image')
4
+ require File.join(File.dirname(__FILE__), 'model', 'provider_image')
@@ -0,0 +1,88 @@
1
+ require "uri"
2
+
3
+ module Tim
4
+ module ImageFactory
5
+ class Base < ActiveResource::Base
6
+ self.format = :json
7
+ # TODO Verify Image Factory Certification Concerns that warrent removing SSL Verfication
8
+ self.ssl_options = {:verify_mode => OpenSSL::SSL::VERIFY_NONE}
9
+
10
+ class << self
11
+ # Add Callback URL for listening to callback requests
12
+ def callback_url=(url)
13
+ @callback_url = URI.parse(url)
14
+ end
15
+
16
+ def callback_url
17
+ @callback_url
18
+ end
19
+
20
+ ## Remove format from the url for resources
21
+ def element_path(id, prefix_options = {}, query_options = nil)
22
+ prefix_options, query_options = split_options(prefix_options) if query_options.nil?
23
+ "#{prefix(prefix_options)}#{collection_name}/#{id}#{query_string(query_options)}"
24
+ end
25
+
26
+ ## Remove format from the url for collections
27
+ def collection_path(prefix_options = {}, query_options = nil)
28
+ prefix_options, query_options = split_options(prefix_options) if query_options.nil?
29
+ "#{prefix(prefix_options)}#{collection_name}#{query_string(query_options)}"
30
+ end
31
+
32
+ ## For a collection call, ActiveResource formatting is not
33
+ ## compliant with Factory's output.
34
+ def instantiate_collection(collection, prefix_options = {})
35
+ unless collection.kind_of? Array
36
+ [instantiate_record(collection, prefix_options)]
37
+ else
38
+ collection.collect! { |record| instantiate_record(record, prefix_options) }
39
+ end
40
+ end
41
+
42
+ ## The objects returned from this method are not automatically converted into ActiveResource instances - they are ordinary Hashes.
43
+ ## Modifications below ensures that you get ActiveResource instances.
44
+ def get(method_name, options = {})
45
+ object_array = connection.get(custom_method_collection_url(method_name, options), headers)
46
+ if object_array.class.to_s=="Array"
47
+ object_array.collect! {|record| self.class.new.load(record)}
48
+ else
49
+ self.class.new.load(object_array)
50
+ end
51
+ end
52
+
53
+ # This approach does mean you're limited to one server at a time
54
+ def config
55
+ defined?(@@config) ? @@config : {}
56
+ end
57
+ def config=(conf={})
58
+ @@config = conf
59
+ self.site = @@config[:site]
60
+ end
61
+
62
+ # Should we use OAuth?
63
+ def use_oauth?
64
+ config[:consumer_key] && config[:consumer_secret] && config[:site]
65
+ end
66
+ end
67
+
68
+ ## Instance Methods: (modifying the ActiveRecord::CustomMethods).
69
+ ## This modification is same as defined in above method
70
+ def get(method_name, options = {})
71
+ self.class.new.load(connection.get(custom_method_element_url(method_name, options), self.class.headers))
72
+ end
73
+
74
+ # Modifying the url formations to make them Factory compliant
75
+ def custom_method_element_url(method_name, options = {})
76
+ "#{self.class.prefix(prefix_options)}#{self.class.collection_name}/#{id}/" +
77
+ "#{method_name}#{self.class.send!(:query_string, options)}"
78
+ end
79
+
80
+ # Modifying the url formations to make them Factory compliant
81
+ def self.custom_method_collection_url(method_name, options = {})
82
+ prefix_options, query_options = split_options(options)
83
+ url = "#{prefix(prefix_options)}#{collection_name}/#{method_name}#{query_string(query_options)}"
84
+ url
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,6 @@
1
+ module Tim
2
+ module ImageFactory
3
+ class ProviderImage < Base
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Tim
2
+ module ImageFactory
3
+ class TargetImage < Base
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,59 @@
1
+ # IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
2
+ # It is recommended to regenerate this file in the future when you upgrade to a
3
+ # newer version of cucumber-rails. Consider adding your own code to a new file
4
+ # instead of editing this one. Cucumber will automatically load all features/**/*.rb
5
+ # files.
6
+
7
+
8
+ unless ARGV.any? {|a| a =~ /^gems/} # Don't load anything when running the gems:* tasks
9
+
10
+ begin
11
+ require 'cucumber/rake/task'
12
+
13
+ namespace :cucumber do
14
+ Cucumber::Rake::Task.new({:ok => 'db:test:prepare'}, 'Run features that should pass') do |t|
15
+ t.fork = true # You may get faster startup if you set this to false
16
+ t.profile = 'default'
17
+ end
18
+
19
+ Cucumber::Rake::Task.new({:wip => 'db:test:prepare'}, 'Run features that are being worked on') do |t|
20
+ t.fork = true # You may get faster startup if you set this to false
21
+ t.profile = 'wip'
22
+ end
23
+
24
+ Cucumber::Rake::Task.new({:rerun => 'db:test:prepare'}, 'Record failing features and run only them if any exist') do |t|
25
+ t.fork = true # You may get faster startup if you set this to false
26
+ t.profile = 'rerun'
27
+ end
28
+
29
+ desc 'Run all features'
30
+ task :all => [:ok, :wip]
31
+
32
+ task :statsetup do
33
+ require 'rails/code_statistics'
34
+ ::STATS_DIRECTORIES << %w(Cucumber\ features features) if File.exist?('features')
35
+ ::CodeStatistics::TEST_TYPES << "Cucumber features" if File.exist?('features')
36
+ end
37
+ end
38
+ desc 'Alias for cucumber:ok'
39
+ task :cucumber => 'cucumber:ok'
40
+
41
+ task :default => :cucumber
42
+
43
+ task :features => :cucumber do
44
+ STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***"
45
+ end
46
+
47
+ # In case we don't have ActiveRecord, append a no-op task that we can depend upon.
48
+ task 'db:test:prepare' do
49
+ end
50
+
51
+ task :stats => 'cucumber:statsetup'
52
+ rescue LoadError
53
+ desc 'cucumber rake task not available (cucumber not installed)'
54
+ task :cucumber do
55
+ abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
56
+ end
57
+ end
58
+
59
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :tim do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,8 @@
1
+ require "tim/engine"
2
+ require "image_factory/image_factory.rb"
3
+
4
+ module Tim
5
+ mattr_accessor :user_class
6
+ mattr_accessor :provider_account_class
7
+ mattr_accessor :provider_type_class
8
+ end
@@ -0,0 +1,9 @@
1
+ module Tim
2
+ class Engine < Rails::Engine
3
+ isolate_namespace Tim
4
+ config.generators do |g|
5
+ g.test_framework :rspec, :view_specs => false
6
+ g.template_engine :haml
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ module Tim
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,131 @@
1
+ require "spec_helper"
2
+
3
+ module Tim
4
+ describe BaseImagesController do
5
+ render_views
6
+
7
+ describe "Base Images API" do
8
+ before(:each) do
9
+ send_and_accept_xml
10
+ BaseImagesController.any_instance.stub(:template_exists?).and_return false
11
+ end
12
+
13
+ describe "Create Base Image" do
14
+
15
+ context "Success" do
16
+ it "should return a new base image as xml" do
17
+ post :create, { :base_image => { :name => "Name", :description => "Description"}}
18
+ response.code.should == "201"
19
+
20
+ body = Hash.from_xml(response.body)
21
+ body.keys.should == ["base_image"]
22
+ end
23
+
24
+ it "should return a new base image with template as xml" do
25
+ Template.any_instance.stub(:valid?).and_return true
26
+ post :create, { :base_image => { :name => "Name",
27
+ :description => "Description",
28
+ :template => {:xml => "<template></template>" }}}
29
+ response.code.should == "201"
30
+
31
+ body = Hash.from_xml(response.body)
32
+ body.keys.should == ["base_image"]
33
+ body["base_image"].keys.should =~ ["template", "id", "href", "name", "description", "image_versions"]
34
+ body["base_image"]["template"].keys.should =~ ["id", "href"]
35
+ end
36
+ end
37
+
38
+ context "failure" do
39
+ it "should return a unprocessable entity error when the client sends invalid content" do
40
+ post :create, { :invalid_image => FactoryGirl.build(:base_image).attributes }
41
+ response.code.should == "422"
42
+ end
43
+ end
44
+ end
45
+
46
+ describe "Show Base Image" do
47
+ context "Success" do
48
+ it "should return an existing base image as XML" do
49
+ base_image = FactoryGirl.create(:base_image)
50
+ get :show, :id => base_image.id
51
+
52
+ response.code.should == "200"
53
+
54
+ body = Hash.from_xml(response.body)
55
+ body.keys.should == ["base_image"]
56
+ body["base_image"].keys.should =~ ["id", "href", "name", "description", "image_versions"]
57
+ end
58
+
59
+ it "should return an existing base image as XML with template" do
60
+ base_image = FactoryGirl.create(:base_image_with_template)
61
+ get :show, :id => base_image.id
62
+
63
+ response.code.should == "200"
64
+
65
+ body = Hash.from_xml(response.body)
66
+ body.keys.should == ["base_image"]
67
+ body["base_image"].keys.should =~ ["template", "id", "href", "name", "description", "image_versions"]
68
+ body["base_image"]["template"].keys.should =~ ["id", "href"]
69
+ end
70
+
71
+ it "should return an existing base image as XML with image versions" do
72
+ base_image = FactoryGirl.create(:base_image_with_template)
73
+ 2.times do
74
+ FactoryGirl.create(:image_version, :base_image => base_image)
75
+ end
76
+
77
+ get :show, :id => base_image.id
78
+
79
+ response.code.should == "200"
80
+
81
+ body = Hash.from_xml(response.body)
82
+ body.keys.should == ["base_image"]
83
+ body["base_image"].keys.should =~ ["image_versions", "template", "id", "href", "name", "description"]
84
+ body["base_image"]["image_versions"]["image_version"].size.should == 2
85
+ end
86
+ end
87
+
88
+ context "failure" do
89
+ it "should return a not found response when an base image does not exist" do
90
+ get :show, :id => -1
91
+ response.code.should == "404"
92
+ end
93
+ end
94
+ end
95
+
96
+ describe "List Base Images" do
97
+ context "Success" do
98
+ it "should return a list of existing base images as XML" do
99
+ 3.times do
100
+ FactoryGirl.create(:base_image)
101
+ end
102
+
103
+ get :index
104
+
105
+ body = Hash.from_xml(response.body)
106
+ body.keys.should == ["base_images"]
107
+ body["base_images"]["base_image"].first.keys.should =~ ["id", "href"]
108
+ response.code.should == "200"
109
+ end
110
+ end
111
+ end
112
+
113
+ describe "List Delete Image" do
114
+ context "Success" do
115
+ it "should return a no content code when deleting an image" do
116
+ base_image = FactoryGirl.create(:base_image)
117
+ delete :destroy, :id => base_image.id
118
+ response.code.should == "204"
119
+ end
120
+ end
121
+
122
+ context "Failure" do
123
+ it "should return a not found code when deleting an image that does not exist" do
124
+ delete :destroy, :id => -1
125
+ response.code.should == "404"
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end