blsk_service_core 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []