bimbly 1.0.0
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.
- checksums.yaml +7 -0
- data/lib/bimbly.rb +239 -0
- data/lib/data_types.yml +1532 -0
- data/lib/errors_by_code.yml +2137 -0
- data/lib/errors_by_name.yml +2137 -0
- data/lib/object_sets.yml +6162 -0
- metadata +63 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 625f0de85f00930077c15f0be3765f5c5706b6bf
|
4
|
+
data.tar.gz: 0bbc8dc1fafa56a469177de5e19bd170d8b955b3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 22b8f0d267adcb5c43906d8f6cac5298d435187f214325b3d9719124f280d2d08eb006032c4d497a1f0f2fbc68c9f64e21b3463f9a45ddc5214400018c8967e7
|
7
|
+
data.tar.gz: 0e8622895288b12d10734acb48be2eb09f8e5fcb9c4a3b5003796f81584c9bf53b5b3c79abfeb2055316c7726dee5f0aa23edb0362adefe7d1965f06cacff5e3
|
data/lib/bimbly.rb
ADDED
@@ -0,0 +1,239 @@
|
|
1
|
+
require 'rest_client'
|
2
|
+
require 'yaml'
|
3
|
+
require 'json'
|
4
|
+
require 'pathname'
|
5
|
+
require 'pp'
|
6
|
+
|
7
|
+
class Bimbly
|
8
|
+
attr_reader :data_type, :error_codes, :error_names, :obj_sets
|
9
|
+
attr_accessor :array, :base_url, :cert, :doc_pointer, :file, :file_select, :headers, :menu,
|
10
|
+
:param_pointer, :password, :pointer, :port, :user, :verb
|
11
|
+
|
12
|
+
def initialize(opts = {})
|
13
|
+
# Read in setup files
|
14
|
+
@error_codes = YAML.load(File.read("#{File.dirname(__FILE__)}/errors_by_code.yml"))
|
15
|
+
@error_names = YAML.load(File.read("#{File.dirname(__FILE__)}/errors_by_name.yml"))
|
16
|
+
@obj_sets = YAML.load(File.read("#{File.dirname(__FILE__)}/object_sets.yml"))
|
17
|
+
@data_type = YAML.load(File.read("#{File.dirname(__FILE__)}/data_types.yml"))
|
18
|
+
|
19
|
+
@base_url = "NotConnected"
|
20
|
+
@menu = []
|
21
|
+
@param_pointer = @obj_sets
|
22
|
+
@doc_pointer = @obj_sets
|
23
|
+
gen_methods
|
24
|
+
new_connection(opts)
|
25
|
+
end
|
26
|
+
|
27
|
+
def call(opts = {})
|
28
|
+
verb = @verb
|
29
|
+
payload = @payload
|
30
|
+
uri = @uri
|
31
|
+
reset
|
32
|
+
|
33
|
+
raise StandardError, "Instantiate a connection to an array" if @array.nil?
|
34
|
+
|
35
|
+
raise StandardError, "Method to be used has not been loaded" if verb.nil?
|
36
|
+
|
37
|
+
# Check if url is valid
|
38
|
+
raise ArgumentError, "Invalid URL: #{uri}" unless uri =~ /\A#{URI::regexp}\z/
|
39
|
+
|
40
|
+
payload = payload.to_json if payload.class == Hash
|
41
|
+
|
42
|
+
begin
|
43
|
+
response = RestClient::Request.execute(
|
44
|
+
method: verb.to_sym,
|
45
|
+
url: uri,
|
46
|
+
ssl_ca_file: @cert,
|
47
|
+
headers: @headers,
|
48
|
+
payload: payload
|
49
|
+
)
|
50
|
+
rescue RestClient::ExceptionWithResponse => e
|
51
|
+
puts "Response Code: #{e.response.code}"
|
52
|
+
puts "Response Headers:"
|
53
|
+
pp e.response.headers
|
54
|
+
puts "Response Body:"
|
55
|
+
pp e.response.body
|
56
|
+
puts "Response Object:"
|
57
|
+
pp e.response.request.inspect
|
58
|
+
end
|
59
|
+
|
60
|
+
begin
|
61
|
+
JSON.parse(response.body) unless response.nil? || response.body == ''
|
62
|
+
rescue JSON::ParserError => e
|
63
|
+
puts e
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def new_connection(opts = {})
|
68
|
+
@file = opts[:file]
|
69
|
+
@file_select = opts[:file_select]
|
70
|
+
@array = opts[:array]
|
71
|
+
@cert = opts[:cert]
|
72
|
+
@port = opts[:port]
|
73
|
+
@user = opts[:user]
|
74
|
+
@password = opts[:password]
|
75
|
+
|
76
|
+
return if opts.empty?
|
77
|
+
|
78
|
+
if @file
|
79
|
+
conn_data = YAML.load(File.read(File.expand_path(@file)))
|
80
|
+
puts File.expand_path(@file)
|
81
|
+
puts conn_data
|
82
|
+
conn_data = conn_data[@file_select] if @file_select
|
83
|
+
@array = conn_data["array"]
|
84
|
+
@cert = conn_data["cert"]
|
85
|
+
@user = conn_data["user"]
|
86
|
+
@password = conn_data["password"]
|
87
|
+
end
|
88
|
+
|
89
|
+
@port = "5392" if @port.nil?
|
90
|
+
|
91
|
+
raise ArgumentError, "You must provide an array" if @array.nil?
|
92
|
+
raise ArgumentError, "You must provide a CA cert" if @cert.nil?
|
93
|
+
raise ArgumentError, "You must provide a user" if @user.nil?
|
94
|
+
raise ArgumentError, "You must provide a password" if @password.nil?
|
95
|
+
|
96
|
+
@base_url = "https://#{array}:#{port}"
|
97
|
+
@uri = "#{@base_url}/v1/tokens"
|
98
|
+
|
99
|
+
# Get initial connection credentials
|
100
|
+
creds = { data: {
|
101
|
+
username: @user,
|
102
|
+
password: @password
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
begin
|
107
|
+
response = RestClient::Request.execute(
|
108
|
+
method: :post,
|
109
|
+
url: @uri,
|
110
|
+
payload: creds.to_json,
|
111
|
+
ssl_ca_file: @cert,
|
112
|
+
ssl_ciphers: 'AESGCM:!aNULL'
|
113
|
+
)
|
114
|
+
rescue RestClient::ExceptionWithResponse => e
|
115
|
+
puts "Response Code: #{e.response.code}"
|
116
|
+
puts "Response Headers: #{e.response.headers}"
|
117
|
+
puts "Response Body: #{e.response.body}"
|
118
|
+
puts "Response Object: #{e.response.request.inspect}"
|
119
|
+
end
|
120
|
+
|
121
|
+
token = JSON.parse(response)["data"]["session_token"]
|
122
|
+
@headers = { 'X-Auth-Token' => token }
|
123
|
+
end
|
124
|
+
|
125
|
+
def reset
|
126
|
+
@verb = nil
|
127
|
+
@payload = nil
|
128
|
+
@uri = nil
|
129
|
+
@doc_pointer = @obj_sets
|
130
|
+
@param_pointer = @obj_sets
|
131
|
+
end
|
132
|
+
|
133
|
+
def details
|
134
|
+
puts "URI: #{@uri}"
|
135
|
+
puts "Verb: #{@verb}"
|
136
|
+
puts "Payload: #{@payload}"
|
137
|
+
end
|
138
|
+
|
139
|
+
def doc
|
140
|
+
puts @doc_pointer.to_yaml
|
141
|
+
end
|
142
|
+
|
143
|
+
def parameters
|
144
|
+
@param_pointer
|
145
|
+
end
|
146
|
+
|
147
|
+
def available_methods
|
148
|
+
self.methods - Object.methods
|
149
|
+
end
|
150
|
+
|
151
|
+
def data_types(type = nil)
|
152
|
+
if type
|
153
|
+
return @data_type[type]
|
154
|
+
elsif @param_pointer.nil?
|
155
|
+
return @data_type
|
156
|
+
else
|
157
|
+
@param_pointer.each { |key,value|
|
158
|
+
puts "[#{key}]"
|
159
|
+
@data_type[value].each { |key, value|
|
160
|
+
puts "#{key}: #{value}"
|
161
|
+
}
|
162
|
+
puts ""
|
163
|
+
}
|
164
|
+
end
|
165
|
+
|
166
|
+
return nil
|
167
|
+
end
|
168
|
+
|
169
|
+
def build_params(hash)
|
170
|
+
raise ArgumentError, "Please provide a valid hash for parameters" unless
|
171
|
+
hash.instance_of? Hash and hash != {}
|
172
|
+
url_params = "?"
|
173
|
+
size_count = 0
|
174
|
+
hash.each { |key, value|
|
175
|
+
url_params = "#{url_params}#{key}=#{value}"
|
176
|
+
size_count += 1
|
177
|
+
url_params = "#{url_params}&" unless size_count == hash.size
|
178
|
+
}
|
179
|
+
url_params
|
180
|
+
end
|
181
|
+
|
182
|
+
def gen_uri(opts = {})
|
183
|
+
url_params = build_params(opts[:params]) if opts[:params]
|
184
|
+
uri = "#{@base_url}/#{opts[:url_suffix]}#{url_params}"
|
185
|
+
end
|
186
|
+
|
187
|
+
def gen_method_hash
|
188
|
+
method_hash = {}
|
189
|
+
name = ""
|
190
|
+
@obj_sets.each { |obj_key, obj_value|
|
191
|
+
obj_value.each { |op_key, op_value|
|
192
|
+
method_suffix = ""
|
193
|
+
op_value.each { |key, value|
|
194
|
+
next if not key.match(/DELETE|GET|POST|PUT/)
|
195
|
+
if key.match(/id/)
|
196
|
+
method_suffix = "_by_id"
|
197
|
+
elsif key.match(/detail/)
|
198
|
+
method_suffix = "_detailed"
|
199
|
+
end
|
200
|
+
verb, url_suffix = key.split(' ')
|
201
|
+
hash = {}
|
202
|
+
hash[:verb] = verb.downcase.to_sym
|
203
|
+
hash[:url_suffix] = url_suffix
|
204
|
+
hash[:avail_params] = value
|
205
|
+
hash[:object] = obj_key
|
206
|
+
hash[:op] = op_key
|
207
|
+
|
208
|
+
name = "#{op_key}_#{obj_key}#{method_suffix}"
|
209
|
+
method_hash[name.to_sym] = hash
|
210
|
+
@menu.push name
|
211
|
+
}
|
212
|
+
}
|
213
|
+
}
|
214
|
+
method_hash
|
215
|
+
end
|
216
|
+
|
217
|
+
def gen_methods
|
218
|
+
method_hash = gen_method_hash
|
219
|
+
method_hash.each { |method_name, hash|
|
220
|
+
define_singleton_method(method_name) { |opts = {}|
|
221
|
+
raise ArgumentError, "Please provide id" if method_name.match(/id/) and opts[:id].nil?
|
222
|
+
url_suffix = hash[:url_suffix]
|
223
|
+
url_suffix = url_suffix.gsub(/\/id/, "/#{opts[:id]}") if method_name.match(/id/)
|
224
|
+
|
225
|
+
@param_pointer = hash[:avail_params]
|
226
|
+
|
227
|
+
uri = gen_uri(url_suffix: url_suffix,
|
228
|
+
params: opts[:params])
|
229
|
+
|
230
|
+
@uri = uri
|
231
|
+
@verb = hash[:verb]
|
232
|
+
@payload = opts[:payload]
|
233
|
+
@doc_pointer = @obj_sets[hash[:object]][hash[:op]]
|
234
|
+
|
235
|
+
self
|
236
|
+
}
|
237
|
+
}
|
238
|
+
end
|
239
|
+
end
|