built.io 0.7 → 0.8

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/lib/built/acl.rb ADDED
@@ -0,0 +1,196 @@
1
+ module Built
2
+ class ACL
3
+ attr_accessor :disabled
4
+ attr_accessor :others
5
+ attr_accessor :users
6
+ attr_accessor :roles
7
+
8
+ def initialize(data)
9
+ data ||= {}
10
+
11
+ @disabled = data["disable"] == true
12
+ @others = data["others"] || {}
13
+ @users = data["users"] || []
14
+ @roles = data["roles"] || []
15
+ @can = data["can"] || []
16
+ end
17
+
18
+ # Disable / Enable ACL ============================
19
+
20
+ # Is the ACL disabled?
21
+ # @return [Boolean]
22
+ def is_disabled?
23
+ @disabled
24
+ end
25
+
26
+ # Disable the ACL
27
+ def disable
28
+ @disabled = true
29
+ end
30
+
31
+ # Enable the ACL
32
+ def enable
33
+ @disabled = false
34
+ end
35
+
36
+ # ACL can =========================================
37
+
38
+ # Can the current user update this object?
39
+ def can_update?
40
+ !!@can.find {|x| x == "update"}
41
+ end
42
+
43
+ # Can the current user delete this object?
44
+ def can_delete?
45
+ !!@can.find {|x| x == "delete"}
46
+ end
47
+
48
+ # Can others? =====================================
49
+
50
+ # Read permission for others
51
+ # @return [Boolean]
52
+ def can_others_read?
53
+ @others["read"]
54
+ end
55
+
56
+ # Update permission for others
57
+ # @return [Boolean]
58
+ def can_others_update?
59
+ @others["update"]
60
+ end
61
+
62
+ # Update permission for others
63
+ # @return [Boolean]
64
+ def can_others_delete?
65
+ @others["delete"]
66
+ end
67
+
68
+ # Set others ======================================
69
+
70
+ # Set read permission for others
71
+ # @param [Boolean]
72
+ def others_read(bool)
73
+ @others["read"] = bool
74
+ end
75
+
76
+ # Set update permission for others
77
+ # @param [Boolean]
78
+ def others_update(bool)
79
+ @others["update"] = bool
80
+ end
81
+
82
+ # Set delete permission for others
83
+ # @param [Boolean]
84
+ def others_delete(bool)
85
+ @others["delete"] = bool
86
+ end
87
+
88
+ # Can users? ======================================
89
+
90
+ # Get read permission for user
91
+ def can_user_read?(user)
92
+ can_user_op(user, "read")
93
+ end
94
+
95
+ # Get update permission for user
96
+ def can_user_update?(user)
97
+ can_user_op(user, "update")
98
+ end
99
+
100
+ # Get delete permission for user
101
+ def can_user_delete?(user)
102
+ can_user_op(user, "delete")
103
+ end
104
+
105
+ # Can roles? ======================================
106
+
107
+ # Get read permission for role
108
+ def can_role_read?(role)
109
+ can_role_op(role, "read")
110
+ end
111
+
112
+ # Get update permission for role
113
+ def can_role_update?(role)
114
+ can_role_op(role, "update")
115
+ end
116
+
117
+ # Get delete permission for role
118
+ def can_role_delete?(role)
119
+ can_role_op(role, "delete")
120
+ end
121
+
122
+ # Set users =======================================
123
+
124
+ # Set read permission for the user
125
+ def user_read(user, bool)
126
+ user_op(user, "read", bool)
127
+ end
128
+
129
+ # Set update permission for the user
130
+ def user_update(user, bool)
131
+ user_op(user, "update", bool)
132
+ end
133
+
134
+ # Set delete permission for the user
135
+ def user_delete(user, bool)
136
+ user_op(user, "delete", bool)
137
+ end
138
+
139
+ # Set roles =======================================
140
+
141
+ # Set read permission for the role
142
+ def role_read(role, bool)
143
+ role_op(role, "read", bool)
144
+ end
145
+
146
+ # Set update permission for the role
147
+ def role_update(role, bool)
148
+ role_op(role, "update", bool)
149
+ end
150
+
151
+ # Set delete permission for the role
152
+ def role_delete(role, bool)
153
+ role_op(role, "delete", bool)
154
+ end
155
+
156
+ private
157
+
158
+ def to_s
159
+ "#<Built::ACL disabled=#{disabled}>"
160
+ end
161
+
162
+ def user_op(user, op, bool)
163
+ elem_op(@users, user, op, bool)
164
+ end
165
+
166
+ def role_op(role, op, bool)
167
+ elem_op(@roles, role, op, bool)
168
+ end
169
+
170
+ def elem_op(store, elem, op, bool)
171
+ uid = elem.is_a?(String) ? elem : elem.uid
172
+
173
+ if acl = store.find {|u| u == uid}
174
+ acl[op] = bool
175
+ else
176
+ store << {"uid" => uid, op => bool}
177
+ end
178
+ end
179
+
180
+ def can_role_op(role, op)
181
+ can_elem_op(@roles, role, op)
182
+ end
183
+
184
+ def can_user_op(user, op)
185
+ can_elem_op(@users, user, op)
186
+ end
187
+
188
+ def can_elem_op(store, elem, op)
189
+ uid = elem.is_a?(String) ? elem : elem.uid
190
+
191
+ acl = store.find {|u| u == uid} || {}
192
+
193
+ acl[op]
194
+ end
195
+ end
196
+ end
@@ -36,7 +36,7 @@ module Built
36
36
  def get
