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.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +392 -0
- data/Rakefile +33 -0
- data/app/assets/javascripts/tim/application.js +15 -0
- data/app/assets/stylesheets/tim/application.css +13 -0
- data/app/controllers/tim/application_controller.rb +19 -0
- data/app/controllers/tim/base_images_controller.rb +59 -0
- data/app/controllers/tim/entrypoint_controller.rb +8 -0
- data/app/controllers/tim/image_versions_controller.rb +48 -0
- data/app/controllers/tim/provider_images_controller.rb +59 -0
- data/app/controllers/tim/target_images_controller.rb +61 -0
- data/app/controllers/tim/templates_controller.rb +47 -0
- data/app/filters/tim/user_keys_filter.rb +59 -0
- data/app/helpers/tim/application_helper.rb +4 -0
- data/app/models/tim/base.rb +6 -0
- data/app/models/tim/base_image.rb +15 -0
- data/app/models/tim/image_version.rb +13 -0
- data/app/models/tim/provider_image.rb +51 -0
- data/app/models/tim/target_image.rb +50 -0
- data/app/models/tim/template.rb +19 -0
- data/app/responders/tim/custom_responder.rb +24 -0
- data/app/validators/template_validator.rb +15 -0
- data/app/views/layouts/tim/application.html.erb +14 -0
- data/app/views/tim/base_images/_base_image.xml.haml +11 -0
- data/app/views/tim/base_images/_base_image_minimal.xml.haml +2 -0
- data/app/views/tim/base_images/_form.html.erb +17 -0
- data/app/views/tim/base_images/edit.html.erb +6 -0
- data/app/views/tim/base_images/index.html.erb +17 -0
- data/app/views/tim/base_images/index.xml.haml +4 -0
- data/app/views/tim/base_images/new.html.erb +5 -0
- data/app/views/tim/base_images/show.html.erb +5 -0
- data/app/views/tim/base_images/show.xml.haml +2 -0
- data/app/views/tim/entrypoint/index.xml.haml +7 -0
- data/app/views/tim/image_versions/_form.html.erb +17 -0
- data/app/views/tim/image_versions/_image_version.xml.haml +9 -0
- data/app/views/tim/image_versions/_image_version_minimal.xml.haml +2 -0
- data/app/views/tim/image_versions/edit.html.erb +6 -0
- data/app/views/tim/image_versions/index.html.erb +17 -0
- data/app/views/tim/image_versions/index.xml.haml +4 -0
- data/app/views/tim/image_versions/new.html.erb +5 -0
- data/app/views/tim/image_versions/show.html.erb +5 -0
- data/app/views/tim/image_versions/show.xml.haml +2 -0
- data/app/views/tim/images/_form.html.erb +17 -0
- data/app/views/tim/images/edit.html.erb +6 -0
- data/app/views/tim/images/index.html.erb +21 -0
- data/app/views/tim/images/new.html.erb +5 -0
- data/app/views/tim/images/show.html.erb +5 -0
- data/app/views/tim/layouts/application.html.erb +14 -0
- data/app/views/tim/provider_images/_form.html.erb +17 -0
- data/app/views/tim/provider_images/_provider_image.xml.haml +12 -0
- data/app/views/tim/provider_images/_provider_image_minimal.xml.haml +2 -0
- data/app/views/tim/provider_images/edit.html.erb +6 -0
- data/app/views/tim/provider_images/index.html.erb +17 -0
- data/app/views/tim/provider_images/index.xml.haml +4 -0
- data/app/views/tim/provider_images/new.html.erb +5 -0
- data/app/views/tim/provider_images/show.html.erb +5 -0
- data/app/views/tim/provider_images/show.xml.haml +2 -0
- data/app/views/tim/target_images/_form.html.erb +17 -0
- data/app/views/tim/target_images/_target_image.xml.haml +13 -0
- data/app/views/tim/target_images/_target_image_minimal.xml.haml +2 -0
- data/app/views/tim/target_images/edit.html.erb +6 -0
- data/app/views/tim/target_images/index.html.erb +21 -0
- data/app/views/tim/target_images/index.xml.haml +4 -0
- data/app/views/tim/target_images/new.html.erb +5 -0
- data/app/views/tim/target_images/show.html.erb +5 -0
- data/app/views/tim/target_images/show.xml.haml +2 -0
- data/app/views/tim/templates/_form.html.erb +17 -0
- data/app/views/tim/templates/_template.xml.haml +8 -0
- data/app/views/tim/templates/_template_minimal.xml.haml +2 -0
- data/app/views/tim/templates/edit.html.erb +6 -0
- data/app/views/tim/templates/index.html.erb +17 -0
- data/app/views/tim/templates/index.xml.haml +4 -0
- data/app/views/tim/templates/new.html.erb +5 -0
- data/app/views/tim/templates/show.html.erb +5 -0
- data/app/views/tim/templates/show.xml.haml +2 -0
- data/config/cucumber.yml +8 -0
- data/config/initializers/haml.rb +1 -0
- data/config/routes.rb +9 -0
- data/config/schemas/tdl.rng +282 -0
- data/config/user_keys.yml +26 -0
- data/db/migrate/20120906180351_create_tim_base_images.rb +12 -0
- data/db/migrate/20120906210106_create_tim_image_versions.rb +10 -0
- data/db/migrate/20120910175233_create_tim_templates.rb +9 -0
- data/db/migrate/20120911202321_create_tim_target_images.rb +14 -0
- data/db/migrate/20120911204329_create_tim_provider_images.rb +19 -0
- data/lib/generators/tim/install_generator.rb +15 -0
- data/lib/generators/tim/templates/README +6 -0
- data/lib/generators/tim/templates/tim.rb +8 -0
- data/lib/image_factory/image_factory.rb +4 -0
- data/lib/image_factory/model/base.rb +88 -0
- data/lib/image_factory/model/provider_image.rb +6 -0
- data/lib/image_factory/model/target_image.rb +6 -0
- data/lib/tasks/cucumber.rake +59 -0
- data/lib/tasks/tim_tasks.rake +4 -0
- data/lib/tim.rb +8 -0
- data/lib/tim/engine.rb +9 -0
- data/lib/tim/version.rb +3 -0
- data/spec/controllers/base_images_controller_spec.rb +131 -0
- data/spec/controllers/entrypoint_controller_spec.rb +32 -0
- data/spec/controllers/image_versions_controller_spec.rb +146 -0
- data/spec/controllers/provider_images_controller_spec.rb +156 -0
- data/spec/controllers/target_images_controller_spec.rb +153 -0
- data/spec/controllers/templates_controller_spec.rb +41 -0
- data/spec/decorators/controllers/templates_controller_decorator_spec.rb +13 -0
- data/spec/factories/tim/base_image.rb +10 -0
- data/spec/factories/tim/image_factory/provider_image.rb +10 -0
- data/spec/factories/tim/image_factory/status_detail.rb +0 -0
- data/spec/factories/tim/image_factory/target_image.rb +7 -0
- data/spec/factories/tim/image_version.rb +20 -0
- data/spec/factories/tim/provider_image.rb +9 -0
- data/spec/factories/tim/target_image.rb +10 -0
- data/spec/factories/tim/template.rb +23 -0
- data/spec/filters/user_keys_filter_spec.rb +41 -0
- data/spec/fixtures/template.xml +13 -0
- data/spec/models/base_image_spec.rb +39 -0
- data/spec/models/dummy/pool_family_spec.rb +14 -0
- data/spec/models/dummy/provider_account_spec.rb +18 -0
- data/spec/models/dummy/provider_type_spec.rb +18 -0
- data/spec/models/dummy/user_spec.rb +14 -0
- data/spec/models/image_version_spec.rb +27 -0
- data/spec/models/provider_image_spec.rb +69 -0
- data/spec/models/target_image_spec.rb +75 -0
- data/spec/models/template_spec.rb +16 -0
- data/spec/spec_helper.rb +56 -0
- data/spec/support/routes.rb +41 -0
- data/spec/validators/template_validator_spec.rb +19 -0
- data/spec/views/base_images_spec.rb +23 -0
- data/spec/views/image_versions_spec.rb +25 -0
- data/spec/views/provider_images_spec.rb +30 -0
- data/spec/views/target_images_spec.rb +25 -0
- data/spec/views/templates_spec.rb +24 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/decorators/tim/controllers/templates_controller_decorator.rb +8 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/models/pool_family.rb +3 -0
- data/test/dummy/app/models/provider_account.rb +3 -0
- data/test/dummy/app/models/provider_type.rb +3 -0
- data/test/dummy/app/models/tim/base_image.rb +6 -0
- data/test/dummy/app/models/user.rb +3 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/tim/base_images/_custom.xml.haml +1 -0
- data/test/dummy/app/views/tim/image_versions/_custom.xml.haml +1 -0
- data/test/dummy/app/views/tim/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/tim/provider_images/_custom.xml.haml +1 -0
- data/test/dummy/app/views/tim/target_images/_custom.xml.haml +1 -0
- data/test/dummy/app/views/tim/templates/_custom.xml.haml +1 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +58 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +28 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/tim.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20120326103723532622_create_users.rb +9 -0
- data/test/dummy/db/migrate/20120423123114264114_create_pool_families.rb +7 -0
- data/test/dummy/db/migrate/20120911182850_add_pool_family_id_to_tim_base_image.rb +5 -0
- data/test/dummy/db/migrate/20120911202845_add_provider_type_id_to_tim_target_image.rb +5 -0
- data/test/dummy/db/migrate/20120911203222_create_provider_types.rb +7 -0
- data/test/dummy/db/migrate/20120911205431_create_provider_accounts.rb +7 -0
- data/test/dummy/db/schema.rb +86 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +982 -0
- data/test/dummy/log/test.log +8629 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +26 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/test.rb +0 -0
- data/test/dummy/tmp/cache/assets/C7A/BB0/sprockets%2F13445f7a19078dd2df39517062aa6711 +0 -0
- data/test/dummy/tmp/cache/assets/C8C/CC0/sprockets%2F95d79f3b3096348427f3e4e38b5202e3 +0 -0
- data/test/dummy/tmp/cache/assets/CB0/2B0/sprockets%2F79106b90879c02a115d7f6f1c8390ac4 +0 -0
- data/test/dummy/tmp/cache/assets/CE0/690/sprockets%2F04c628c2a636286bfa92a4966b82b92a +0 -0
- data/test/dummy/tmp/cache/assets/D03/040/sprockets%2Fd9e94204d4b307145f12efc109b16c1f +0 -0
- data/test/dummy/tmp/cache/assets/D06/DC0/sprockets%2Fcd282851b6e4c463409ba3ece67e0510 +0 -0
- data/test/dummy/tmp/cache/assets/D23/5F0/sprockets%2F2a521f3183c6bbcd71bd26a5490b201e +0 -0
- data/test/dummy/tmp/cache/assets/D64/3A0/sprockets%2F56ac1aed10c39b12a88cb1b30f668f58 +0 -0
- data/test/dummy/tmp/cache/assets/D69/BD0/sprockets%2F0aaf75cf34556b33a9fec534fe4d0415 +0 -0
- data/test/dummy/tmp/cache/assets/D87/D80/sprockets%2Fefa3c8b210e87358c7add88cd6f49597 +0 -0
- data/test/dummy/tmp/cache/assets/D89/200/sprockets%2Ff9b4e953c874ed6a87de6490d055d9db +0 -0
- data/test/dummy/tmp/cache/assets/DF4/430/sprockets%2F403bb1de60cae4325cebd7e6c389b8ad +0 -0
- data/test/dummy/tmp/cache/assets/E00/500/sprockets%2Faaddc5b6f2cb6b98930cc54cf4c64a95 +0 -0
- data/test/dummy/tmp/cache/assets/EB3/CE0/sprockets%2Fd75a89c9fffacd99bce7eed96844eafc +0 -0
- 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,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,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,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,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
|
data/lib/tim.rb
ADDED
data/lib/tim/engine.rb
ADDED
data/lib/tim/version.rb
ADDED
|
@@ -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
|