virtuaservices 0.1.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.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/lib/virtuaservices.rb +11 -0
  3. data/lib/virtuaservices/account.rb +72 -0
  4. data/lib/virtuaservices/authentication.rb +7 -0
  5. data/lib/virtuaservices/authentication/session.rb +28 -0
  6. data/lib/virtuaservices/concerns.rb +13 -0
  7. data/lib/virtuaservices/concerns/activable.rb +18 -0
  8. data/lib/virtuaservices/concerns/diagnosticable.rb +22 -0
  9. data/lib/virtuaservices/concerns/enumerable.rb +44 -0
  10. data/lib/virtuaservices/concerns/mime_typable.rb +36 -0
  11. data/lib/virtuaservices/concerns/premiumable.rb +15 -0
  12. data/lib/virtuaservices/concerns/sluggable.rb +27 -0
  13. data/lib/virtuaservices/concerns/typable.rb +17 -0
  14. data/lib/virtuaservices/monitoring.rb +12 -0
  15. data/lib/virtuaservices/monitoring/action.rb +25 -0
  16. data/lib/virtuaservices/monitoring/gateway.rb +37 -0
  17. data/lib/virtuaservices/monitoring/instance.rb +36 -0
  18. data/lib/virtuaservices/monitoring/route.rb +36 -0
  19. data/lib/virtuaservices/monitoring/service.rb +37 -0
  20. data/lib/virtuaservices/monitoring/websocket.rb +25 -0
  21. data/lib/virtuaservices/oauth.rb +7 -0
  22. data/lib/virtuaservices/oauth/application.rb +33 -0
  23. data/lib/virtuaservices/permissions.rb +10 -0
  24. data/lib/virtuaservices/permissions/category.rb +15 -0
  25. data/lib/virtuaservices/permissions/group.rb +30 -0
  26. data/lib/virtuaservices/permissions/right.rb +19 -0
  27. data/lib/virtuaservices/specs.rb +89 -0
  28. data/lib/virtuaservices/utils.rb +10 -0
  29. data/lib/virtuaservices/utils/controllers.rb +8 -0
  30. data/lib/virtuaservices/utils/controllers/base.rb +193 -0
  31. data/lib/virtuaservices/utils/controllers/checked.rb +14 -0
  32. data/lib/virtuaservices/utils/errors.rb +12 -0
  33. data/lib/virtuaservices/utils/errors/bad_request.rb +14 -0
  34. data/lib/virtuaservices/utils/errors/forbidden.rb +14 -0
  35. data/lib/virtuaservices/utils/errors/http_error.rb +30 -0
  36. data/lib/virtuaservices/utils/errors/not_found.rb +14 -0
  37. data/lib/virtuaservices/utils/loaders.rb +7 -0
  38. data/lib/virtuaservices/utils/loaders/heroku.rb +20 -0
  39. data/lib/virtuaservices/utils/micro_service.rb +170 -0
  40. data/lib/virtuaservices/utils/seeder.rb +25 -0
  41. data/lib/virtuaservices/version.rb +3 -0
  42. metadata +321 -0