37
37
  instantiate(
38
38
  Built.client.request(uri)
39
- .parsed_response["application"]
39
+ .json["application"]
40
40
  )
41
41
  end
42
42
 
data/lib/built/class.rb CHANGED
@@ -39,7 +39,7 @@ module Built
39
39
  # @return [Array] classes An array of classes
40
40
  def get_all
41
41
  Built.client.request(uri)
42
- .parsed_response["classes"].map {|o| instantiate(o)}
42
+ .json["classes"].map {|o| instantiate(o)}
43
43
  end
44
44
 
45
45
  # Get a single class by its uid
@@ -49,7 +49,7 @@ module Built
49
49
  def get(uid)
50
50
  instantiate(
51
51
  Built.client.request(uri(uid))
52
- .parsed_response["class"]
52
+ .json["class"]
53
53
  )
54
54
  end
55
55
 
data/lib/built/client.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  module Built
2
2
  class Client
3
- include HTTMultiParty
3
+ attr_accessor :authtoken
4
+ attr_accessor :current_user
4
5
 
5
6
  def initialize(options={})
6
7
  @api_key = options[:application_api_key]
@@ -10,37 +11,64 @@ module Built
10
11
  @authtoken = options[:authtoken]
11
12
 
12
13
  # 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
14
+ @base_uri = @version ? [@host, @version].join('/') : @host
19
15
  end
20
16
 
21
17
  # perform a regular request
22
18
  def request(uri, method=:get, body=nil, query=nil, additionalHeaders={})
23
19
  options = {}
24
- options[:query] = query if query
25
- options[:body] = body.to_json if body
20
+ options[:url] = @base_uri + uri
21
+ options[:method] = method
26
22
 
27
23
  options[:headers] = {
28
24
  "application_api_key" => @api_key,
29
25
  "Content-Type" => "application/json"
30
26
  }
31
27
 
28
+ options[:headers][:params] = query if query
29
+
32
30
  options[:headers][:authtoken] = @authtoken if @authtoken
33
31
  options[:headers][:master_key] = @master_key if @master_key
34
32
  options[:headers].merge!(additionalHeaders)
35
33
 
36
- response = self.class.send(method, uri, options)
34
+ if body
35
+ is_json = options[:headers]["Content-Type"] == "application/json"
36
+ options[:payload] = is_json ? body.to_json : body
37
+ unless is_json
38
+ options[:headers].delete("Content-Type")
39
+ end
40
+ end
41
+
42
+ begin
43
+ response = Response.new(RestClient::Request.execute(options))
44
+ rescue => e
45
+ response = Response.new(e.response)
46
+ end
37
47
 
38
- if ![200, 201, 204].include?(response.code)
48
+ if !(200..299).include?(response.code)
39
49
  # error, throw it
40
- raise BuiltAPIError.new(response.parsed_response)
50
+ raise BuiltAPIError.new(response.json)
41
51
  end
42
52
 
43
53
  response
44
54
  end
45
55
  end
