lws 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +12 -0
- data/Gemfile +4 -0
- data/Rakefile +18 -0
- data/bin/lwsconsole +64 -0
- data/lib/lws.rb +149 -0
- data/lib/lws/auth.rb +219 -0
- data/lib/lws/generic.rb +72 -0
- data/lib/lws/maps.rb +93 -0
- data/lib/lws/presence.rb +134 -0
- data/lws.gemspec +28 -0
- data/test/test_auth.rb +104 -0
- data/test/test_generic.rb +35 -0
- data/test/test_helper.rb +15 -0
- data/test/test_maps.rb +45 -0
- data/test/test_presence.rb +43 -0
- metadata +135 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# Rakefile with tasks for the LeftClick web services
|
2
|
+
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require "rake/testtask"
|
5
|
+
require "yard"
|
6
|
+
|
7
|
+
Rake::TestTask.new do |t|
|
8
|
+
t.libs << "test" << "lib"
|
9
|
+
t.pattern = "test/test_*.rb"
|
10
|
+
end
|
11
|
+
|
12
|
+
YARD::Rake::YardocTask.new do |t|
|
13
|
+
t.files = ["lib"]
|
14
|
+
t.options = ["--no-private",
|
15
|
+
"--title", "LeftClick Web Services Documentation"]
|
16
|
+
end
|
17
|
+
|
18
|
+
task default: :test
|
data/bin/lwsconsole
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
#
|
3
|
+
# lwsconsole - A command-line tool to access the LWS web services
|
4
|
+
#
|
5
|
+
# Usage: lwsconsole <LWS API token> [<app>:<endpoint> ...]
|
6
|
+
|
7
|
+
require "irb"
|
8
|
+
require "lws"
|
9
|
+
require "pp"
|
10
|
+
|
11
|
+
# Module to allow for start an interfactive session at any point
|
12
|
+
# in a Ruby program.
|
13
|
+
# Source: http://jasonroelofs.com/2009/04/02/embedding-irb-into-your-ruby-application/
|
14
|
+
module IRB
|
15
|
+
def self.start_session(binding)
|
16
|
+
unless @__initialized
|
17
|
+
args = ARGV
|
18
|
+
ARGV.replace(ARGV.dup)
|
19
|
+
IRB.setup(nil)
|
20
|
+
ARGV.replace(args)
|
21
|
+
@__initialized = true
|
22
|
+
end
|
23
|
+
|
24
|
+
workspace = WorkSpace.new(binding)
|
25
|
+
|
26
|
+
irb = Irb.new(workspace)
|
27
|
+
|
28
|
+
@CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
|
29
|
+
@CONF[:MAIN_CONTEXT] = irb.context
|
30
|
+
|
31
|
+
catch(:IRB_EXIT) do
|
32
|
+
irb.eval_input
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Parse the command-line arguments
|
38
|
+
if ARGV.length < 1
|
39
|
+
puts "Usage: #{$0} <LWS API token> [<app>:<endpoint> ...]"
|
40
|
+
exit 1
|
41
|
+
end
|
42
|
+
api_token = ARGV.shift
|
43
|
+
endpoints = {}
|
44
|
+
ARGV.each do |app_endpoint|
|
45
|
+
app,endpoint = app_endpoint.split(':', 2)
|
46
|
+
endpoints[app.to_sym] = endpoint
|
47
|
+
end
|
48
|
+
|
49
|
+
# Set up the API
|
50
|
+
LWS.setup do |config|
|
51
|
+
config.api_token = api_token
|
52
|
+
config.http_debug = true
|
53
|
+
config.json_debug = true
|
54
|
+
config.endpoints = endpoints
|
55
|
+
end
|
56
|
+
|
57
|
+
def reload!
|
58
|
+
LWS.load_app_modules
|
59
|
+
end
|
60
|
+
|
61
|
+
# Use the LWS module as default namespace
|
62
|
+
include LWS
|
63
|
+
|
64
|
+
IRB.start_session(binding)
|
data/lib/lws.rb
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
require "hashie"
|
2
|
+
require "her"
|
3
|
+
require "pp"
|
4
|
+
|
5
|
+
# = Main LeftClick web services module
|
6
|
+
#
|
7
|
+
# This module is the main namespace for the web service/application
|
8
|
+
# libraries that are represented by submodules. The {LWS} module is used
|
9
|
+
# to load, set up and configure the supported application/web service
|
10
|
+
# libraries.
|
11
|
+
module LWS
|
12
|
+
|
13
|
+
# The list of supported apps (web service libraries) loaded by
|
14
|
+
# {.setup}.
|
15
|
+
SUPPORTED_APPS = [:generic, :auth, :maps, :presence]
|
16
|
+
|
17
|
+
# The LWS library version.
|
18
|
+
# @note This is not the API version!
|
19
|
+
VERSION = '0.1.1'
|
20
|
+
|
21
|
+
# @!visibility private
|
22
|
+
class HTTPLogger < Faraday::Response::Middleware
|
23
|
+
|
24
|
+
def call(env)
|
25
|
+
puts ">>> #{env[:method].upcase} #{env[:url].to_s}"
|
26
|
+
env[:request_headers].each do |hdr, val|
|
27
|
+
puts " #{hdr}: #{val}"
|
28
|
+
end
|
29
|
+
puts ">>> #{env[:body] || "nil"}"
|
30
|
+
super
|
31
|
+
end
|
32
|
+
|
33
|
+
def on_complete(env)
|
34
|
+
super
|
35
|
+
puts "<<< HTTP #{env[:status].to_s}"
|
36
|
+
env[:response_headers].each do |hdr, val|
|
37
|
+
puts " #{hdr}: #{val}"
|
38
|
+
end
|
39
|
+
puts "<<< #{env[:body] || "nil"}"
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
# @!visibility private
|
45
|
+
class JSONLogger < Faraday::Response::Middleware
|
46
|
+
|
47
|
+
def on_complete(env)
|
48
|
+
dump = MultiJson.dump(env[:body], pretty: true)
|
49
|
+
dump.split("\n").each { |line| puts "||| #{line}" }
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
# @!visibility private
|
55
|
+
class RequestHeaders < Faraday::Middleware
|
56
|
+
|
57
|
+
def initialize(app, token)
|
58
|
+
super(app)
|
59
|
+
@token = token
|
60
|
+
end
|
61
|
+
|
62
|
+
def call(env)
|
63
|
+
env[:request_headers]["X-Token"] = @token
|
64
|
+
env[:request_headers]["Accept"] = "application/json"
|
65
|
+
@app.call(env)
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
# @return [Config] the API configuration for the web services
|
71
|
+
mattr_reader :config
|
72
|
+
|
73
|
+
# = The API configuration class
|
74
|
+
class Config < Hashie::Dash
|
75
|
+
#@!attribute api_token
|
76
|
+
# @return [String] the API token necessary to gain access
|
77
|
+
property :api_token
|
78
|
+
|
79
|
+
#@!attribute endpoints
|
80
|
+
# @return [Hash{Symbol=>String}] a mapping of application endpoint
|
81
|
+
# overrides
|
82
|
+
property :endpoints, default: {}
|
83
|
+
|
84
|
+
#@!attribute http_debug
|
85
|
+
# @return [Boolean] whether to show HTTP debug messages
|
86
|
+
property :http_debug, default: false
|
87
|
+
|
88
|
+
#@!attribute json_debug
|
89
|
+
# @return [Boolean] whether to show JSON debug messages
|
90
|
+
property :json_debug, default: false
|
91
|
+
end
|
92
|
+
|
93
|
+
# Sets up the application API libraries using the provided
|
94
|
+
# configuration (see {Config}).
|
95
|
+
#
|
96
|
+
# @example Set up LWS with a token, an endpoint override and HTTP debugging
|
97
|
+
# LWS.setup do |config|
|
98
|
+
# config.api_token = "MY_TOKEN"
|
99
|
+
# config.endpoints = { maps: https://maps-dev.leftclick.eu }
|
100
|
+
# config.http_debug = true
|
101
|
+
# end
|
102
|
+
#
|
103
|
+
# @yieldparam [Config] config an API configuration object that can be
|
104
|
+
# configured
|
105
|
+
# @raise if API token is not configured
|
106
|
+
# @return [LWS] the module itself
|
107
|
+
def self.setup(&block)
|
108
|
+
@@config = Config.new
|
109
|
+
yield @@config
|
110
|
+
|
111
|
+
raise "API token is required" if config.api_token.blank?
|
112
|
+
|
113
|
+
load_app_modules
|
114
|
+
|
115
|
+
return self
|
116
|
+
end
|
117
|
+
|
118
|
+
# @!visibility private
|
119
|
+
def self.setup_api(api_url)
|
120
|
+
api = Her::API.new
|
121
|
+
api.setup(url: api_url) do |c|
|
122
|
+
# Request
|
123
|
+
c.use RequestHeaders, config.api_token
|
124
|
+
c.use Faraday::Request::UrlEncoded
|
125
|
+
|
126
|
+
# Response
|
127
|
+
c.use JSONLogger if config.json_debug
|
128
|
+
c.use Her::Middleware::DefaultParseJSON
|
129
|
+
c.use HTTPLogger if config.http_debug
|
130
|
+
|
131
|
+
# Adapter
|
132
|
+
c.use Faraday::Adapter::NetHttp
|
133
|
+
end
|
134
|
+
|
135
|
+
return api
|
136
|
+
end
|
137
|
+
|
138
|
+
# (Re)loads the app modules (usually done by {.setup}).
|
139
|
+
#
|
140
|
+
# @return [Array<Symbol>] the apps that were loaded
|
141
|
+
# (see also {SUPPORTED_APPS})
|
142
|
+
def self.load_app_modules
|
143
|
+
app_module_path = File.dirname(__FILE__)
|
144
|
+
SUPPORTED_APPS.each do |app|
|
145
|
+
load "#{app_module_path}/lws/#{app}.rb"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
end # module LWS
|
data/lib/lws/auth.rb
ADDED
@@ -0,0 +1,219 @@
|
|
1
|
+
# = The auth app module
|
2
|
+
module LWS::Auth
|
3
|
+
|
4
|
+
# The API endpoint for the auth app
|
5
|
+
ENDPOINT = "https://auth.leftclick.eu/" unless defined? ENDPOINT
|
6
|
+
|
7
|
+
# @!visibility private
|
8
|
+
def self.api
|
9
|
+
@@api ||= LWS.setup_api(LWS.config.endpoints[:auth] || ENDPOINT)
|
10
|
+
end
|
11
|
+
|
12
|
+
### Generic classes
|
13
|
+
|
14
|
+
class Configuration < LWS::Generic::Configuration
|
15
|
+
use_api LWS::Auth.api
|
16
|
+
end
|
17
|
+
|
18
|
+
class Task < LWS::Generic::Task
|
19
|
+
use_api LWS::Auth.api
|
20
|
+
end
|
21
|
+
|
22
|
+
### App specific classes
|
23
|
+
|
24
|
+
# = The account class
|
25
|
+
class Account < LWS::Generic::Model
|
26
|
+
use_api LWS::Auth.api
|
27
|
+
|
28
|
+
#@!attribute id [r]
|
29
|
+
# @return [Fixnum] the (unique) ID of the account
|
30
|
+
|
31
|
+
#@!attribute avatar_url
|
32
|
+
# @return [String] the avatar URL of the account
|
33
|
+
|
34
|
+
#@!attribute company
|
35
|
+
# @return [Company] the company that the account belongs to
|
36
|
+
belongs_to :company
|
37
|
+
|
38
|
+
#@!attribute company_id
|
39
|
+
# @return [Fixnum] the ID of the company that the account belongs to
|
40
|
+
|
41
|
+
#@!attribute language
|
42
|
+
# @return [String] the language of the account
|
43
|
+
|
44
|
+
#@!attribute name
|
45
|
+
# @return [String] the name of the account
|
46
|
+
|
47
|
+
#@!attribute created_at
|
48
|
+
# @return [String] the timestamp of when the account was created
|
49
|
+
|
50
|
+
#@!attribute updated_at
|
51
|
+
# @return [String] the timestamp of when the account was last updated
|
52
|
+
|
53
|
+
def initialize(attrs = {})
|
54
|
+
super
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# = The app class
|
59
|
+
class App < LWS::Generic::Model
|
60
|
+
use_api LWS::Auth.api
|
61
|
+
|
62
|
+
#@!attribute id [r]
|
63
|
+
# @return [Fixnum] the (unique) ID of the account
|
64
|
+
|
65
|
+
#@!attribute name
|
66
|
+
# @return [String] the name of the app
|
67
|
+
|
68
|
+
#@!attribute app_key
|
69
|
+
# @return [String] the internal key used for the app
|
70
|
+
|
71
|
+
#@!attribute url
|
72
|
+
# @return [String] the web location of the app
|
73
|
+
|
74
|
+
#@!attribute secret
|
75
|
+
# @return [String] the shared secred used for logging in to the app
|
76
|
+
|
77
|
+
#@!attribute icon
|
78
|
+
# @return [String] the icon ID/name of the app
|
79
|
+
|
80
|
+
#@!attribute created_at
|
81
|
+
# @return [String] the timestamp of when the app was created
|
82
|
+
|
83
|
+
#@!attribute updated_at
|
84
|
+
# @return [String] the timestamp of when the app was last updated
|
85
|
+
|
86
|
+
def initialize(attrs = {})
|
87
|
+
super
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# = The company class
|
92
|
+
class Company < LWS::Generic::Model
|
93
|
+
use_api LWS::Auth.api
|
94
|
+
|
95
|
+
#@!attribute id [r]
|
96
|
+
# @return [Fixnum] the (unique) ID of the company
|
97
|
+
|
98
|
+
#@!attribute address
|
99
|
+
# @return [String] the address of the company
|
100
|
+
|
101
|
+
#@!attribute city
|
102
|
+
# @return [String] the city of the company
|
103
|
+
|
104
|
+
#@!attribute contact_person
|
105
|
+
# @return [Account] the contact person of the company
|
106
|
+
belongs_to :contact_person, class_name: "Account"
|
107
|
+
|
108
|
+
#@!attribute contact_person_id
|
109
|
+
# @return [Fixnum] the ID of the contact person of the company
|
110
|
+
|
111
|
+
#@!attribute country
|
112
|
+
# @return [String] the country of the company
|
113
|
+
|
114
|
+
#@!attribute name
|
115
|
+
# @return [String] the name of the company
|
116
|
+
|
117
|
+
#@!attribute number
|
118
|
+
# @return [String] the street address number of the company
|
119
|
+
|
120
|
+
#@!attribute parent
|
121
|
+
# @return [Company] the parenty company
|
122
|
+
belongs_to :parent, class_name: "Company"
|
123
|
+
|
124
|
+
#@!attribute parent_id
|
125
|
+
# @return [Fixnum] the ID of the parenty company
|
126
|
+
|
127
|
+
#@!attribute zip_code
|
128
|
+
# @return [String] the zip code of the company
|
129
|
+
|
130
|
+
#@!attribute created_at
|
131
|
+
# @return [String] the timestamp of when the company was created
|
132
|
+
|
133
|
+
#@!attribute updated_at
|
134
|
+
# @return [String] the timestamp of when the company was last updated
|
135
|
+
|
136
|
+
def initialize(attrs = {})
|
137
|
+
super
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# = The device class
|
142
|
+
class Device < LWS::Generic::Model
|
143
|
+
use_api LWS::Auth.api
|
144
|
+
|
145
|
+
#@!attribute id [r]
|
146
|
+
# @return [Fixnum] the (unique) ID of the device
|
147
|
+
|
148
|
+
#@!attribute name
|
149
|
+
# @return [String] the name of the device
|
150
|
+
|
151
|
+
#@!attribute account
|
152
|
+
# @return [Account] the account that the device belongs to
|
153
|
+
belongs_to :account
|
154
|
+
|
155
|
+
#@!attribute account_id
|
156
|
+
# @return [Fixnum] the ID of the account that the device belongs to
|
157
|
+
|
158
|
+
#@!attribute created_at
|
159
|
+
# @return [String] the timestamp of when the device was created
|
160
|
+
|
161
|
+
#@!attribute updated_at
|
162
|
+
# @return [String] the timestamp of when the device was last updated
|
163
|
+
|
164
|
+
def initialize(attrs = {})
|
165
|
+
super
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# = The token class
|
170
|
+
class Token < LWS::Generic::Model
|
171
|
+
use_api LWS::Auth.api
|
172
|
+
|
173
|
+
#@!attribute id [r]
|
174
|
+
# @return [Fixnum] the (unique) ID of the token
|
175
|
+
|
176
|
+
#@!attribute name
|
177
|
+
# @return [String] the name of the token
|
178
|
+
|
179
|
+
#@!attribute token
|
180
|
+
# @return [String] the actual token string
|
181
|
+
|
182
|
+
#@!attribute used_on
|
183
|
+
# @return [String] the timestamp the token was last used
|
184
|
+
|
185
|
+
#@!attribute ip_address
|
186
|
+
# @return [String] the location/IP address the token is used on
|
187
|
+
|
188
|
+
#@!attribute user_agent
|
189
|
+
# @return [String] the user agent/browser string when the token was used
|
190
|
+
|
191
|
+
#@!attribute user
|
192
|
+
# @return [Account] the (user) account the token belongs to
|
193
|
+
belongs_to :user, class_name: "Account"
|
194
|
+
|
195
|
+
#@!attribute user_id
|
196
|
+
# @return [Fixnum] the ID of the (user) account the token belongs to
|
197
|
+
|
198
|
+
#@!attribute device
|
199
|
+
# @return [Device] the device the token belongs to
|
200
|
+
belongs_to :device
|
201
|
+
|
202
|
+
#@!attribute device_id
|
203
|
+
# @return [Fixnum] the ID of the device the token belongs to
|
204
|
+
|
205
|
+
#@!attribute expires_on
|
206
|
+
# @return [String] the timestamp the token will (or has) expire(d)
|
207
|
+
|
208
|
+
#@!attribute created_at
|
209
|
+
# @return [String] the timestamp of when the token was created
|
210
|
+
|
211
|
+
#@!attribute updated_at
|
212
|
+
# @return [String] the timestamp of when the token was last updated
|
213
|
+
|
214
|
+
def initialize(attrs = {})
|
215
|
+
super
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
end
|
data/lib/lws/generic.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
# = The generic app module
|
2
|
+
#
|
3
|
+
# This module contains classes that are present in all applications.
|
4
|
+
module LWS::Generic
|
5
|
+
|
6
|
+
# = The generic model class
|
7
|
+
class Model
|
8
|
+
include Her::Model
|
9
|
+
|
10
|
+
include_root_in_json true
|
11
|
+
end
|
12
|
+
|
13
|
+
# = The configuration class
|
14
|
+
class Configuration < Model
|
15
|
+
#@!attribute id [r]
|
16
|
+
# @return [Fixnum] the (unique) ID of the configuration
|
17
|
+
|
18
|
+
#@!attribute key
|
19
|
+
# @return [String] the configuration key
|
20
|
+
|
21
|
+
#@!attribute value
|
22
|
+
# @return [String] the configuration value
|
23
|
+
|
24
|
+
#@!attribute created_at
|
25
|
+
# @return [String] the timestamp of when the configuration was created
|
26
|
+
|
27
|
+
#@!attribute updated_at
|
28
|
+
# @return [String] the timestamp of when the configuration was last updated
|
29
|
+
|
30
|
+
def initialize(attrs = {})
|
31
|
+
super
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# = The task class
|
36
|
+
class Task < Model
|
37
|
+
#@!attribute id [r]
|
38
|
+
# @return [Fixnum] the (unique) ID of the task
|
39
|
+
|
40
|
+
#@!attribute name
|
41
|
+
# @return [String] the name of the task
|
42
|
+
|
43
|
+
#@!attribute interval
|
44
|
+
# @return [Fixnum] the interval in minutes
|
45
|
+
|
46
|
+
#@!attribute function
|
47
|
+
# @return [String] the function to run
|
48
|
+
|
49
|
+
#@!attribute last_ran
|
50
|
+
# @return [String] the time the task was last run
|
51
|
+
|
52
|
+
#@!attribute started
|
53
|
+
# @return [String] the time the task was started
|
54
|
+
|
55
|
+
#@!attribute node_name
|
56
|
+
# @return [String] the name of the node
|
57
|
+
|
58
|
+
#@!attribute pid
|
59
|
+
# @return [String] the process ID of the task
|
60
|
+
|
61
|
+
#@!attribute created_at
|
62
|
+
# @return [String] the timestamp of when the map was created
|
63
|
+
|
64
|
+
#@!attribute updated_at
|
65
|
+
# @return [String] the timestamp of when the map was last updated
|
66
|
+
|
67
|
+
def initialize(attrs = {})
|
68
|
+
super
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
data/lib/lws/maps.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
# = The maps app module
|
2
|
+
module LWS::Maps
|
3
|
+
|
4
|
+
# The API endpoint for the map app
|
5
|
+
ENDPOINT = "https://maps.leftclick.eu/" unless defined? ENDPOINT
|
6
|
+
|
7
|
+
#@!visibility private
|
8
|
+
def self.api
|
9
|
+
@@api ||= LWS.setup_api(LWS.config.endpoints[:maps] || ENDPOINT)
|
10
|
+
end
|
11
|
+
|
12
|
+
### Generic classes
|
13
|
+
|
14
|
+
class Configuration < LWS::Generic::Configuration
|
15
|
+
use_api LWS::Maps.api
|
16
|
+
end
|
17
|
+
|
18
|
+
class Task < LWS::Generic::Task
|
19
|
+
use_api LWS::Maps.api
|
20
|
+
end
|
21
|
+
|
22
|
+
### App specific classes
|
23
|
+
|
24
|
+
# = The map class
|
25
|
+
class Map < LWS::Generic::Model
|
26
|
+
use_api LWS::Maps.api
|
27
|
+
|
28
|
+
#@!attribute id [r]
|
29
|
+
# @return [Fixnum] the (unique) ID of the map
|
30
|
+
|
31
|
+
#@!attribute company
|
32
|
+
# @return [LWS::Auth::Company] the company that maintains/owns the map
|
33
|
+
belongs_to :company, class_name: "LWS::Auth::Company"
|
34
|
+
|
35
|
+
#@!attribute company_id
|
36
|
+
# @return [Fixnum] the ID of the company that maintains/owns the map
|
37
|
+
|
38
|
+
#@!attribute markers
|
39
|
+
# @return [Array<Marker>] the list of associated markers
|
40
|
+
has_many :markers
|
41
|
+
|
42
|
+
#@!attribute name
|
43
|
+
# @return [String] the name of the map
|
44
|
+
|
45
|
+
#@!attribute created_at
|
46
|
+
# @return [String] the timestamp of when the map was created
|
47
|
+
|
48
|
+
#@!attribute updated_at
|
49
|
+
# @return [String] the timestamp of when the map was last updated
|
50
|
+
|
51
|
+
def initialize(attrs = {})
|
52
|
+
super
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# = The map marker class
|
57
|
+
class Marker < LWS::Generic::Model
|
58
|
+
use_api LWS::Maps.api
|
59
|
+
|
60
|
+
#@!attribute id [r]
|
61
|
+
# @return [Fixnum] the (unique) ID of the map marker
|
62
|
+
|
63
|
+
#@!attribute map
|
64
|
+
# @return [Map] the map that the marker is placed on
|
65
|
+
belongs_to :map
|
66
|
+
|
67
|
+
#@!attribute map_id
|
68
|
+
# @return [Fixnum] the ID of the map that the marker is placed on
|
69
|
+
|
70
|
+
#@!attribute name
|
71
|
+
# @return [String] the name of the map marker
|
72
|
+
|
73
|
+
#@attribute lat
|
74
|
+
# @return [String] the latitude of the map marker
|
75
|
+
|
76
|
+
#@attribute long
|
77
|
+
# @return [String] the longitued of the map marker
|
78
|
+
|
79
|
+
#@attribute website
|
80
|
+
# @return [String] the website URL of the map marker
|
81
|
+
|
82
|
+
#@!attribute created_at
|
83
|
+
# @return [String] the timestamp of when the map marker was created
|
84
|
+
|
85
|
+
#@!attribute updated_at
|
86
|
+
# @return [String] the timestamp of when the map marker was last updated
|
87
|
+
|
88
|
+
def initialize(attrs={})
|
89
|
+
super
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
data/lib/lws/presence.rb
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
# = The presence app module
|
2
|
+
module LWS::Presence
|
3
|
+
|
4
|
+
# The API endpoint for the presence app
|
5
|
+
ENDPOINT = "https://presence.leftclick.eu/" unless defined? ENDPOINT
|
6
|
+
|
7
|
+
#@!visibility private
|
8
|
+
def self.api
|
9
|
+
@@api ||= LWS.setup_api(LWS.config.endpoints[:presence] || ENDPOINT)
|
10
|
+
end
|
11
|
+
|
12
|
+
### Generic classes
|
13
|
+
|
14
|
+
class Configuration < LWS::Generic::Configuration
|
15
|
+
use_api LWS::Presence.api
|
16
|
+
end
|
17
|
+
|
18
|
+
class Task < LWS::Generic::Task
|
19
|
+
use_api LWS::Presence.api
|
20
|
+
end
|
21
|
+
|
22
|
+
### App specific classes
|
23
|
+
|
24
|
+
# = The location class
|
25
|
+
class Location < LWS::Generic::Model
|
26
|
+
use_api LWS::Presence.api
|
27
|
+
|
28
|
+
#@!attribute id [r]
|
29
|
+
# @return [Fixnum] the (unique) ID of the location
|
30
|
+
|
31
|
+
#@!attribute name
|
32
|
+
# @return [String] the name of the location
|
33
|
+
|
34
|
+
#@!attribute lat
|
35
|
+
# @return [Float] the latitude of the location
|
36
|
+
|
37
|
+
#@!attribute long
|
38
|
+
# @return [Float] the longitude of the location
|
39
|
+
|
40
|
+
#@!attribute range
|
41
|
+
# @return [Integer] the range around the location in meters
|
42
|
+
|
43
|
+
#@!attribute logoff_time
|
44
|
+
# @return [String] the time everybody is automatically logged off
|
45
|
+
# (format HH:MM)
|
46
|
+
|
47
|
+
#@!attribute company
|
48
|
+
# @return [Auth::Company] the company the location belongs to
|
49
|
+
belongs_to :company, class_name: "LWS::Auth::Company"
|
50
|
+
|
51
|
+
#@!attribute company_id
|
52
|
+
# @return [Fixnum] the ID of the company the location belongs to
|
53
|
+
|
54
|
+
#@!attribute people
|
55
|
+
# @return [Array<Person>] the people associated with the location
|
56
|
+
has_many :people
|
57
|
+
|
58
|
+
#@!attribute created_at
|
59
|
+
# @return [String] the timestamp of when the location was created
|
60
|
+
|
61
|
+
#@!attribute updated_at
|
62
|
+
# @return [String] the timestamp of when the location was last updated
|
63
|
+
|
64
|
+
def initialize(attrs = {})
|
65
|
+
super
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class Person < LWS::Generic::Model
|
70
|
+
use_api LWS::Presence.api
|
71
|
+
|
72
|
+
#@!attribute id [r]
|
73
|
+
# @return [Fixnum] the (unique) ID of the person
|
74
|
+
|
75
|
+
#@!attribute name
|
76
|
+
# @return [String] the name of the person
|
77
|
+
|
78
|
+
#@!attribute udid
|
79
|
+
# @return [String] the unique device ID (e.g. of a mobile phone)
|
80
|
+
# linked to the person
|
81
|
+
|
82
|
+
#@!attribute rfid
|
83
|
+
# @return [String] the RFID tag ID linked to the person
|
84
|
+
|
85
|
+
#@!attribute company
|
86
|
+
# @return [Auth::Company] the company the person belongs to
|
87
|
+
belongs_to :company, class_name: "LWS::Auth::Company"
|
88
|
+
|
89
|
+
#@!attribute company_id
|
90
|
+
# @return [Fixnum] the ID of the company the person belongs to
|
91
|
+
|
92
|
+
#@!attribute lat
|
93
|
+
# @return [Float] the exact latitude of the person's location
|
94
|
+
|
95
|
+
#@!attribute long
|
96
|
+
# @return [Float] the exact longitude of the person's location
|
97
|
+
|
98
|
+
#@!attribute status
|
99
|
+
# @return ["available", "busy", "away", "disabled"] the presence status
|
100
|
+
# of the person
|
101
|
+
|
102
|
+
#@!attribute location
|
103
|
+
# @return [Location] the location the person is located at
|
104
|
+
belongs_to :location
|
105
|
+
|
106
|
+
#@!attribute location_id
|
107
|
+
# @return [Fixnum] the ID of the location the person is located at
|
108
|
+
|
109
|
+
#@!attribute extra_info
|
110
|
+
# @return [String] some extra info for the person
|
111
|
+
|
112
|
+
#@!attribute customer_reference
|
113
|
+
# @return [String] customer specific reference for the person
|
114
|
+
|
115
|
+
#@!attribute ero
|
116
|
+
# @return [Boolean] flag whether the person is emergency response
|
117
|
+
# certified
|
118
|
+
|
119
|
+
#@!attribute picture_url
|
120
|
+
# @return [String] an URL of the picture of the person
|
121
|
+
|
122
|
+
#@!attribute last_sync
|
123
|
+
# @return [String] last time the status was updated via a device or
|
124
|
+
# RFID tag
|
125
|
+
|
126
|
+
#@!attribute created_at
|
127
|
+
# @return [String] the timestamp of when the person was created
|
128
|
+
|
129
|
+
#@!attribute updated_at
|
130
|
+
# @return [String] the timestamp of when the person was last updated
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
data/lws.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
$:.push File.expand_path("lib", __FILE__)
|
3
|
+
require "lws"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "lws"
|
7
|
+
s.version = LWS::VERSION
|
8
|
+
s.authors = ["LeftClick B.V."]
|
9
|
+
s.email = ["gem@leftclick.eu"]
|
10
|
+
s.homepage = "https://leftclick.eu/"
|
11
|
+
s.summary = "LeftClick web services library for Ruby"
|
12
|
+
s.description = %q{This library for Ruby provides access to the LeftClick
|
13
|
+
web services/applications using a model-based structure that abstracts from API calls
|
14
|
+
using the available REST interfaces.}
|
15
|
+
|
16
|
+
s.add_runtime_dependency 'hashie'
|
17
|
+
s.add_runtime_dependency 'her', '~> 0.8.1'
|
18
|
+
|
19
|
+
s.add_development_dependency 'hashie'
|
20
|
+
s.add_development_dependency 'her', '~> 0.8.1'
|
21
|
+
s.add_development_dependency 'minitest'
|
22
|
+
s.add_development_dependency 'rake', '~> 0.9.2'
|
23
|
+
|
24
|
+
s.files = `git ls-files`.split("\n")
|
25
|
+
s.test_files = `git ls-files -- test/*`.split("\n")
|
26
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
27
|
+
s.require_paths = ["lib"]
|
28
|
+
end
|
data/test/test_auth.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class TestAuthAccount < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
include LWS::Auth
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@account = Account.all.first
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_valid_account
|
12
|
+
refute_nil(@account)
|
13
|
+
assert_instance_of(Account, @account)
|
14
|
+
refute_nil(@account.id)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_valid_account_associations
|
18
|
+
assert_instance_of(Company, @account.company)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
class TestAuthApp < MiniTest::Unit::TestCase
|
24
|
+
|
25
|
+
include LWS::Auth
|
26
|
+
|
27
|
+
def setup
|
28
|
+
@app = App.all.first
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_valid_app
|
32
|
+
refute_nil(@app)
|
33
|
+
assert_instance_of(App, @app)
|
34
|
+
refute_nil(@app.id)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
class TestAuthCompany < MiniTest::Unit::TestCase
|
40
|
+
|
41
|
+
include LWS::Auth
|
42
|
+
|
43
|
+
def setup
|
44
|
+
@company = Company.all.last
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_valid_company
|
48
|
+
refute_nil(@company)
|
49
|
+
assert_instance_of(Company, @company)
|
50
|
+
refute_nil(@company.id)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_valid_company_associations
|
54
|
+
assert_instance_of(Account, @company.contact_person)
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
class TestAuthDevice < MiniTest::Unit::TestCase
|
60
|
+
|
61
|
+
include LWS::Auth
|
62
|
+
|
63
|
+
def setup
|
64
|
+
@device = Device.all.first
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_valid_device
|
68
|
+
refute_nil(@device)
|
69
|
+
assert_instance_of(Device, @device)
|
70
|
+
refute_nil(@device.id)
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_valid_device_associations
|
74
|
+
assert_instance_of(Account, @device.account)
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
class TestAuthToken < MiniTest::Unit::TestCase
|
80
|
+
|
81
|
+
include LWS::Auth
|
82
|
+
|
83
|
+
def setup
|
84
|
+
@token = Token.all.first
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_valid_token
|
88
|
+
refute_nil(@token)
|
89
|
+
assert_instance_of(Token, @token)
|
90
|
+
refute_nil(@token.id)
|
91
|
+
assert_equal(@token.token, LWS.config.api_token)
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_valid_token_associations
|
95
|
+
if @token.user.present?
|
96
|
+
assert_instance_of(Account, @token.user)
|
97
|
+
elsif @token.device.present?
|
98
|
+
assert_instance_of(Device, @token.device)
|
99
|
+
else
|
100
|
+
fail "token should be associated with either an account or a device"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class TestGenericConfiguration < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
# Generic class needs to be accessed under some kind of app
|
6
|
+
include LWS::Auth
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@configuration = Configuration.all.first
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_valid_configuration
|
13
|
+
refute_nil(@configuration)
|
14
|
+
assert_instance_of(Configuration, @configuration)
|
15
|
+
refute_nil(@configuration.id)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
class TestGenericTask < MiniTest::Unit::TestCase
|
21
|
+
|
22
|
+
# Generic class needs to be accessed under some kind of app
|
23
|
+
include LWS::Auth
|
24
|
+
|
25
|
+
def setup
|
26
|
+
@task = Task.all.first
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_valid_task
|
30
|
+
refute_nil(@task)
|
31
|
+
assert_instance_of(Task, @task)
|
32
|
+
refute_nil(@task.id)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require "lws"
|
2
|
+
require "minitest/autorun"
|
3
|
+
|
4
|
+
raise "Test token not set" if ENV["LC_LWS_TEST_TOKEN"].blank?
|
5
|
+
|
6
|
+
LWS.setup do |config|
|
7
|
+
config.api_token = ENV["LC_LWS_TEST_TOKEN"]
|
8
|
+
if ENV["LC_LWS_TEST_DEBUG"].present?
|
9
|
+
config.http_debug = true
|
10
|
+
config.json_debug = true
|
11
|
+
end
|
12
|
+
config.endpoints = { auth: "https://auth-dev.leftclick.eu",
|
13
|
+
maps: "https://maps-dev.leftclick.eu",
|
14
|
+
presence: "https://presence-dev.leftclick.eu" }
|
15
|
+
end
|
data/test/test_maps.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class TestMapsMap < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
include LWS::Maps
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@map = Map.all.first
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_valid_map
|
12
|
+
refute_nil(@map)
|
13
|
+
assert_instance_of(Map, @map)
|
14
|
+
refute_nil(@map.id)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_valid_map_associations
|
18
|
+
assert_instance_of(LWS::Auth::Company, @map.company)
|
19
|
+
assert_instance_of(Marker, @map.markers.first)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
class TestMapsMap < MiniTest::Unit::TestCase
|
25
|
+
|
26
|
+
include LWS::Maps
|
27
|
+
|
28
|
+
def setup
|
29
|
+
@map = Map.all.first
|
30
|
+
# Markers only exist as child objects of maps
|
31
|
+
@marker = @map.markers.first
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_valid_map
|
35
|
+
refute_nil(@map)
|
36
|
+
assert_instance_of(Map, @map)
|
37
|
+
refute_nil(@map.id)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_valid_map_associations
|
41
|
+
assert_instance_of(Map, @marker.map)
|
42
|
+
assert_equal(@marker.map, @map)
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class TestPresencePerson < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
include LWS::Presence
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@person = Person.all.first
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_valid_person
|
12
|
+
refute_nil(@person)
|
13
|
+
assert_instance_of(Person, @person)
|
14
|
+
refute_nil(@person.id)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_valid_person_associations
|
18
|
+
assert_instance_of(LWS::Auth::Company, @person.company)
|
19
|
+
assert_instance_of(Location, @person.location)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
class TestPresenceLocation < MiniTest::Unit::TestCase
|
25
|
+
|
26
|
+
include LWS::Presence
|
27
|
+
|
28
|
+
def setup
|
29
|
+
@location = Location.all.first
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_valid_location
|
33
|
+
refute_nil(@location)
|
34
|
+
assert_instance_of(Location, @location)
|
35
|
+
refute_nil(@location.id)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_valid_location_associations
|
39
|
+
assert_instance_of(LWS::Auth::Company, @location.company)
|
40
|
+
assert_instance_of(Person, @location.people.first)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
metadata
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lws
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- LeftClick B.V.
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2016-02-15 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: hashie
|
16
|
+
requirement: &15275000 !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: *15275000
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: her
|
27
|
+
requirement: &15274240 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.8.1
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *15274240
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: hashie
|
38
|
+
requirement: &15273720 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *15273720
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: her
|
49
|
+
requirement: &15273060 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.8.1
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *15273060
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: minitest
|
60
|
+
requirement: &15272520 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *15272520
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: &15271840 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ~>
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 0.9.2
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *15271840
|
80
|
+
description: ! "This library for Ruby provides access to the LeftClick\n web services/applications
|
81
|
+
using a model-based structure that abstracts from API calls\n using the available
|
82
|
+
REST interfaces."
|
83
|
+
email:
|
84
|
+
- gem@leftclick.eu
|
85
|
+
executables:
|
86
|
+
- lwsconsole
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- .gitignore
|
91
|
+
- Gemfile
|
92
|
+
- Rakefile
|
93
|
+
- bin/lwsconsole
|
94
|
+
- lib/lws.rb
|
95
|
+
- lib/lws/auth.rb
|
96
|
+
- lib/lws/generic.rb
|
97
|
+
- lib/lws/maps.rb
|
98
|
+
- lib/lws/presence.rb
|
99
|
+
- lws.gemspec
|
100
|
+
- test/test_auth.rb
|
101
|
+
- test/test_generic.rb
|
102
|
+
- test/test_helper.rb
|
103
|
+
- test/test_maps.rb
|
104
|
+
- test/test_presence.rb
|
105
|
+
homepage: https://leftclick.eu/
|
106
|
+
licenses: []
|
107
|
+
post_install_message:
|
108
|
+
rdoc_options: []
|
109
|
+
require_paths:
|
110
|
+
- lib
|
111
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
114
|
+
- - ! '>='
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
none: false
|
119
|
+
requirements:
|
120
|
+
- - ! '>='
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
requirements: []
|
124
|
+
rubyforge_project:
|
125
|
+
rubygems_version: 1.8.11
|
126
|
+
signing_key:
|
127
|
+
specification_version: 3
|
128
|
+
summary: LeftClick web services library for Ruby
|
129
|
+
test_files:
|
130
|
+
- test/test_auth.rb
|
131
|
+
- test/test_generic.rb
|
132
|
+
- test/test_helper.rb
|
133
|
+
- test/test_maps.rb
|
134
|
+
- test/test_presence.rb
|
135
|
+
has_rdoc:
|