built.io 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 ADDED
File without changes
data/README.md ADDED
@@ -0,0 +1,64 @@
1
+ # built.io
2
+
3
+ built.io is a Backend-as-a-Service. This is the ruby SDK providing convenient
4
+ wrappers for working with built.io.
5
+
6
+ ## Getting Started
7
+
8
+ Call the `init` method on `Built` to initialize the SDK with your
9
+ application's api_key:
10
+
11
+ ```ruby
12
+ Built.init :application_api_key => "<your api key>"
13
+ ```
14
+
15
+ ## Objects
16
+
17
+ ### Create an object
18
+
19
+ ```ruby
20
+ obj = Built::Object.new("people")
21
+
22
+ obj["name"] = "James"
23
+ obj["age"] = 32
24
+
25
+ obj.save
26
+ ```
27
+
28
+ ### Update an existing object
29
+
30
+ If you already have objects from a query, just set the attributes and save:
31
+
32
+ ```ruby
33
+ obj["age"] = 43
34
+ obj.save
35
+ ```
36
+
37
+ If you just have the object's `uid`, set it first:
38
+
39
+ ```ruby
40
+ obj.uid = "bltMyU1d"
41
+ obj["age"] = 43
42
+ obj.save
43
+ ```
44
+
45
+ ### Delete an object
46
+
47
+ ```ruby
48
+ obj.destroy
49
+ ```
50
+
51
+ ## Querying objects
52
+
53
+ ```ruby
54
+ query = Query.new("people")
55
+ query
56
+ .containedIn("name", ["James"])
57
+ .greaterThan("age", 30)
58
+ .include_count
59
+
60
+ result = query.exec
61
+
62
+ puts result.objects[0]
63
+ puts result.count
64
+ ```
data/lib/built.rb ADDED
@@ -0,0 +1,68 @@
1
+ require "i18n"
2
+ require "httmultiparty"
3
+
4
+ module Built
5
+ class << self
6
+ # singleton http client
7
+ # @api private
8
+ @@client = nil
9
+
10
+ # Initialize the SDK
11
+ # @raise [BuiltError]
12
+ # @param [Hash] options Options
13
+ # @option options [String] :application_api_key Your app's api_key. Required.
14
+ # @option options [String] :master_key Your app's master_key
15
+ # @option options [String] :authtoken A user's authtoken
16
+ # @option options [String] :host built.io API host (defaults to https://api.built.io)
17
+ # @option options [String] :version built.io version delimiter (v1, v2, etc)
18
+ def init(options)
19
+ options ||= {}
20
+
21
+ host = options[:host] || API_URI
22
+ version = options[:version] || API_VERSION
23
+ master_key = options[:master_key]
24
+ api_key = options[:application_api_key]
25
+ authtoken = options[:authtoken]
26
+
27
+ if Util.blank?(api_key)
28
+ raise BuiltError, I18n.t(
29
+ "required_parameter", {:param => "application_api_key"})
30
+ end
31
+
32
+ # create the client
33
+ @@client = Client.new({
34
+ host: host,
35
+ version: version,
36
+ application_api_key: api_key,
37
+ master_key: master_key,
38
+ authtoken: authtoken
39
+ })
40
+ end
41
+
42
+ # Get the singleton client
43
+ # @api private
44
+ def client
45
+ if !@@client
46
+ raise BuiltError, I18n.t("not_initialized")
47
+ end
48
+
49
+ @@client
50
+ end
51
+
52
+ # @api private
53
+ def root
54
+ File.expand_path '..', __FILE__
55
+ end
56
+ end
57
+ end
58
+
59
+ require "built/constants"
60
+ require "built/i18n"
61
+ require "built/util"
62
+ require "built/error"
63
+ require "built/client"
64
+ require "built/timestamps"
65
+ require "built/application"
66
+ require "built/class"
67
+ require "built/object"
68
+ require "built/query"
@@ -0,0 +1,43 @@
1
+ module Built
2
+ class Application < Hash
3
+ include Built::Timestamps
4
+
5
+ # Get the uid of this application
6
+ def uid
7
+ self["uid"]
8
+ end
9
+
10
+ # Get the name of this application
11
+ def name
12
+ self["name"]
13
+ end
14
+
15
+ # Get the api_key of this application
16
+ def api_key
17
+ self["api_key"]
18
+ end
19
+
20
+ private
21
+
22
+ def to_s
23
+ "#<Built::Application uid=#{uid}, api_key=#{api_key}>"
24
+ end
25
+
26
+ class << self
27
+ # Get the application you are working with
28
+ # @return [Application]
29
+ def get
30
+ new.merge!(
31
+ Built.client.request(uri)
32
+ .parsed_response["application"]
33
+ )
34
+ end
35
+
36
+ private
37
+
38
+ def uri
39
+ "/applications/myapp" # no longer require a valid uid to get the application
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,55 @@
1
+ module Built
2
+ # Built::Class provides the schema and provides grouping for
3
+ # different classes of objects.
4
+ class Class < Hash
5
+ include Built::Timestamps
6
+
7
+ # Get the uid for this class
8
+ def uid
9
+ self["uid"]
10
+ end
11
+
12
+ # Get the title for this class
13
+ def title
14
+ self["title"]
15
+ end
16
+
17
+ # Is this an inbuilt class, provided by built.io?
18
+ # @return [Boolean]
19
+ def inbuilt_class?
20
+ self["inbuilt_class"] == true
21
+ end
22
+
23
+ private
24
+
25
+ def to_s
26
+ "#<Built::Class uid=#{self["uid"]}, title=#{self["title"]}>"
27
+ end
28
+
29
+ class << self
30
+ # Get all classes from built. Returns an array of classes.
31
+ # @raise Built::BuiltAPIError
32
+ # @return [Array] classes An array of classes
33
+ def get_all
34
+ Built.client.request(uri)
35
+ .parsed_response["classes"].map {|o| new.merge!(o)}
36
+ end
37
+
38
+ # Get a single class by its uid
39
+ # @raise Built::BuiltAPIError
40
+ # @param [String] uid The uid of the class
41
+ # @return [Class] class An instance of Built::Class
42
+ def get(uid)
43
+ new.merge!(
44
+ Built.client.request(uri(uid))
45
+ .parsed_response["class"]
46
+ )
47
+ end
48
+
49
+ # @api private
50
+ def uri(class_uid=nil)
51
+ class_uid ? "/classes/#{class_uid}" : "/classes"
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,46 @@
1
+ module Built
2
+ class Client
3
+ include HTTMultiParty
4
+
5
+ def initialize(options={})
6
+ @api_key = options[:application_api_key]
7
+ @master_key = options[:master_key]
8
+ @host = options[:host]
9
+ @version = options[:version]
10
+ @authtoken = options[:authtoken]
11
+
12
+ # set the base uri
13
+ self.class.base_uri @version ? [@host, @version].join('/') : @host
14
+ end
15
+
16
+ # set the authtoken
17
+ def authtoken=(authtoken)
18
+ @authtoken = authtoken
19
+ end
20
+
21
+ # perform a regular request
22
+ def request(uri, method=:get, body=nil, query=nil, additionalHeaders={})
23
+ options = {}
24
+ options[:query] = query if query
25
+ options[:body] = body.to_json if body
26
+
27
+ options[:headers] = {
28
+ "application_api_key" => @api_key,
29
+ "Content-Type" => "application/json"
30
+ }
31
+
32
+ options[:headers][:authtoken] = @authtoken if @authtoken
33
+ options[:headers][:master_key] = @master_key if @master_key
34
+ options[:headers].merge!(additionalHeaders)
35
+
36
+ response = self.class.send(method, uri, options)
37
+
38
+ if ![200, 201, 204].include?(response.code)
39
+ # error, throw it
40
+ raise BuiltAPIError.new(response.parsed_response)
41
+ end
42
+
43
+ response
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,4 @@
1
+ # constants
2
+ API_URI = "https://api.built.io"
3
+ # we no longer need version strings
4
+ API_VERSION = nil
@@ -0,0 +1,30 @@
1
+ module Built
2
+ # Errors thrown by the library on invalid input
3
+ class BuiltError < StandardError
4
+ end
5
+
6
+ # Errors thrown by the built.io API
7
+ class BuiltAPIError < BuiltError
8
+ attr_accessor :error_code
9
+ attr_accessor :error
10
+ attr_accessor :error_message
11
+
12
+ def initialize(response)
13
+ @response = response
14
+
15
+ if @response
16
+ @error_code = response["error_code"]
17
+ @error = response["error"]
18
+ @error_message = response["error_message"]
19
+ end
20
+
21
+ super("#{@error_code}: #{@error_message}")
22
+ end
23
+
24
+ private
25
+
26
+ def to_s
27
+ @error_message || super
28
+ end
29
+ end
30
+ end
data/lib/built/i18n.rb ADDED
@@ -0,0 +1,3 @@
1
+ I18n.load_path += [File.join(Built.root, "locales", "en.yml")]
2
+ I18n.enforce_available_locales = false
3
+ I18n.default_locale = "en"
@@ -0,0 +1,137 @@
1
+ module Built
2
+ # Built::Object is the unit of data in built.io
3
+ class Object < Hash
4
+ include Built::Timestamps
5
+
6
+ # Get the uid for this object
7
+ def uid
8
+ self["uid"]
9
+ end
10
+
11
+ # Set the uid for this object
12
+ # @param [String] uid A valid object uid
13
+ def uid=(uid)
14
+ self["uid"] = uid
15
+ end
16
+
17
+ # Fetch the latest instance of this object from built
18
+ # @raise BuiltError If the uid is not set
19
+ # @return [Object] self
20
+ def fetch
21
+ if !uid
22
+ # uid is not set
23
+ raise BuiltError, I18n.t("objects.uid_not_set")
24
+ end
25
+
26
+ self.merge!(
27
+ Built.client.request(uri)
28
+ .parsed_response["object"]
29
+ )
30
+
31
+ self
32
+ end
33
+
34
+ # Save / persist the object to built.io
35
+ # @param [Hash] options Options
36
+ # @option options [Boolean] :timeless Perform a timeless update
37
+ # @option options [Boolean] :draft Save the object as draft
38
+ # @raise BuiltAPIError
39
+ # @return [Object] self
40
+ def save(options={})
41
+ if is_new?
42
+ # create
43
+ self.merge!(
44
+ Built.client.request(uri, :post, wrap)
45
+ .parsed_response["object"]
46
+ )
47
+ else
48
+ headers = {}
49
+
50
+ headers[:timeless] = true if options[:timeless]
51
+
52
+ if options[:draft]
53
+ self["published"] = false
54
+ end
55
+
56
+ # update
57
+ self.merge!(
58
+ Built.client.request(uri, :put, wrap, nil, headers)
59
+ .parsed_response["object"]
60
+ )
61
+ end
62
+ end
63
+
64
+ # Delete this object
65
+ # @raise BuiltError If the uid is not set
66
+ # @return [Object] self
67
+ def destroy
68
+ if !uid
69
+ # uid is not set
70
+ raise BuiltError, I18n.t("objects.uid_not_set")
71
+ end
72
+
73
+ Built.client.request(uri, :delete)
74
+
75
+ self.clear
76
+
77
+ self
78
+ end
79
+
80
+ # Get the class in which this object belongs
81
+ # @return [Class] class
82
+ def get_class
83
+ Built::Class.get(@class_uid)
84
+ end
85
+
86
+
87
+ # Is this a new, unsaved object?
88
+ # @return [Boolean]
89
+ def is_new?
90
+ Util.blank?(self["uid"])
91
+ end
92
+
93
+ # Initialize a new object
94
+ # @param [String] class_uid The uid of the class to which this object belongs
95
+ # @param [Hash] data Data to initialize the object with
96
+ def initialize(class_uid, data=nil)
97
+ if !class_uid
98
+ raise BuiltError, I18n.t("objects.class_uid")
99
+ end
100
+
101
+ @class_uid = class_uid
102
+
103
+ if data
104
+ self.merge!(data)
105
+ end
106
+
107
+ self
108
+ end
109
+
110
+ private
111
+
112
+ def uri
113
+ class_uri = Built::Class.uri(@class_uid)
114
+
115
+ uid ?
116
+ [class_uri, "objects/#{uid}"].join("/") :
117
+ [class_uri, "objects"].join("/")
118
+ end
119
+
120
+ def wrap
121
+ {"object" => self}
122
+ end
123
+
124
+ def to_s
125
+ "#<Built::Object uid=#{self["uid"]}, class_uid=#{@class_uid}>"
126
+ end
127
+
128
+ class << self
129
+ # @api private
130
+ def uri(class_uid)
131
+ class_uri = Built::Class.uri(class_uid)
132
+
133
+ [class_uri, "objects"].join("/")
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,285 @@
1
+ module Built
2
+ # Perform a query on objects of a class
3
+ class Query
4
+ attr_accessor :params
5
+
6
+ # Create a new query
7
+ # @param [String] class_uid The uid of the class for querying
8
+ # @example
9
+ # query = Query.new("people")
10
+ #
11
+ # query
12
+ # .containedIn("name", ["James"])
13
+ # .greaterThan("age", 30)
14
+ # .include_count
15
+ #
16
+ # result = query.exec
17
+ #
18
+ # puts result.objects[0]
19
+ # puts result.count
20
+ def initialize(class_uid=nil)
21
+ @class_uid = class_uid
22
+ @params = {
23
+ "query" => {}
24
+ }
25
+ end
26
+
27
+ # Where given key matches value
28
+ # @param [String] key The key on which to search
29
+ # @param [Object] value The value with which to match
30
+ # @return [Query] self
31
+ def where(key, value)
32
+ @params["query"][key] = value
33
+
34
+ self
35
+ end
36
+
37
+ # To check that the key has a value greater than the one specified
38
+ # @param [String] key The key
39
+ # @param [Object] value The value
40
+ # @return [Query] self
41
+ def greater_than(key, value)
42
+ @params["query"][key] = {"$gt" => value}
43
+
44
+ self
45
+ end
46
+
47
+ # To check that the key has a value greater than OR equaling the one specified
48
+ # @param [String] key The key
49
+ # @param [Object] value The value
50
+ # @return [Query] self
51
+ def greater_than_equal(key, value)
52
+ @params["query"][key] = {"$gte" => value}
53
+
54
+ self
55
+ end
56
+
57
+ # To check that the key has a value less than the one specified
58
+ # @param [String] key The key
59
+ # @param [Object] value The value
60
+ # @return [Query] self
61
+ def less_than(key, value)
62
+ @params["query"][key] = {"$lt" => value}
63
+
64
+ self
65
+ end
66
+
67
+ # To check that the key has a value less than OR equaling the one specified
68
+ # @param [String] key The key
69
+ # @param [Object] value The value
70
+ # @return [Query] self
71
+ def less_than_equal(key, value)
72
+ @params["query"][key] = {"$lte" => value}
73
+
74
+ self
75
+ end
76
+
77
+ # To check that the key has a value not equaling the one specified
78
+ # @param [String] key The key
79
+ # @param [Object] value The value
80
+ # @return [Query] self
81
+ def not_equal(key, value)
82
+ @params["query"][key] = {"$ne" => value}
83
+
84
+ self
85
+ end
86
+
87
+ # Sort results in ascending order for the given key
88
+ # @param [String] key The key by which to sort
89
+ # @return [Query] self
90
+ def ascending(key)
91
+ @params["asc"] = key
92
+
93
+ self
94
+ end
95
+
96
+ # Sort results in descending order for the given key
97
+ # @param [String] key The key by which to sort
98
+ # @return [Query] self
99
+ def descending(key)
100
+ @params["desc"] = key
101
+
102
+ self
103
+ end
104
+
105
+ # To check that the value for a key is contained in a given array
106
+ # @param [String] key The key to check
107
+ # @param [Array] array An array of values
108
+ # @return [Query] self
109
+ def contained_in(key, array)
110
+ @params["query"][key] = {"$in" => array}
111
+
112
+ self
113
+ end
114
+
115
+ # To check that the value for a key is NOT contained in a given array
116
+ # @param [String] key The key to check
117
+ # @param [Array] array An array of values
118
+ # @return [Query] self
119
+ def not_contained_in(key, array)
120
+ @params["query"][key] = {"$nin" => array}
121
+
122
+ self
123
+ end
124
+
125
+ # To check that the given key exists
126
+ # @param [String] key
127
+ # @return [Query] self
128
+ def exists(key)
129
+ @params["query"][key] = {"$exists" => true}
130
+
131
+ self
132
+ end
133
+
134
+ # To check that the given key does not exist
135
+ # @param [String] key
136
+ # @return [Query] self
137
+ def not_exists(key)
138
+ @params["query"][key] = {"$exists" => false}
139
+
140
+ self
141
+ end
142
+
143
+ # Reference query a field
144
+ # @param [String] key
145
+ # @param [Query] query
146
+ def in_query(key, query)
147
+ @params["query"][key] = {"$in_query" => query.params["query"]}
148
+
149
+ self
150
+ end
151
+
152
+ # Reference query a field negatively
153
+ # @param [String] key
154
+ # @param [Query] query
155
+ def not_in_query(key, query)
156
+ @params["query"][key] = {"$nin_query" => query.params["query"]}
157
+
158
+ self
159
+ end
160
+
161
+ # Limit the number of results to a given number
162
+ # @param [Number] number
163
+ # @return [Query] self
164
+ def limit(number)
165
+ @params["limit"] = number
166
+
167
+ self
168
+ end
169
+
170
+ # Skip a give number of results
171
+ # @param [Number] number
172
+ # @return [Query] self
173
+ def skip(number)
174
+ @params["skip"] = number
175
+
176
+ self
177
+ end
178
+
179
+ # Return the count of objects instead of the result of the query
180
+ # @return [Query] self
181
+ def count
182
+ @params["count"] = true
183
+
184
+ self
185
+ end
186
+
187
+ # Include the count of objects matching the query in the result
188
+ # @return [Query] self
189
+ def include_count
190
+ @params["include_count"] = true
191
+
192
+ self
193
+ end
194
+
195
+ # Include reference fields in the response (joins)
196
+ # @param [String] key The reference field to include
197
+ # @return [Query] self
198
+ def include(key)
199
+ @params["include"] ||= []
200
+ @params["include"] << key
201
+
202
+ self
203
+ end
204
+
205
+ # Include the owner of the object in the parameter _owner
206
+ # @return [Query] self
207
+ def include_owner
208
+ @params["include_owner"] = true
209
+
210
+ self
211
+ end
212
+
213
+ # Include draft objects that haven't been published yet
214
+ # @return [Query] self
215
+ def include_drafts
216
+ @params["include_unpublished"] = true
217
+
218
+ self
219
+ end
220
+
221
+ # Include the schema of the class in the result
222
+ # @return [Query] self
223
+ def include_schema
224
+ @params["include_schema"] = true
225
+
226
+ self
227
+ end
228
+
229
+ # Execute the query
230
+ # @return [QueryResponse] response A hash containing the response
231
+ def exec
232
+ if !@class_uid
233
+ raise BuiltError, I18n.t("querying.class_uid")
234
+ end
235
+
236
+ uri = Built::Object.uri(@class_uid)
237
+
238
+ QueryResponse.new(
239
+ Built.client.request(uri, :get, nil, @params).parsed_response,
240
+ @class_uid
241
+ )
242
+ end
243
+ end
244
+
245
+ class QueryResponse
246
+ # Get objects in the response
247
+ # @return [Array] objects
248
+ def objects
249
+ @objects
250
+ end
251
+
252
+ # Get the count of objects
253
+ # @return [Number] count
254
+ def count
255
+ @count
256
+ end
257
+
258
+ # Get the included schema
259
+ # @return [Hash] schema
260
+ def schema
261
+ @schema
262
+ end
263
+
264
+ private
265
+
266
+ def initialize(response, class_uid)
267
+ @response = response
268
+
269
+ if response["objects"].is_a?(Array)
270
+ @objects = response["objects"].map {|o| Built::Object.new(class_uid, o)}
271
+ else
272
+ @objects = []
273
+ @count = response["objects"]
274
+ end
275
+
276
+ if response["count"]
277
+ @count = response["count"]
278
+ end
279
+
280
+ if response["schema"]
281
+ @schema = response["schema"]
282
+ end
283
+ end
284
+ end
285
+ end
@@ -0,0 +1,15 @@
1
+ module Built
2
+ module Timestamps
3
+ def created_at
4
+ DateTime.parse self["created_at"]
5
+ end
6
+
7
+ def updated_at
8
+ DateTime.parse self["updated_at"]
9
+ end
10
+
11
+ def deleted_at
12
+ DateTime.parse self["deleted_at"]
13
+ end
14
+ end
15
+ end
data/lib/built/util.rb ADDED
@@ -0,0 +1,7 @@
1
+ module Built
2
+ class Util
3
+ def self.blank?(value)
4
+ value.respond_to?(:empty?) ? value.empty? : !value
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ en:
2
+ waddap: "Welcome to built.io!"
3
+ required_parameter: "%{param} is a required parameter"
4
+ not_initialized: "Library is not initialized"
5
+ objects:
6
+ class_uid: "class_uid needs to be provided when initializing an object"
7
+ uid_not_set: "uid for this object needs to be set before attempting to fetch it"
8
+ querying:
9
+ class_uid: "class_uid needs to be provided to query for objects"
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: built.io
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Suvish Thoovamalayil
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-03-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: i18n
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: httmultiparty
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: ! " built.io is a Backend-as-a-Service (BaaS).\n\n This is a Ruby
47
+ SDK that provides a convenient API.\n"
48
+ email: vishy1618@gmail.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - lib/built/constants.rb
54
+ - lib/built/util.rb
55
+ - lib/built/error.rb
56
+ - lib/built/timestamps.rb
57
+ - lib/built/application.rb
58
+ - lib/built/i18n.rb
59
+ - lib/built/client.rb
60
+ - lib/built/class.rb
61
+ - lib/built/query.rb
62
+ - lib/built/object.rb
63
+ - lib/locales/en.yml
64
+ - lib/built.rb
65
+ - MIT-LICENSE
66
+ - README.md
67
+ homepage: https://github.com/vishy1618/built.io-ruby-sdk
68
+ licenses:
69
+ - MIT
70
+ post_install_message:
71
+ rdoc_options: []
72
+ require_paths:
73
+ - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 1.8.25
89
+ signing_key:
90
+ specification_version: 3
91
+ summary: The built.io Ruby SDK
92
+ test_files: []
93
+ has_rdoc: