croesus 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +121 -0
  3. data/.ruby-version +1 -0
  4. data/API_operation.txt +197 -0
  5. data/CHANGELOG.md +0 -0
  6. data/Gemfile +3 -0
  7. data/LICENSE.txt +0 -0
  8. data/README.md +146 -0
  9. data/Rakefile +26 -0
  10. data/bin/console_cmd.rb +133 -0
  11. data/croesus.gemspec +39 -0
  12. data/lib/croesus/associations.rb +46 -0
  13. data/lib/croesus/attribute.rb +41 -0
  14. data/lib/croesus/attributes.rb +93 -0
  15. data/lib/croesus/coerce.rb +110 -0
  16. data/lib/croesus/coercions/boolean_definitions.rb +32 -0
  17. data/lib/croesus/coercions/date_definitions.rb +30 -0
  18. data/lib/croesus/coercions/date_time_definitions.rb +30 -0
  19. data/lib/croesus/coercions/fixnum_definitions.rb +32 -0
  20. data/lib/croesus/coercions/float_definitions.rb +30 -0
  21. data/lib/croesus/coercions/hash_definitions.rb +27 -0
  22. data/lib/croesus/coercions/integer_definitions.rb +29 -0
  23. data/lib/croesus/coercions/string_definitions.rb +43 -0
  24. data/lib/croesus/coercions/time_definitions.rb +30 -0
  25. data/lib/croesus/core_ext/blank.rb +123 -0
  26. data/lib/croesus/core_ext/hash.rb +185 -0
  27. data/lib/croesus/dsl/dsl.rb +35 -0
  28. data/lib/croesus/dsl/helpers.rb +43 -0
  29. data/lib/croesus/dsl/mod_factory.rb +191 -0
  30. data/lib/croesus/dsl/resource_dsl.rb +59 -0
  31. data/lib/croesus/dsl/route_dsl.rb +42 -0
  32. data/lib/croesus/identity_map.rb +98 -0
  33. data/lib/croesus/platform.rb +47 -0
  34. data/lib/croesus/querying.rb +63 -0
  35. data/lib/croesus/resources/about.rb +15 -0
  36. data/lib/croesus/resources/basic_methods.rb +36 -0
  37. data/lib/croesus/resources/connectivity.rb +42 -0
  38. data/lib/croesus/resources/container.rb +135 -0
  39. data/lib/croesus/resources/fault.rb +38 -0
  40. data/lib/croesus/resources/fault_effect.rb +24 -0
  41. data/lib/croesus/resources/group.rb +37 -0
  42. data/lib/croesus/resources/host.rb +26 -0
  43. data/lib/croesus/resources/job.rb +27 -0
  44. data/lib/croesus/resources/namespace.rb +39 -0
  45. data/lib/croesus/resources/policy.rb +38 -0
  46. data/lib/croesus/resources/source.rb +86 -0
  47. data/lib/croesus/resources/source_config.rb +54 -0
  48. data/lib/croesus/resources/source_environment.rb +58 -0
  49. data/lib/croesus/resources/source_repository.rb +14 -0
  50. data/lib/croesus/resources/system_info.rb +21 -0
  51. data/lib/croesus/resources/timeflow.rb +40 -0
  52. data/lib/croesus/resources/timeflow_snapshot.rb +38 -0
  53. data/lib/croesus/utils.rb +262 -0
  54. data/lib/croesus/validations/many.rb +27 -0
  55. data/lib/croesus/validations/optional.rb +27 -0
  56. data/lib/croesus/validations.rb +91 -0
  57. data/lib/croesus/validators/base.rb +47 -0
  58. data/lib/croesus/validators/boolean_validator.rb +32 -0
  59. data/lib/croesus/validators/email_validator.rb +36 -0
  60. data/lib/croesus/validators/enumerable_validator.rb +40 -0
  61. data/lib/croesus/validators/hash_validator.rb +50 -0
  62. data/lib/croesus/validators/lambda_validator.rb +54 -0
  63. data/lib/croesus/validators/many_validator.rb +57 -0
  64. data/lib/croesus/validators/optional_validator.rb +41 -0
  65. data/lib/croesus/validators/presence_validator.rb +36 -0
  66. data/lib/croesus/validators/simple_type_validators.rb +38 -0
  67. data/lib/croesus/validators/simple_validator.rb +40 -0
  68. data/lib/croesus/version.rb +43 -0
  69. data/lib/croesus/web_client/web_client.rb +153 -0
  70. data/lib/croesus/web_client/web_request.rb +77 -0
  71. data/lib/croesus/web_client/web_response.rb +70 -0
  72. data/lib/croesus.rb +250 -0
  73. metadata +325 -0