56
+
57
+ class Response
58
+ attr_reader :raw
59
+ attr_reader :code
60
+ attr_reader :body
61
+ attr_reader :headers
62
+
63
+ def initialize(response)
64
+ @raw = response
65
+ @code = response.code
66
+ @body = response.body
67
+ @headers = response.headers
68
+ end
69
+
70
+ def json
71
+ JSON.parse @body
72
+ end
73
+ end
46
74
  end
@@ -1,4 +1,9 @@
1
1
  # constants
2
- API_URI = "https://api.built.io"
2
+ Built::API_URI = "https://api.built.io"
3
3
  # we no longer need version strings
4
- API_VERSION = nil
4
+ Built::API_VERSION = nil
5
+ # where location is stored in the object
6
+ Built::LOCATION_PATH = "__loc"
7
+ Built::USER_CLASS_UID = "built_io_application_user"
8
+ Built::ROLE_CLASS_UID = "built_io_application_user_role"
9
+ Built::INST_CLASS_UID = "built_io_installation_data"
data/lib/built/error.rb CHANGED
@@ -6,7 +6,7 @@ module Built
6
6
  # Errors thrown by the built.io API
7
7
  class BuiltAPIError < BuiltError
8
8
  attr_accessor :error_code
9
- attr_accessor :error
9
+ attr_accessor :errors
10
10
  attr_accessor :error_message
11
11
 
12
12
  def initialize(response)
@@ -14,7 +14,7 @@ module Built
14
14
 
15
15
  if @response
16
16
  @error_code = response["error_code"]
17
- @error = response["error"]
17
+ @errors = response["errors"]
18
18
  @error_message = response["error_message"]
19
19
  end
20
20
 
@@ -0,0 +1,4 @@
1
+ module Built
2
+ class Installation < Built::Object
3
+ end
4
+ end
@@ -0,0 +1,72 @@
1
+ module Built
2
+ # This is used to specify a long/lat pair in built.io
3
+ class Location
4
+ attr_accessor :long
5
+ attr_accessor :lat
6
+
7
+ # Create a new Location object
8
+ # @param [Float] long Longitude of the location
9
+ # @param [Float] lat Latitude of the location
10
+ # @return [Location] location A new location
11
+ def initialize(long, lat)
12
+ Util.type_check("long", long, Float)
13
+ Util.type_check("lat", lat, Float)
14
+
15
+ @long = long
16
+ @lat = lat
17
+ end
18
+
19
+ # Distance in meters from a certain location
20
+ # @param [Location] location The location
21
+ # @return [Integer] distance in meters
22
+ def metersFrom(location)
23
+ Util.type_check("location", location, Location)
24
+
25
+ haversine(location.lat, location.long, lat, long, 1000)
26
+ end
27
+
28
+ # Distance in kilometers from a certain location
29
+ # @param [Location] location The location
30
+ # @return [Integer] distance in kilometers
31
+ def kilometersFrom(location)
32
+ Util.type_check("location", location, Location)
33
+
34
+ haversine(location.lat, location.long, lat, long, 1)
35
+ end
36
+
37
+ # Convert this into an array of [long, lat]
38
+ # @return [Array<Float, Float>]
39
+ def to_arr
40
+ [long, lat]
41
+ end
42
+
43
+ private
44
+
45
+ def to_s
46
+ "#<Built::Object long=#{long}, lat=#{lat}>"
47
+ end
48
+
49
+ def power(num, pow)
50
+ num ** pow
51
+ end
52
+
53
+ def haversine(lat1, long1, lat2, long2, factor)
54
+ dtor = Math::PI/180
55
+ r = 6378.14*factor
56
+
57
+ rlat1 = lat1 * dtor
58
+ rlong1 = long1 * dtor
59
+ rlat2 = lat2 * dtor
60
+ rlong2 = long2 * dtor
61
+
62
+ dlon = rlong1 - rlong2
63
+ dlat = rlat1 - rlat2
64
+
65
+ a = power(Math::sin(dlat/2), 2) + Math::cos(rlat1) * Math::cos(rlat2) * power(Math::sin(dlon/2), 2)
66
+ c = 2 * Math::atan2(Math::sqrt(a), Math::sqrt(1-a))
67
+ d = r * c
68
+
69
+ return d.ceil
70
+ end
71
+ end
72
+ end