@@ -0,0 +1,14 @@
1
+ module Arkaan
2
+ module Utils
3
+ module Controllers
4
+ # Base controller to handle the standard error when accessing the API.
5
+ # @author Vincent Courtois <courtois.vincenet@outlook.com>
6
+ class Checked < Arkaan::Utils::Controllers::Base
7
+
8
+ before do
9
+ before_checks
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ module Arkaan
2
+ module Utils
3
+ # Module gathering all the exception classes used throughout the utils module, mainly linked to HTTP errors.
4
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
5
+ module Errors
6
+ autoload :BadRequest, 'arkaan/utils/errors/bad_request'
7
+ autoload :Forbidden , 'arkaan/utils/errors/forbidden'
8
+ autoload :NotFound , 'arkaan/utils/errors/not_found'
9
+ autoload :HTTPError , 'arkaan/utils/errors/http_error'
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ module Arkaan
2
+ module Utils
3
+ module Errors
4
+ # A bad request error is raised when the data given to a model makes this model invalid.
5
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
6
+ class BadRequest < Arkaan::Utils::Errors::HTTPError
7
+
8
+ def initialize(action:, field:, error:)
9
+ super(action, field, error, 400)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module Arkaan
2
+ module Utils
3
+ module Errors
4
+ # A forbidden error occurs when a user tries to perform an action he's not allowed to.
5
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
6
+ class Forbidden < Arkaan::Utils::Errors::HTTPError
7
+
8
+ def initialize (field:, action:, error:)
9
+ super(action, field, error, 403)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,30 @@
1
+ module Arkaan
2
+ module Utils
3
+ module Errors
4
+ # Standard class parent to all specialized http errors.
5
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
6
+ class HTTPError < StandardError
7
+
8
+ # @!attribute [rw] field
9
+ # @return [String, Symbol] the name of the field in error in the model.
10
+ attr_accessor :field
11
+ # @!attribute [rw] action
12
+ # @return [String] the name of the action the user was trying to perform on the model (often crate or update).
13
+ attr_accessor :action
14
+ # @attribute [rw] error
15
+ # @return [String] the label of the error returned by the model.
16
+ attr_accessor :error
17
+ # @attribute [rw] status
18
+ # @return [Integer] the HTTP status code as a number (eg: 400, 422 or 500)
19
+ attr_accessor :status
20
+
21
+ def initialize (action, field, error, status)
22
+ @action = action
23
+ @field = field.to_s
24
+ @error = error
25
+ @status = status
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,14 @@
1
+ module Arkaan
2
+ module Utils
3
+ module Errors
4
+ # A not found error occurs when a user tries to reach a resource that does not exist.
5
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
6
+ class NotFound < Arkaan::Utils::Errors::HTTPError
7
+
8
+ def initialize (field:, action:, error:)
9
+ super(action, field, error, 404)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,7 @@
1
+ module Arkaan
2
+ module Utils
3
+ module Loaders
4
+ autoload :Heroku, 'arkaaan/utils/loaders/heroku'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,20 @@
1
+ module Arkaan
2
+ module Utils
3
+ module Plugins
4
+ class Heroku
5
+ # Loads the heroku informations inside the data of the instance.
6
+ # @param instance [Arkaan::Monitoring::Instance] the instance to put the enrichment inside.
7
+ def self.load!(instance)
8
+ if !ENV['OAUTH_TOKEN'].nil? && instance != false && instance.persisted?
9
+ heroku = PlatformAPI.connect_oauth(ENV['OAUTH_TOKEN'])
10
+ regex = /\Ahttps?:\/\/([a-z\-]+).herokuapp.com\/?\z/
11
+ if instance.url.match(regex)
12
+ app_name = instance.url.scan(regex).first.first
13
+ instance.update_attribute(:data, heroku.app.info(app_name))
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,170 @@
1
+ module Arkaan
2
+ module Utils
3
+ # This class is a singleton to load and save parameters for the whole application.
4
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
5
+ class MicroService
6
+ include Singleton
7
+
8
+ # @!attribute [r] name
9
+ # @return [String] the name of the service you want to load.
10
+ attr_reader :service
11
+ # @!attribute [r] location
12
+ # @return [String] the path to the file loading the whole application, used to deduce the loading paths.
13
+ attr_reader :location
14
+ # @!attribute [r] name
15
+ # @return [String] the name of the service, used later to instantiate it when the mongoid configuration is fully loaded.
16
+ attr_reader :name
17
+ # @!attribute [r] instance
18
+ # @return [Arkaan::Monitoring::Instance] the instance of the service currently deployed.
19
+ attr_reader :instance
20
+ # @!attribute [r] type
21
+ # @return [Symbol] the type of instance the application is declaring
22
+ attr_reader :type
23
+
24
+ def initialize
25
+ @location = false
26
+ @service = false
27
+ @instance = false
28
+ @name = false
29
+ @type = ENV['INSTANCE_TYPE'] || :heroku
30
+ @controller_classes = []
31
+ end
32
+
33
+ def get_controllers
34
+ return [] if defined?(Controllers).nil?
35
+ classes = Controllers.constants.map { |symbol| get_const(symbol) }
36
+ return classes.select { |symbol| symbol.is_a? Class }
37
+ end
38
+
39
+ def get_const(symbol)
40
+ return Object.const_get("Controllers::#{symbol.to_s}")
41
+ end
42
+
43
+ # Determines if the application can be loaded (all the parameters have been correctly set)
44
+ # @return [Boolean] TRUE if the application can be safely loaded, FALSE otherwise.
45
+ def loadable?
46
+ return !!(service && location)
47
+ end
48
+
49
+ # Getter for the path on which the service is mapped.
50
+ # @return [String, Boolean] the absolute path in the URL on which the service is mapped upon, or FALSE if it's not set already.
51
+ def path
52
+ return service ? service.path : false
53
+ end
54
+
55
+ # Look for the service and sets it if it's found in the database, or set it to nil if not found.
56
+ # @param [String] service_name - the name of the service to look for in the database.
57
+ # @return [Arkaan::utils::MicroService] the instance of the micro-service to chain other calls.
58
+ def register_as(service_name)
59
+ @name = service_name
60
+ return self
61
+ end
62
+
63
+ # Sets the location of the file calling the micro service and initializing it so that it's used as root.
64
+ # @param filename [String] the full naame of the file with the extension.
65
+ # @return [Arkaan::utils::MicroService] the instance of the micro-service to chain other calls.
66
+ def from_location(filename)
67
+ @location = File.dirname(filename)
68
+ return self
69
+ end
70
+
71
+ # Loads the application in standard (production/development) mode, without the test files.
72
+ # @return [Arkaan::utils::MicroService] the instance of the micro-service to chain other calls.
73
+ def in_standard_mode
74
+ return load_application(test_mode: false)
75
+ end
76
+
77
+ # Loads the application in test mode, by adding the needed files to run the test suite to the standard loading process.
78
+ # @return [Arkaan::utils::MicroService] the instance of the micro-service to chain other calls.
79
+ def in_test_mode
80
+ @location = File.join(location, '..')
81
+ return load_application(test_mode: true)
82
+ end
83
+
84
+ # Loads the application as a websockets service. Only the websockets application should use that.
85
+ # @return [Arkaan::utils::MicroService] the instance of the micro-service to chain other calls.
86
+ def in_websocket_mode
87
+ load_mongoid_configuration
88
+ load_standard_files
89
+
90
+ Arkaan::Monitoring::Websocket.find_or_create_by(url: ENV['WEBSOCKET_URL']).save
91
+ return self
92
+ end
93
+
94
+ # Deactivates the current instance and the associated service if no more instances are available.
95
+ def deactivate!
96
+ instance.update_attribute(:running, false)
97
+ service.update_attribute(:test_mode, false) if ENV['TEST_MODE']
98
+ end
99
+
100
+ private
101
+
102
+ # Registers the service in the database if it has not been created already.
103
+ def register_service
104
+ @service = Arkaan::Monitoring::Service.create(key: @name, path: "/#{@name}")
105
+ end
106
+
107
+ # Register the instance of the currently deployed service in the database.
108
+ # @return [Arkaan::Monitoring::Instance] the instance of the micro service currently running.
109
+ def register_instance
110
+ @instance = @service.instances.where(url: ENV['SERVICE_URL']).first
111
+ if @instance.nil?
112
+ @instance = Arkaan::Monitoring::Instance.create(service: @service, url: ENV['SERVICE_URL'], type: type)
113
+ end
114
+ @instance.update_attribute(:running, true)
115
+ return @instance
116
+ end
117
+
118
+ # Loads the configuration for Mongoid, the files of the application, and registers the service and the instance in the database.
119
+ # @param test_mode [Boolean] TRUE to run in test mode (from /spec), FALSE otherwise.
120
+ # @return [Arkaan::Utils::MicroService] the current instance of the micro service to chain other calls.
121
+ def load_application(test_mode: false)
122
+ Dotenv.load
123
+ load_mongoid_configuration(test_mode: test_mode)
124
+ if !!(@name && location)
125
+ @service = Arkaan::Monitoring::Service.where(key: @name).first
126
+ register_service if @service.nil?
127
+ if ENV['TEST_MODE']
128
+ @service.update_attribute(:test_mode, true)
129
+ end
130
+ register_instance
131
+ load_plugin!
132
+ if service
133
+ load_standard_files
134
+ load_test_files if test_mode
135
+ end
136
+ end
137
+ return self
138
+ end
139
+
140
+ def load_plugin!
141
+ plugin = ENV['ADDITIONAL_PLUGIN']
142
+ if !plugin.nil? && Arkaan::Utils::Plugins.constants.include?(plugin)
143
+ Arkaan::Utils::Plugins.const_get(plugin).load!(@instance)
144
+ end
145
+ end
146
+
147
+ def load_mongoid_configuration(test_mode: false)
148
+ environment = test_mode ? 'test' : (ENV['RACK_ENV'] || 'development')
149
+ Mongoid.load!('config/mongoid.yml', environment)
150
+ end
151
+
152
+ def load_standard_files
153
+ require_folder('decorators')
154
+ require_folder('services')
155
+ require_folder('controllers')
156
+ end
157
+
158
+ def load_test_files
159
+ require_folder('spec', 'support')
160
+ require_folder('spec', 'shared')
161
+ end
162
+
163
+ def require_folder(*folders)
164
+ Dir[File.join(location, folders, '**', '*.rb')].each do |filename|
165
+ require filename
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,25 @@
1
+ module Arkaan
2
+ module Utils
3
+ # This class loads the necessary data in the database if they don't exist yet.
4
+ # @author Vincent Courtois <courtois.vincent@outlook.com>
5
+ class Seeder
6
+ include Singleton
7
+
8
+ # Creates the service if it does not exist, and the instance if it does not exist.
9
+ # @return [Arkaan::Monitoring::Service] the created, or found, service corresponding to this micro-service.
10
+ def create_service(key)
11
+ service = Arkaan::Monitoring::Service.where(key: key).first
12
+
13
+ if service.nil?
14
+ service = Arkaan::Monitoring::Service.create!(key: key, path: "/#{key}", premium: true, active: true)
15
+ end
16
+
17
+ if service.instances.where(url: ENV['SERVICE_URL']).first.nil?
18
+ Arkaan::Monitoring::Instance.create!(url: ENV['SERVICE_URL'], running: true, service: service, active: true)
19
+ end
20
+
21
+ return service
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,3 @@
1
+ module Virtuaservices
2
+ VERSION = '0.1.0'
3
+ end
metadata ADDED
@@ -0,0 +1,321 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: virtuaservices
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Vincent Courtois
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-07-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 3.6.0
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 3.6.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec-json_expectations
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 2.1.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 2.1.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rack-test
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.7.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.7.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: factory_bot
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 5.0.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 5.0.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: database_cleaner
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 1.6.1
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 1.6.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 0.15.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 0.15.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: yard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 0.9.20
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.9.20
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 0.11.1
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '='
123
+ - !ruby/object:Gem::Version
124
+ version: 0.11.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: mongoid
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '='
130
+ - !ruby/object:Gem::Version
131
+ version: 7.0.1
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '='
137
+ - !ruby/object:Gem::Version
138
+ version: 7.0.1
139
+ - !ruby/object:Gem::Dependency
140
+ name: activemodel
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '='
144
+ - !ruby/object:Gem::Version
145
+ version: 5.1.4
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '='
151
+ - !ruby/object:Gem::Version
152
+ version: 5.1.4
153
+ - !ruby/object:Gem::Dependency
154
+ name: activesupport
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '='
158
+ - !ruby/object:Gem::Version
159
+ version: 5.1.4
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '='
165
+ - !ruby/object:Gem::Version
166
+ version: 5.1.4
167
+ - !ruby/object:Gem::Dependency
168
+ name: bcrypt
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: 3.1.11
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '='
179
+ - !ruby/object:Gem::Version
180
+ version: 3.1.11
181
+ - !ruby/object:Gem::Dependency
182
+ name: sinatra
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - '='
186
+ - !ruby/object:Gem::Version
187
+ version: 2.0.2
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - '='
193
+ - !ruby/object:Gem::Version
194
+ version: 2.0.2
195
+ - !ruby/object:Gem::Dependency
196
+ name: sinatra-contrib
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - '='
200
+ - !ruby/object:Gem::Version
201
+ version: 2.0.2
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - '='
207
+ - !ruby/object:Gem::Version
208
+ version: 2.0.2
209
+ - !ruby/object:Gem::Dependency
210
+ name: platform-api
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - '='
214
+ - !ruby/object:Gem::Version
215
+ version: 2.1.0
216
+ type: :runtime
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - '='
221
+ - !ruby/object:Gem::Version
222
+ version: 2.1.0
223
+ - !ruby/object:Gem::Dependency
224
+ name: faraday
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - '='
228
+ - !ruby/object:Gem::Version
229
+ version: 0.15.2
230
+ type: :runtime
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - '='
235
+ - !ruby/object:Gem::Version
236
+ version: 0.15.2
237
+ - !ruby/object:Gem::Dependency
238
+ name: dotenv
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - '='
242
+ - !ruby/object:Gem::Version
243
+ version: 2.7.2
244
+ type: :runtime
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - '='
249
+ - !ruby/object:Gem::Version
250
+ version: 2.7.2
251
+ description: This application is the generic base to handle elements like servers,
252
+ users, and sessions.
253
+ email: courtois.vincent@outlook.com
254
+ executables: []
255
+ extensions: []
256
+ extra_rdoc_files: []
257
+ files:
258
+ - lib/virtuaservices.rb
259
+ - lib/virtuaservices/account.rb
260
+ - lib/virtuaservices/authentication.rb
261
+ - lib/virtuaservices/authentication/session.rb
262
+ - lib/virtuaservices/concerns.rb
263
+ - lib/virtuaservices/concerns/activable.rb
264
+ - lib/virtuaservices/concerns/diagnosticable.rb
265
+ - lib/virtuaservices/concerns/enumerable.rb
266
+ - lib/virtuaservices/concerns/mime_typable.rb
267
+ - lib/virtuaservices/concerns/premiumable.rb
268
+ - lib/virtuaservices/concerns/sluggable.rb
269
+ - lib/virtuaservices/concerns/typable.rb
270
+ - lib/virtuaservices/monitoring.rb
271
+ - lib/virtuaservices/monitoring/action.rb
272
+ - lib/virtuaservices/monitoring/gateway.rb
273
+ - lib/virtuaservices/monitoring/instance.rb
274
+ - lib/virtuaservices/monitoring/route.rb
275
+ - lib/virtuaservices/monitoring/service.rb
276
+ - lib/virtuaservices/monitoring/websocket.rb
277
+ - lib/virtuaservices/oauth.rb
278
+ - lib/virtuaservices/oauth/application.rb
279
+ - lib/virtuaservices/permissions.rb
280
+ - lib/virtuaservices/permissions/category.rb
281
+ - lib/virtuaservices/permissions/group.rb
282
+ - lib/virtuaservices/permissions/right.rb
283
+ - lib/virtuaservices/specs.rb
284
+ - lib/virtuaservices/utils.rb
285
+ - lib/virtuaservices/utils/controllers.rb
286
+ - lib/virtuaservices/utils/controllers/base.rb
287
+ - lib/virtuaservices/utils/controllers/checked.rb
288
+ - lib/virtuaservices/utils/errors.rb
289
+ - lib/virtuaservices/utils/errors/bad_request.rb
290
+ - lib/virtuaservices/utils/errors/forbidden.rb
291
+ - lib/virtuaservices/utils/errors/http_error.rb
292
+ - lib/virtuaservices/utils/errors/not_found.rb
293
+ - lib/virtuaservices/utils/loaders.rb
294
+ - lib/virtuaservices/utils/loaders/heroku.rb
295
+ - lib/virtuaservices/utils/micro_service.rb
296
+ - lib/virtuaservices/utils/seeder.rb
297
+ - lib/virtuaservices/version.rb
298
+ homepage: https://rubygems.org/gems/virtuaservices
299
+ licenses:
300
+ - MIT
301
+ metadata: {}
302
+ post_install_message:
303
+ rdoc_options: []
304
+ require_paths:
305
+ - lib
306
+ required_ruby_version: !ruby/object:Gem::Requirement
307
+ requirements:
308
+ - - ">="
309
+ - !ruby/object:Gem::Version
310
+ version: '0'
311
+ required_rubygems_version: !ruby/object:Gem::Requirement
312
+ requirements:
313
+ - - ">="
314
+ - !ruby/object:Gem::Version
315
+ version: '0'
316
+ requirements: []
317
+ rubygems_version: 3.0.3
318
+ signing_key:
319
+ specification_version: 4
320
+ summary: A generic SaaS platform
321
+ test_files: []