@@ -0,0 +1,123 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ #
5
+ # Copyright (C) 2014 Stefano Harding
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ # Add #blank? and #present? methods to Object class.
21
+ class Object
22
+ # Returns true if the object is nil or empty (if applicable)
23
+ #
24
+ # [].blank? #=> true
25
+ # [1].blank? #=> false
26
+ # [nil].blank? #=> false
27
+ #
28
+ # @return [TrueClass, FalseClass]
29
+ #
30
+ def blank?
31
+ nil? || (respond_to?(:empty?) && empty?)
32
+ end
33
+
34
+ # Returns true if the object is NOT nil or empty
35
+ #
36
+ # [].present? #=> false
37
+ # [1].present? #=> true
38
+ # [nil].present? #=> true
39
+ #
40
+ # @return [TrueClass, FalseClass]
41
+ #
42
+ def present?
43
+ !blank?
44
+ end
45
+ end # class Object
46
+
47
+ # Add #blank? method to NilClass class.
48
+ class NilClass
49
+ # Nil is always blank
50
+ #
51
+ # nil.blank? #=> true
52
+ #
53
+ # @return [TrueClass]
54
+ #
55
+ def blank?
56
+ true
57
+ end
58
+ end # class NilClass
59
+
60
+ # Add #blank? method to TrueClass class.
61
+ class TrueClass
62
+ # True is never blank.
63
+ #
64
+ # true.blank? #=> false
65
+ #
66
+ # @return [FalseClass]
67
+ #
68
+ def blank?
69
+ false
70
+ end
71
+ end # class TrueClass
72
+
73
+ # Add #blank? method to FalseClass class.
74
+ class FalseClass
75
+ # False is always blank.
76
+ #
77
+ # false.blank? #=> true
78
+ #
79
+ # @return [TrueClass]
80
+ #
81
+ def blank?
82
+ true
83
+ end
84
+ end # class FalseClass
85
+
86
+ # Add #blank? method to Hash class.
87
+ class Hash
88
+ # A hash is blank if it's empty:
89
+ #
90
+ # {}.blank? # => true
91
+ # { key: 'value' }.blank? # => false
92
+ alias_method :blank?, :empty?
93
+ end
94
+
95
+ # Add #blank? method to String class.
96
+ class String
97
+ # Strips out whitespace then tests if the string is empty.
98
+ #
99
+ # "".blank? #=> true
100
+ # " ".blank? #=> true
101
+ # " hey ho ".blank? #=> false
102
+ #
103
+ # @return [TrueClass, FalseClass]
104
+ #
105
+ def blank?
106
+ strip.empty?
107
+ end
108
+ end # class String
109
+
110
+ # Add #blank? method to Numeric class.
111
+ class Numeric
112
+ # Numerics are never blank
113
+ #
114
+ # 0.blank? #=> false
115
+ # 1.blank? #=> false
116
+ # 6.54321.blank? #=> false
117
+ #
118
+ # @return [FalseClass]
119
+ #
120
+ def blank?
121
+ false
122
+ end
123
+ end # class Numeric
@@ -0,0 +1,185 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ #
5
+ # Copyright (C) 2014 Stefano Harding
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ class Hash
21
+ # Returns a compacted copy (contains no key/value pairs having
22
+ # nil? values)
23
+ #
24
+ # @example
25
+ # hash = { a: 100, b: nil, c: false, d: '' }
26
+ # hash.compact # => { a: 100, c: false, d: '' }
27
+ # hash # => { a: 100, b: nil, c: false, d: '' }
28
+ #
29
+ # @return [Hash]
30
+ #
31
+ def compact
32
+ select { |_, value| !value.nil? }
33
+ end
34
+
35
+ # Returns a new hash with all keys converted using the block operation.
36
+ #
37
+ # @example
38
+ # hash = { name: 'Tiggy', age: '15' }
39
+ #
40
+ # hash.transform_keys{ |key| key.to_s.upcase }
41
+ # # => { "AGE" => "15", "NAME" => "Tiggy" }
42
+ #
43
+ # @return [Hash]
44
+ #
45
+ def transform_keys
46
+ enum_for(:transform_keys) unless block_given?
47
+ result = self.class.new
48
+ each_key do |key|
49
+ result[yield(key)] = self[key]
50
+ end
51
+ result
52
+ end
53
+
54
+ # Returns a new hash, recursively converting all keys by the
55
+ # block operation.
56
+ #
57
+ # @return [Hash]
58
+ #
59
+ def recursively_transform_keys(&block)
60
+ _recursively_transform_keys_in_object(self, &block)
61
+ end
62
+
63
+ # Returns a new hash with all keys downcased and converted
64
+ # to symbols.
65
+ #
66
+ # @return [Hash]
67
+ #
68
+ def normalize_keys
69
+ transform_keys { |key| key.downcase.to_sym rescue key }
70
+ end
71
+
72
+ # Returns a new Hash, recursively downcasing and converting all
73
+ # keys to symbols.
74
+ #
75
+ # @return [Hash]
76
+ #
77
+ def recursively_normalize_keys
78
+ recursively_transform_keys { |key| key.downcase.to_sym rescue key }
79
+ end
80
+
81
+ # Returns a new hash with all keys converted to symbols.
82
+ #
83
+ # @return [Hash]
84
+ #
85
+ def symbolize_keys
86
+ transform_keys { |key| key.to_sym rescue key }
87
+ end
88
+
89
+ # Returns a new Hash, recursively converting all keys to symbols.
90
+ #
91
+ # @return [Hash]
92
+ #
93
+ def recursively_symbolize_keys
94
+ recursively_transform_keys { |key| key.to_sym rescue key }
95
+ end
96
+
97
+ # Returns a new hash with all keys converted to strings.
98
+ #
99
+ # @return [Hash]
100
+ #
101
+ def stringify_keys
102
+ transform_keys { |key| key.to_s rescue key }
103
+ end
104
+
105
+ # Returns a new Hash, recursively converting all keys to strings.
106
+ #
107
+ # @return [Hash]
108
+ #
109
+ def recursively_stringify_key
110
+ recursively_transform_keys { |key| key.to_s rescue key }
111
+ end
112
+
113
+ # Returns a new hash with all keys converted to strings and the
114
+ # first letter capitalized.
115
+ #
116
+ # @return [Hash]
117
+ #
118
+ def capitalize_keys
119
+ transform_keys { |key| key.Upcase.to_s.capitalize rescue key }
120
+ end
121
+
122
+ # Returns a new Hash, recursively converting all keys to strings
123
+ # and the first letter capitalized.
124
+ #
125
+ # @return [Hash]
126
+ #
127
+ def recursively_capitalize_key
128
+ recursively_transform_keys { |key| key.to_s.capitalize rescue key }
129
+ end
130
+
131
+ class UndefinedPathError < StandardError; end
132
+ # Recursively searchs a nested datastructure for a key and returns
133
+ # the value. If a block is provided its value will be returned if
134
+ # the key does not exist
135
+ #
136
+ # @example
137
+ # options = { server: { location: { row: { rack: 34 } } } }
138
+ # options.recursive_fetch :server, :location, :row, :rack
139
+ # # => 34
140
+ # options.recursive_fetch(:non_existent_key) { 'default' }
141
+ # # => "default"
142
+ #
143
+ # @return [Hash, Array, String] value for key
144
+ #
145
+ def recursive_fetch(*args, &block)
146
+ args.reduce(self) do |obj, arg|
147
+ begin
148
+ arg = Integer(arg) if obj.is_a? Array
149
+ obj.fetch(arg)
150
+ rescue ArgumentError, IndexError, NoMethodError => e
151
+ break block.call(arg) if block
152
+ raise UndefinedPathError, "Could not fetch path (#{args.join(' > ')}) at #{arg}", e.backtrace
153
+ end
154
+ end
155
+ end
156
+
157
+ def recursive_merge(other)
158
+ hash = self.dup
159
+ other.each do |key, value|
160
+ myval = self[key]
161
+ if value.is_a?(Hash) && myval.is_a?(Hash)
162
+ hash[key] = myval.recursive_merge(value)
163
+ else
164
+ hash[key] = value
165
+ end
166
+ end
167
+ hash
168
+ end
169
+
170
+ private # P R O P R I E T À P R I V A T A divieto di accesso
171
+
172
+ # support methods for recursively transforming nested hashes and arrays
173
+ def _recursively_transform_keys_in_object(object, &block)
174
+ case object
175
+ when Hash
176
+ object.each_with_object({}) do |(key, value), result|
177
+ result[yield(key)] = _recursively_transform_keys_in_object(value, &block)
178
+ end
179
+ when Array
180
+ object.map { |e| _recursively_transform_keys_in_object(e, &block) }
181
+ else
182
+ object
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ #
5
+ # Copyright (C) 2014 Stefano Harding
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
16
+ # implied. See the License for the specific language governing
17
+ # permissions and limitations under the License.
18
+ #
19
+
20
+ module Croesus
21
+ class DSL
22
+ def self.evaluate(&block)
23
+ raise 'You need a block to build!' unless block_given?
24
+ DSL.new(&block)
25
+ end
26
+
27
+ def initialize(&block)
28
+ instance_eval(&block)
29
+ end
30
+
31
+ def resource(resource_name, &block)
32
+ Croesus::ResourceDSL.new(resource_name, &block)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ #
5
+ # Copyright (C) 2014 Stefano Harding
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
16
+ # implied. See the License for the specific language governing
17
+ # permissions and limitations under the License.
18
+ #
19
+
20
+ module Croesus::DSLHelpers
21
+ def self.included(base)
22
+ base.extend(ClassMethods)
23
+ end
24
+ private_class_method :included
25
+
26
+ module ClassMethods
27
+ def setter(*method_names)
28
+ method_names.each do |name|
29
+ send :define_method, name do |data|
30
+ instance_variable_set "@#{name}".to_sym, data
31
+ end
32
+ end
33
+ end
34
+
35
+ def varags_setter(*method_names)
36
+ method_names.each do |name|
37
+ send :define_method, name do |*data|
38
+ instance_variable_set "@#{name}".to_sym, data
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,191 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ #
5
+ # Copyright (C) 2014 Stefano Harding
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
16
+ # implied. See the License for the specific language governing
17
+ # permissions and limitations under the License.
18
+ #
19
+
20
+ # Registry for anonymous methods, not so anonymous now are you!
21
+ #
22
+ module Croesus::AnonoMod
23
+
24
+ @registry = {}
25
+
26
+ def self.registry
27
+ @registry
28
+ end
29
+
30
+ def self.register(resource_name, mod)
31
+ registry[resource_name] = mod
32
+ end
33
+ end
34
+
35
+ # Mysteries abound, dynamic box of factory creation for API resources.
36
+ #
37
+ module Croesus::ModFactory
38
+ include Croesus::Utils
39
+
40
+ def initialize(name, mod = Module.new)
41
+ @mod = mod
42
+ @name = name
43
+ Croesus::AnonoMod.register(name, @mod)
44
+ assemble_module
45
+ @mod
46
+ end
47
+
48
+ # Sets the description the Delphix Resource.
49
+ #
50
+ # @param [String] description
51
+ # the description of the API resource
52
+ #
53
+ # @return [Nil]
54
+ #
55
+ # @api public
56
+ def add_description(description)
57
+ @mod.instance_variable_set(:@description, description)
58
+ @mod.define_singleton_method(:description) { @description }
59
+ end
60
+
61
+ # Sets the root endpoint for the resource.
62
+ #
63
+ # @param [String] root
64
+ # the root endpoint for the resource
65
+ #
66
+ # @return [Nil]
67
+ #
68
+ # @api public
69
+ def add_root_endpoint(root)
70
+ @mod.instance_variable_set(:@root, root)
71
+ @mod.define_singleton_method(:root) { @root }
72
+ end
73
+
74
+ def add_method(dsl_object)
75
+ raw = dsl_object.to_hash
76
+ name = raw[:name]
77
+ verb = raw[:verb]
78
+ @mod.methods[name] = raw[:description]
79
+ @mod.singleton_class.send(:alias_method, name, "api_#{verb.downcase}")
80
+ define_help
81
+ end
82
+
83
+ private # P R O P R I E T À P R I V A T A Vietato L'accesso
84
+
85
+ # Internal: Define methods to handle a verb.
86
+ #
87
+ # verbs - A list of verbs to define methods for.
88
+ #
89
+ # Examples
90
+ #
91
+ # define_verbs :get, :post
92
+ #
93
+ # Returns nil.
94
+ def define_verbs(*verbs)
95
+ verbs.each do |verb|
96
+ define_verb(verb)
97
+ define_api_verb(verb)
98
+ end
99
+ end
100
+
101
+ # Internal: Defines a method to handle HTTP requests with the passed in
102
+ # verb.
103
+ #
104
+ # verb - Symbol name of the verb (e.g. :get).
105
+ #
106
+ # Examples
107
+ #
108
+ # define_verb :get
109
+ # # => get 'http://server.xyz/path'
110
+ #
111
+ # Returns nil.
112
+ def define_verb(verb)
113
+ @mod.define_singleton_method(verb.to_sym) do |*args, &block|
114
+ class_eval "Croesus.#{verb}"
115
+ end
116
+ end
117
+
118
+ # Internal: Defines a method to handle HTTP requests with the passed in
119
+ # verb to a api endpoint.
120
+ #
121
+ # verb - Symbol name of the verb (e.g. :get).
122
+ #
123
+ # Examples
124
+ #
125
+ # define_api_verb :get
126
+ # # => api_get '/resources/json/delphix/environment'
127
+ #
128
+ # Returns nil.
129
+ def define_api_verb(verb)
130
+ @mod.define_singleton_method("api_#{verb}") do |*args, &block|
131
+ class_eval "Croesus.#{verb}(url(*args)).body"
132
+ end
133
+ end
134
+
135
+ def define_help
136
+ @mod.define_singleton_method :help do
137
+ puts
138
+ dyno_width = terminal_dimensions[0] - 32
139
+ header title: "Available commands for #{@delphix_object}",
140
+ align: 'center', width: terminal_dimensions[0]
141
+ table border: true do
142
+ row header: true, color: 'red' do
143
+ column 'Num', width: 3, align: 'right', color: 'blue', padding: 0
144
+ column 'Method Name', width: 18, align: 'left', padding: 0
145
+ column "Description (http://#{Croesus.server}/api/#" \
146
+ "#{@delphix_object.downcase})",
147
+ width: dyno_width, align: 'left', padding: 0
148
+ end
149
+ (@methods.keys).sort.each.with_index(1) do |method, i|
150
+ row do
151
+ column '%02d' % i
152
+ column method
153
+ column @methods[method.to_sym]
154
+ end
155
+ end
156
+ end
157
+ puts @description
158
+ end
159
+ end
160
+
161
+ def assemble_module
162
+ add_included_hook
163
+ add_instance_variables
164
+ be_polite_and_debuggable
165
+ define_verbs('get', 'post', 'delete')
166
+ end
167
+
168
+ def add_included_hook
169
+ @mod.send :include, Croesus::BasicMethods
170
+ @mod.send :include, CommandLineReporter
171
+ @mod.send :include, Croesus::Utils
172
+ end
173
+
174
+ def add_instance_variables
175
+ @mod.instance_variable_set(:@delphix_object, classify(@name))
176
+ @mod.define_singleton_method(:delphix_object) { @delphix_object }
177
+
178
+ @mod.instance_variable_set(:@methods, {})
179
+ @mod.define_singleton_method(:methods) { @methods }
180
+ end
181
+
182
+ def be_polite_and_debuggable
183
+ @mod.define_singleton_method :to_s do
184
+ "<#{self.class.name}:#{self.name}:#{object_id}>"
185
+ end
186
+
187
+ @mod.define_singleton_method :inspect do
188
+ "<#{self.class.name}:#{self.name}:#{object_id} #{instance_variables}>"
189
+ end
190
+ end
191
+ end
@@ -0,0 +1,59 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ #
5
+ # Copyright (C) 2014 Stefano Harding
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
16
+ # implied. See the License for the specific language governing
17
+ # permissions and limitations under the License.
18
+ #
19
+
20
+ module Croesus
21
+ class ResourceDSL
22
+ include Croesus::DSLHelpers
23
+ include Croesus::ModFactory
24
+
25
+ setter :description, :root
26
+ varags_setter
27
+
28
+ def initialize(name, &block)
29
+ Croesus::ModFactory.instance_method(:initialize).bind(self).call(name)
30
+ instance_eval(&block)
31
+ @description ||= description
32
+ @root ||= root
33
+ add_description(@description)
34
+ add_root_endpoint(@root)
35
+ end
36
+
37
+ # The following HTTP methods are supported by the Delphix Appliance:
38
+ #
39
+ # GET - Retrieve data from the server where complex input is not needed.
40
+ # All GET requests are guaranteed to be read-only, but not all
41
+ # read-only requests are required to use GET. Simple input
42
+ # (strings, number, boolean values) can be passed as query
43
+ # parameters.
44
+ # POST - Issue a read/write operation, or make a read-only call that
45
+ # requires complex input. The optional body of the call is
46
+ # expressed as JSON.
47
+ # DELETE - Delete an object on the system. For languages that don't provide
48
+ # a native wrapper for DELETE, or for delete operations with
49
+ # optional input, all delete operations can also be invoked as POST
50
+ # to the same URL with /delete appended to it.
51
+ def get(path, &block) route 'GET', path, &block end
52
+ def post(path, &block) route 'POST', path, &block end
53
+ def delete(path, &block) route 'DELETE', path, &block end
54
+
55
+ def route(verb, path, &block)
56
+ add_method(Croesus::RouteDSL.new(verb, path, &block))
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ #
5
+ # Copyright (C) 2014 Stefano Harding
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
16
+ # implied. See the License for the specific language governing
17
+ # permissions and limitations under the License.
18
+ #
19
+
20
+ module Croesus
21
+ class RouteDSL
22
+ include Croesus::DSLHelpers
23
+
24
+ setter :name, :verb, :path, :description, :input, :returns
25
+ varags_setter
26
+
27
+ def initialize(verb, path, &block)
28
+ instance_eval(&block)
29
+ @name ||= name
30
+ @verb = verb
31
+ @path = path
32
+ @input ||= nil
33
+ @returns ||= nil
34
+ @description ||= description
35
+ end
36
+
37
+ def to_hash
38
+ { name: @name, verb: @verb, path: @path, input: @input,
39
+ returns: @returns, description: @description }
40
+ end
41
+ end
42
+ end