]> git.donarmstrong.com Git - dsa-puppet.git/blob - 3rdparty/modules/aviator/lib/puppet/feature/aviator/core/request_builder.rb
try again, with puppetforge modules, correctly included now
[dsa-puppet.git] / 3rdparty / modules / aviator / lib / puppet / feature / aviator / core / request_builder.rb
1 module Aviator
2
3   class BaseRequestNotFoundError < StandardError
4     attr_reader :base_request_hierarchy
5
6     def initialize(base_hierarchy)
7       @base_request_hierarchy = base_hierarchy
8       super("#{ base_request_hierarchy } could not be found!")
9     end
10   end
11
12
13   class RequestAlreadyDefinedError < StandardError
14     attr_reader :namespace,
15                 :request_name
16
17     def initialize(namespace, request_name)
18       @namespace = namespace
19       @request_name = request_name
20       super("#{ namespace }::#{ request_name } is already defined")
21     end
22   end
23
24
25   class RequestBuilder
26
27     class << self
28
29       def define_request(root_namespace, request_name, options, &block)
30         base_klass = get_request_class(root_namespace, options[:inherit])
31
32         klass = Class.new(base_klass, &block)
33
34         namespace_arr = [
35           klass.provider,
36           klass.service,
37           'Requests',
38           klass.api_version,
39           klass.endpoint_type
40         ]
41
42         namespace = namespace_arr.inject(root_namespace) do |namespace, sym|
43           const_name = sym.to_s.camelize
44           namespace.const_set(const_name, Module.new) unless namespace.const_defined?(const_name, false)
45           namespace.const_get(const_name, false)
46         end
47
48         klassname = request_name.to_s.camelize
49
50         if namespace.const_defined?(klassname, false)
51           raise RequestAlreadyDefinedError.new(namespace, klassname)
52         end
53
54         namespace.const_set(klassname, klass)
55       end
56
57
58       def get_request_class(root_namespace, request_class_arr)
59         provider_specific = request_class_arr != [:request]
60
61         if provider_specific
62           full_request_class_arr = request_class_arr.dup
63           full_request_class_arr.insert(2, :requests) if provider_specific
64         else
65           full_request_class_arr = request_class_arr
66         end
67
68         full_request_class_arr.inject(root_namespace) do |namespace, sym|
69           namespace.const_get(sym.to_s.camelize, false)
70         end
71       rescue NameError => e
72         if Aviator.const_defined?(full_request_class_arr[0].to_s.camelize)
73           provider = "Aviator::#{ full_request_class_arr[0] }::Provider".constantize
74           arr = ['..'] + full_request_class_arr
75           arr[-1,1] = arr.last.to_s + '.rb'
76           path = Pathname.new(provider.root_dir).join(*arr.map{|i| i.to_s }).expand_path
77         end
78
79         if provider && path.exist?
80           require path
81           full_request_class_arr.inject(root_namespace) do |namespace, sym|
82             namespace.const_get(sym.to_s.camelize, false)
83           end
84         else
85           raise BaseRequestNotFoundError.new(request_class_arr)
86         end
87       end
88
89     end
90
91   end
92
93
94   class << self
95
96     def define_request(request_name, options={ :inherit => [:request] }, &block)
97       RequestBuilder.define_request self, request_name, options, &block
98     end
99
100   end # class << self
101
102 end