blsk_service_core 0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c5fc96d9680eecb5d8c8ce26a877a455023687e87cb5006a67632c39cc9fc1a0
4
+ data.tar.gz: 0d37ac8d7b796e085d0b84fa529d16ae9f16877958ed7c032aa9944921bc88c4
5
+ SHA512:
6
+ metadata.gz: 94766c7d4ab17324ee1ed6f1600ef140ead7cf76c2a1b8d201f70d534a909c73abcf06f31adce7e7abd2906528abd65eda9a782e30d815126eefd4005b9ef565
7
+ data.tar.gz: 7e28e161511f72a40c6904c02fc4580e56fc9dbce48a1a5d44b773df80794b7d7f1a9fbd59402677d36526f8003fe26bebf86bebc65fb2837371fbed5e881524
@@ -0,0 +1,38 @@
1
+ class Application
2
+ def initialize(config_path='', rests=[], services=[])
3
+ @config = get_config(config_path)
4
+ @rests = rests
5
+ end
6
+
7
+ def init_rest_service
8
+ rests = @rests
9
+ return Sinatra.new {
10
+ rests.each {|a| use a}
11
+ not_found do
12
+ ResponseModel
13
+ .new({status: 'FAILED', status_code: 404})
14
+ .error(CommonError::EntityNotFound)
15
+ end
16
+ }
17
+ end
18
+
19
+ def get_config(config_path='')
20
+ file = File.expand_path( config_path )
21
+ unless File.file? file
22
+ file = File.expand_path( File.join File.dirname(__FILE__), "./config.yml" )
23
+ end
24
+
25
+ YAML.load_file(file)
26
+ end
27
+
28
+ def start
29
+ puts 'start'
30
+ Container['application_configuration'].new(@config)
31
+ Container['application_service'].start
32
+ init_rest_service
33
+ end
34
+
35
+ def stop
36
+ Container['application_service'].stop
37
+ end
38
+ end
@@ -0,0 +1,17 @@
1
+ require 'securerandom'
2
+ require_relative 'cassandra/cassandra_configuration'
3
+ require_relative 'consul/consul_configuration'
4
+ require_relative 'rest/rest_configuration'
5
+
6
+ class ApplicationConfiguration < Model
7
+
8
+ attribute :cassandra, CassandraConfiguration
9
+ attribute :consul, ConsulConfiguration
10
+ attribute :rest, RestConfiguration
11
+
12
+ injector
13
+
14
+ def random_name
15
+ "health-check-#{SecureRandom.urlsafe_base64(8)}"
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'consul/consul_service'
2
+ require_relative 'cassandra/cassandra_service'
3
+
4
+ class ApplicationService
5
+ include Inject['consul_service', 'cassandra_service']
6
+
7
+ injector
8
+
9
+ def start
10
+ consul_service.start
11
+ cassandra_service.start
12
+ end
13
+
14
+ def stop
15
+ consul_service.stop
16
+ cassandra_service.stop
17
+ end
18
+ end
File without changes
@@ -0,0 +1,13 @@
1
+ require 'bundler/setup'
2
+ require 'sinatra/base'
3
+ require 'request_store'
4
+ require 'yaml'
5
+
6
+ require_relative 'models/model'
7
+ require_relative 'ioc/injector'
8
+ require_relative 'application_configuration'
9
+ require_relative 'application_service'
10
+ require_relative 'rest/rest_base'
11
+ require_relative 'security/decorators/authenticate'
12
+ require_relative 'validation/decorators/valid'
13
+ require_relative 'application'
@@ -0,0 +1,11 @@
1
+ class CassandraConfiguration < Model
2
+ attribute :hosts, Array.default(['172.16.15.3'])
3
+ attribute :port, Integer.default(9042)
4
+
5
+ # # Sample
6
+ # {
7
+ # hosts: ['172.16.15.3'],
8
+ # port: 9042
9
+ # }
10
+
11
+ end
@@ -0,0 +1,59 @@
1
+ module CassandraDao
2
+ def find_by_id(id=nil, keyspace_name=nil, table_name=nil)
3
+ # puts 'find_by_id'
4
+ if keyspace_name && table_name
5
+ session = cassandra_cluster.connect(keyspace_name)
6
+ result = session.execute("SELECT * FROM #{table_name} WHERE id = ?", arguments: [id])
7
+ end
8
+ end
9
+
10
+ def find_all(keyspace_name=nil, table_name=nil)
11
+ # puts 'find_all'
12
+ if keyspace_name && table_name
13
+ session = cassandra_cluster.connect(keyspace_name)
14
+ result = session.execute("SELECT * FROM #{table_name}")
15
+ end
16
+ end
17
+
18
+ def create(cql_query='', keyspace_name=nil, table_name=nil)
19
+ # puts 'create'
20
+ if keyspace_name && table_name
21
+ session = cassandra_cluster.connect(keyspace_name)
22
+ # Building the cql using 'INSERT INTO' with 'IF NOT EXISTS'
23
+ result = session.execute(cql_query)
24
+ end
25
+ end
26
+
27
+ def update(id=nil, value_hashes={}, keyspace_name=nil, table_name=nil)
28
+ # puts 'update'
29
+ if keyspace_name && table_name
30
+ session = cassandra_cluster.connect(keyspace_name)
31
+ # Building the cql using UPDATE
32
+ result = session.execute(cql_query)
33
+ end
34
+ end
35
+
36
+ def save(value_hashes={}, keyspace_name=nil, table_name=nil)
37
+ # puts 'save'
38
+ if keyspace_name && table_name
39
+ session = cassandra_cluster.connect(keyspace_name)
40
+ # Building the cql using 'INSERT INTO' without 'IF NOT EXISTS'
41
+ result = session.execute(cql_query)
42
+ end
43
+ end
44
+
45
+ def delete(id=nil, keyspace_name=nil, table_name=nil)
46
+ # puts 'delete'
47
+ if keyspace_name && table_name
48
+ session = cassandra_cluster.connect(keyspace_name)
49
+ result = session.execute("DELETE FROM #{table_name} WHERE id = ?", arguments: [id])
50
+ end
51
+ end
52
+
53
+ def run_query(cql_query='', keyspace_name=nil, table_name=nil)
54
+ if keyspace_name && table_name
55
+ session = cassandra_cluster.connect(keyspace_name)
56
+ result = session.execute(cql_query)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,33 @@
1
+ require 'cassandra'
2
+ require 'query_builder'
3
+ require_relative 'cassandra_dao'
4
+
5
+ class CassandraService
6
+ include Inject["application_configuration"]
7
+ include CassandraDao
8
+
9
+ injector
10
+
11
+ attr_accessor :cassandra_cluster
12
+
13
+ def initialize
14
+ # puts 'init cassandra'
15
+ self.cassandra_cluster = Cassandra.cluster(application_configuration.cassandra.attributes)
16
+ end
17
+
18
+ def start
19
+ # puts 'start cassandra, create cluster'
20
+ if !cassandra_cluster
21
+ cassandra_cluster = Cassandra.cluster(application_configuration.cassandra.attributes)
22
+ end
23
+ cassandra_cluster
24
+ end
25
+
26
+ def stop
27
+ # puts 'stop cassandra'
28
+ if cassandra_cluster
29
+ # puts 'closing'
30
+ cassandra_cluster.close
31
+ end
32
+ end
33
+ end
data/src/config.yml ADDED
@@ -0,0 +1,25 @@
1
+ cassandra:
2
+ hosts: []
3
+ port: 9042
4
+ consul:
5
+ port: 8500
6
+ path: "http://localhost"
7
+ consul_service_data:
8
+ name: "Service-1"
9
+ id: "Service1"
10
+ port: 8080
11
+ check:
12
+ id: "bluesky-api"
13
+ name: "HTTP Health Check API on port 8080"
14
+ http: "http://localhost:8080/health-check"
15
+ tls_skip_verify: false
16
+ method: "GET"
17
+ interval: "10s"
18
+ timeout: "1s"
19
+ rest:
20
+ host: 'localhost'
21
+ port: 8080
22
+ path: '/api/v1'
23
+
24
+
25
+
@@ -0,0 +1,53 @@
1
+ class ConsulServiceDataCheck < Model
2
+ attribute :id, String.default("bluesky-api")
3
+ attribute :name, String.default("HTTP Health Check API on port 8080")
4
+ attribute :http, String.default("http://localhost:8080/health-check")
5
+ attribute :tls_skip_verify, Bool.default(false)
6
+ attribute :method, String.default("GET")
7
+ attribute :interval, String.default("10s")
8
+ attribute :timeout, String.default("1s")
9
+
10
+ end
11
+
12
+ class ConsulServiceData < Model
13
+ attribute :name, String.default("Service-1")
14
+ attribute :id, String.default("Service1")
15
+ attribute :port, Integer.default(8080)
16
+ attribute :check, ConsulServiceDataCheck
17
+
18
+ def get_attributes
19
+ {
20
+ name: self.name,
21
+ id: self.id,
22
+ port: self.port,
23
+ check: self.check.attributes
24
+ }
25
+ end
26
+ end
27
+
28
+ class ConsulConfiguration < Model
29
+ attribute :port, Integer.default(8500)
30
+ attribute :path, String.default("http://localhost")
31
+ attribute :consul_service_data, ConsulServiceData
32
+
33
+ # # Sample
34
+ # {
35
+ # port: 8500,
36
+ # path: "http://localhost",
37
+ # consul_service_data: {
38
+ # name: "Service-1",
39
+ # id: "Service1",
40
+ # port: 8080,
41
+ # check: {
42
+ # id: "bluesky-api",
43
+ # name: "HTTP Health Check API on port 8080",
44
+ # http: "http://localhost:8080/health-check",
45
+ # tls_skip_verify: false,
46
+ # method: "GET",
47
+ # interval: "10s",
48
+ # timeout: "1s"
49
+ # }
50
+ # }
51
+ # }
52
+
53
+ end
@@ -0,0 +1,45 @@
1
+ require 'diplomat'
2
+ require_relative 'consul_configuration'
3
+ require_relative '../rest/rest_base'
4
+
5
+ class ConsulService
6
+ # extend ConsulConfiguration
7
+ include Inject["application_configuration"]
8
+
9
+ injector
10
+
11
+ attr_accessor :consul_service_data
12
+
13
+ def initialize(option=nil)
14
+ # puts 'init consul'
15
+ self.consul_service_data = application_configuration.consul.consul_service_data
16
+ end
17
+
18
+ def start
19
+ # puts 'start consul'
20
+ consul_configuration = application_configuration.consul
21
+ consul_service_data = consul_configuration.consul_service_data if consul_service_data.nil?
22
+
23
+ Diplomat.configure do |config|
24
+ # Set up a custom Consul URL
25
+ config.url = "#{consul_configuration.path}:#{consul_configuration.port.to_s}"
26
+ # Set up a custom Faraday Middleware
27
+ # config.middleware = MyCustomMiddleware
28
+ # Connect into consul with custom access token (ACL)
29
+ # config.acl_token = "qwertyui-asdf-zxcv-1234-123456789012"
30
+ # Set extra Faraday configuration options
31
+ # config.options = {ssl: { version: :TLSv1_2 }}
32
+ end
33
+ Diplomat::Service.register(consul_service_data.get_attributes)
34
+
35
+ # start url for consul to check health
36
+ consul_check_route = "/" + consul_service_data.check.http.split('/').last
37
+ RestBase.start_consul_check_http(consul_check_route)
38
+ end
39
+
40
+ def stop
41
+ # puts 'stop consul'
42
+ consul_service_id = application_configuration.consul.consul_service_data.id
43
+ Diplomat::Service.deregister(consul_service_id)
44
+ end
45
+ end
@@ -0,0 +1,5 @@
1
+ require "dry-container"
2
+ require "dry-auto_inject"
3
+
4
+ Container = Dry::Container.new
5
+ Inject = Dry::AutoInject(Container)
@@ -0,0 +1,54 @@
1
+ require_relative "container"
2
+ require "dry/inflector"
3
+
4
+ Inflector = Dry::Inflector.new
5
+
6
+ def injector name = nil
7
+ name = name.nil? ? self.name[0, 1].downcase + self.name[1..-1] : name
8
+ Container.register(Inflector.underscore(name), self.extend(Injector).new)
9
+ end
10
+
11
+ module Injector
12
+ @@decorators = Hash.new
13
+
14
+ def decorators
15
+ @@decorators
16
+ end
17
+
18
+ def decorate name, decorators
19
+ if @@decorators[name].nil?
20
+ @@decorators[name] = []
21
+ end
22
+ @@decorators[name] = {:is_processed => false, :decorators => decorators}
23
+ end
24
+
25
+ def method_added(name)
26
+ super
27
+ orig_method = instance_method(name)
28
+ decorators = self.decorators[name]
29
+ return if decorators.nil? || decorators[:is_processed] == true
30
+
31
+ if private_method_defined?(name);
32
+ visibility = :private
33
+ elsif protected_method_defined?(name);
34
+ visibility = :protected
35
+ else
36
+ visibility = :public
37
+ end
38
+
39
+ decorators[:is_processed] = true
40
+ define_method(name) do |*args, &blk|
41
+ decorators[:decorators].each do |decor|
42
+ decor.call(self, *args, &blk)
43
+ end
44
+ orig_method.bind(self).call(*args, &blk)
45
+ end
46
+
47
+ case visibility
48
+ when :protected;
49
+ protected name
50
+ when :private;
51
+ private name
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,28 @@
1
+ require 'dry-types'
2
+ require 'dry-struct'
3
+ require 'dry-validation'
4
+
5
+ class Model < Dry::Struct
6
+ include Dry::Types.module
7
+ transform_keys(&:to_sym)
8
+
9
+ @@validation_schema
10
+
11
+ def self.validates &blk
12
+ @@validation_schema = Dry::Validation.Schema &blk
13
+ end
14
+
15
+ def validate
16
+ @@validation_schema.call(attributes).messages
17
+ end
18
+
19
+ def to clazz
20
+ new_attributes = attributes.merge(clazz.different_attributes(attributes, self.class))
21
+ clazz.new new_attributes
22
+ end
23
+
24
+ def to_json
25
+ attributes
26
+ end
27
+
28
+ end
@@ -0,0 +1,29 @@
1
+ module CommonError
2
+ class InvalidToken < Exception
3
+ # Status Code 401
4
+ def initialize(msg = 'InvalidToken')
5
+ super
6
+ end
7
+ end
8
+
9
+ class PermissionDenied < Exception
10
+ # Status Code 403
11
+ def initialize(msg = 'PermissionDenied')
12
+ super
13
+ end
14
+ end
15
+
16
+ class EntityNotFound < Exception
17
+ # Status Code 404
18
+ def initialize(msg = 'EntityNotFound')
19
+ super
20
+ end
21
+ end
22
+
23
+ class InvalidData < Exception
24
+ # Status Code 422
25
+ def initialize(msg = 'InvalidData')
26
+ super
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,14 @@
1
+ class ResponseModel < Model
2
+ attribute :status, String.optional
3
+ attribute :status_code, Integer.optional
4
+
5
+ def success(data=nil)
6
+ attributes[:data] = data unless data.nil?
7
+ attributes
8
+ end
9
+
10
+ def error(exception_class, errors=nil)
11
+ attributes[:errors] = errors if !errors.nil? && errors.any?
12
+ RestApplication.init_and_raise_error(exception_class, self.status_code, attributes)
13
+ end
14
+ end
@@ -0,0 +1,30 @@
1
+ require 'sinatra/base'
2
+ require "sinatra/namespace"
3
+
4
+ class RestApplication < Sinatra::Base
5
+ set :server, :puma
6
+ disable :raise_errors
7
+ disable :show_exceptions
8
+
9
+ set :dump_errors, true
10
+ set :show_exceptions, :after_handler
11
+
12
+ register Sinatra::Namespace
13
+
14
+ configure :production do
15
+ # ...
16
+ end
17
+
18
+ configure :development do
19
+ # ...
20
+ end
21
+
22
+ # for handling error
23
+ def self.init_and_raise_error(exception_class, status_code, response_model)
24
+ error exception_class do
25
+ status status_code
26
+ response_model
27
+ end
28
+ raise exception_class
29
+ end
30
+ end
@@ -0,0 +1,56 @@
1
+ require_relative 'rest_application'
2
+ require_relative 'errors/common_error'
3
+ require_relative 'models/response_model'
4
+
5
+
6
+ class RestBase < RestApplication
7
+ before '/*' do
8
+ # puts 'before routes - set local thread'
9
+ RequestStore.store[:user] = "Nhuan Lai" #get the user by access_token
10
+
11
+ if request.env['CONTENT_TYPE'] == 'application/json'
12
+ body_content = JSON.load(request.body)
13
+ request.params[:body] = JSON.parse( body_content ) unless body_content.nil?
14
+ end
15
+ end
16
+
17
+ after '/*' do
18
+ response.body = response.body.to_json
19
+ end
20
+
21
+ # Health Check for Consul, run when start Consul
22
+ def self.start_consul_check_http(url)
23
+ get url do
24
+ 'The service is healthy!'
25
+ end
26
+ end
27
+
28
+ # # Example API route
29
+ # namespace Container["application_configuration"].rest.path do
30
+ # get '/seed_1' do
31
+ # 'Seed 1 API'
32
+ # end
33
+ # get '/seed_2' do
34
+ # 'Seed 2 API'
35
+ # end
36
+ # end
37
+
38
+ # # Example for handling response
39
+ # get '/health' do
40
+ # # success case
41
+ # ResponseModel
42
+ # .new({status: 'OK', status_code: 200})
43
+ # .success
44
+ # # error case
45
+ # errors = [
46
+ # {
47
+ # field: 'error field',
48
+ # code: 'error code',
49
+ # message: 'error message'
50
+ # }
51
+ # ]
52
+ # ResponseModel
53
+ # .new({status: 'FAILED', status_code: 422})
54
+ # .error(CommonError::InvalidData, errors)
55
+ # end
56
+ end
@@ -0,0 +1,13 @@
1
+ class RestConfiguration < Model
2
+ attribute :host, String.default('localhost')
3
+ attribute :port, Integer.default(8080)
4
+ attribute :path, String.default('/api/v1')
5
+
6
+ # Sample
7
+ # {
8
+ # host: 'localhost',
9
+ # port: 8080,
10
+ # path: '/api/v1'
11
+ # }
12
+
13
+ end
@@ -0,0 +1,28 @@
1
+ require_relative '../../rest/rest_base'
2
+ require_relative '../security_context_holder'
3
+
4
+ module Authenticator
5
+ def has_roles roles
6
+ lambda {|*args, &blk|
7
+ # puts 'has_roles'
8
+ check_role = true # check role here and return true/false
9
+ if check_role
10
+ true
11
+ else
12
+ false
13
+ end
14
+ }
15
+ end
16
+
17
+ def authenticate isAuthorized
18
+ lambda {|self_model, *args, &blk|
19
+ # puts "isAuthorized"
20
+ # check authentication and authorization here, then return true/false
21
+ if isAuthorized.call(*args, &blk)
22
+ true
23
+ else
24
+ raise CommonError::PermissionDenied
25
+ end
26
+ }
27
+ end
28
+ end
@@ -0,0 +1,5 @@
1
+ class SecurityContextHolder
2
+ def self.get_user
3
+ RequestStore.store[:user]
4
+ end
5
+ end
@@ -0,0 +1,37 @@
1
+ require_relative '../../rest/rest_base'
2
+
3
+ module Validator
4
+ def validate params={}
5
+ lambda {|self_model, *args, &blk|
6
+ # puts "Validate"
7
+ seed_model = args[0]
8
+ self_rest = args [1]
9
+ valid_result = check_validate(seed_model, self_rest) # check validation and return [true]/[false, errors]
10
+ if valid_result[0]
11
+ true
12
+ else
13
+ ResponseModel
14
+ .new({status: 'FAILED', status_code: 422})
15
+ .error(CommonError::InvalidData, valid_result[1])
16
+ end
17
+ }
18
+ end
19
+
20
+ def check_validate(seed_model, self_rest)
21
+ errors = seed_model.validate
22
+ if errors.empty?
23
+ [true]
24
+ else
25
+ errors_response = convert_errors_response(errors)
26
+ [false, errors_response, self_rest]
27
+ end
28
+ end
29
+
30
+ def convert_errors_response(error_list)
31
+ errors = []
32
+ error_list.each do |key, value|
33
+ errors << {field: key, message: value}
34
+ end
35
+ errors
36
+ end
37
+ end
metadata ADDED
@@ -0,0 +1,305 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: blsk_service_core
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - blsk
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-06-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-system
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.10.0
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.10.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: 0.10.0
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.10.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: sinatra
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 2.0.1
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 2.0.1
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: 2.0.1
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 2.0.1
53
+ - !ruby/object:Gem::Dependency
54
+ name: sinatra-contrib
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: 2.0.1
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 2.0.1
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 2.0.1
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 2.0.1
73
+ - !ruby/object:Gem::Dependency
74
+ name: puma
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: 3.11.4
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 3.11.4
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 3.11.4
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 3.11.4
93
+ - !ruby/object:Gem::Dependency
94
+ name: cassandra-driver
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: 3.2.2
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 3.2.2
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 3.2.2
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 3.2.2
113
+ - !ruby/object:Gem::Dependency
114
+ name: query_builder
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: 0.0.4
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: 0.0.4
123
+ type: :runtime
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: 0.0.4
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: 0.0.4
133
+ - !ruby/object:Gem::Dependency
134
+ name: request_store
135
+ requirement: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: 1.4.1
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: 1.4.1
143
+ type: :runtime
144
+ prerelease: false
145
+ version_requirements: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - "~>"
148
+ - !ruby/object:Gem::Version
149
+ version: 1.4.1
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 1.4.1
153
+ - !ruby/object:Gem::Dependency
154
+ name: dry-validation
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 0.12.0
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: 0.12.0
163
+ type: :runtime
164
+ prerelease: false
165
+ version_requirements: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - "~>"
168
+ - !ruby/object:Gem::Version
169
+ version: 0.12.0
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: 0.12.0
173
+ - !ruby/object:Gem::Dependency
174
+ name: bundler
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: 1.16.2
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: 1.16.2
183
+ type: :development
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
188
+ - !ruby/object:Gem::Version
189
+ version: 1.16.2
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: 1.16.2
193
+ - !ruby/object:Gem::Dependency
194
+ name: rake-test
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - "~>"
198
+ - !ruby/object:Gem::Version
199
+ version: 1.0.0
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: 1.0.0
203
+ type: :development
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: 1.0.0
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: 1.0.0
213
+ - !ruby/object:Gem::Dependency
214
+ name: rake
215
+ requirement: !ruby/object:Gem::Requirement
216
+ requirements:
217
+ - - "~>"
218
+ - !ruby/object:Gem::Version
219
+ version: 2.5.0
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: 2.5.0
223
+ type: :development
224
+ prerelease: false
225
+ version_requirements: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: 2.5.0
230
+ - - ">="
231
+ - !ruby/object:Gem::Version
232
+ version: 2.5.0
233
+ - !ruby/object:Gem::Dependency
234
+ name: rspec
235
+ requirement: !ruby/object:Gem::Requirement
236
+ requirements:
237
+ - - "~>"
238
+ - !ruby/object:Gem::Version
239
+ version: 3.7.0
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: 3.7.0
243
+ type: :development
244
+ prerelease: false
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - "~>"
248
+ - !ruby/object:Gem::Version
249
+ version: 3.7.0
250
+ - - ">="
251
+ - !ruby/object:Gem::Version
252
+ version: 3.7.0
253
+ description: Code Skeleton for BLSK Service Core
254
+ email: support@blsk.com
255
+ executables: []
256
+ extensions: []
257
+ extra_rdoc_files: []
258
+ files:
259
+ - src/application.rb
260
+ - src/application_configuration.rb
261
+ - src/application_service.rb
262
+ - src/application_status.rb
263
+ - src/bluesky_service_core.rb
264
+ - src/cassandra/cassandra_configuration.rb
265
+ - src/cassandra/cassandra_dao.rb
266
+ - src/cassandra/cassandra_service.rb
267
+ - src/config.yml
268
+ - src/consul/consul_configuration.rb
269
+ - src/consul/consul_service.rb
270
+ - src/ioc/container.rb
271
+ - src/ioc/injector.rb
272
+ - src/models/model.rb
273
+ - src/rest/errors/common_error.rb
274
+ - src/rest/models/response_model.rb
275
+ - src/rest/rest_application.rb
276
+ - src/rest/rest_base.rb
277
+ - src/rest/rest_configuration.rb
278
+ - src/security/decorators/authenticate.rb
279
+ - src/security/security_context_holder.rb
280
+ - src/validation/decorators/valid.rb
281
+ homepage: http://rubygems.org/gems/blsk_service_core
282
+ licenses:
283
+ - MIT
284
+ metadata: {}
285
+ post_install_message:
286
+ rdoc_options: []
287
+ require_paths:
288
+ - src
289
+ required_ruby_version: !ruby/object:Gem::Requirement
290
+ requirements:
291
+ - - ">="
292
+ - !ruby/object:Gem::Version
293
+ version: 2.3.0
294
+ required_rubygems_version: !ruby/object:Gem::Requirement
295
+ requirements:
296
+ - - ">="
297
+ - !ruby/object:Gem::Version
298
+ version: '0'
299
+ requirements: []
300
+ rubyforge_project:
301
+ rubygems_version: 2.7.7
302
+ signing_key:
303
+ specification_version: 4
304
+ summary: BLSK Service Core
305
+ test_files: []