blsk_ruby_core_api 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b721ef1d8a5eaef37b577d5a7a427fb3dfe87b642121a7579fd58017efb8a78d
4
+ data.tar.gz: 1f30040cc47ca66a9bfe9a659c8368c0117413ff53fa065e497566ba179520a7
5
+ SHA512:
6
+ metadata.gz: 3f645661d54265e9048a044e043d4a10f31a247bab81e0ca4d87d87fd440ef23a20f6f07a1e56a495e03b8996fe4ed641e8a42a1ec335fd2d5434babdc473a28
7
+ data.tar.gz: 76b5a3f77fb9b8233f1883bdf19b799bf3d262a993921e5d248472f85b58f236233cb968ec810abc973f0aa70a38c203160775acd7c669595ed535c30a0fb18b
@@ -0,0 +1,20 @@
1
+ require_relative 'consul/consul_service'
2
+ require_relative 'cassandra/cassandra_service'
3
+
4
+ class AppService
5
+ include Inject['consul_service', 'cassandra_service']
6
+
7
+ injector
8
+
9
+ def start
10
+ puts 'start app_service'
11
+ consul_service.start
12
+ cassandra_service.start
13
+ end
14
+
15
+ def stop
16
+ puts 'stop app_service'
17
+ consul_service.stop
18
+ cassandra_service.stop
19
+ end
20
+ end
@@ -0,0 +1,46 @@
1
+ require 'securerandom'
2
+
3
+ module ApplicationConfiguration
4
+ def config
5
+ {
6
+ rest: config_rest,
7
+ consul: config_consul
8
+ }
9
+ end
10
+
11
+ def config_consul
12
+ config_consul = {
13
+ port: 8500,
14
+ path: "http://localhost",
15
+ consul_service_data: {
16
+ name: "Service-1",
17
+ id: "Service1",
18
+ port: 9292,
19
+ check: {
20
+ id: "bluesky-api",
21
+ name: "HTTP Health Check API on port 9292",
22
+ http: "http://localhost:9292/health-check-new",
23
+ tls_skip_verify: false,
24
+ method: "GET",
25
+ interval: "10s",
26
+ timeout: "1s"
27
+ }
28
+ }
29
+ }
30
+ config_consul[:consul_service_data][:port] = config_rest[:port]
31
+ config_consul[:consul_service_data][:check][:http] = "http://#{config_rest[:host]}:#{config_rest[:port].to_s}/#{random_name}"
32
+ config_consul
33
+ end
34
+
35
+ def config_rest
36
+ config_rest = {
37
+ host: 'localhost',
38
+ port: 9292,
39
+ path: '/api/v1'
40
+ }
41
+ end
42
+
43
+ def random_name
44
+ "health-check-#{SecureRandom.urlsafe_base64(8)}"
45
+ end
46
+ end
@@ -0,0 +1,40 @@
1
+ require 'bundler/setup'
2
+ require 'sinatra/base'
3
+ require 'request_store'
4
+
5
+ require_relative 'application_configuration'
6
+ require_relative 'app_service'
7
+ require_relative 'rest/rest_service'
8
+ require_relative 'decoractors/authenticate'
9
+ require_relative 'decoractors/valid'
10
+ # Dir["#{File.dirname(__FILE__)}/**/*.rb"].each {|file| require file }
11
+
12
+
13
+ class Application
14
+ extend ApplicationConfiguration
15
+
16
+ def initialize(rests=[], config={})
17
+ @config = config
18
+ @rests = rests
19
+ end
20
+
21
+ def init_rest_service
22
+ rests = @rests
23
+ return Sinatra.new {
24
+ rests.each {|a| use a}
25
+ not_found do
26
+ JSON RestService.error_response('EntityNotFound')
27
+ end
28
+ }
29
+ end
30
+
31
+ def start
32
+ puts 'start'
33
+ Container['app_service'].start
34
+ init_rest_service
35
+ end
36
+
37
+ def stop
38
+ Container['app_service'].stop
39
+ end
40
+ end
@@ -0,0 +1,52 @@
1
+ module AbstractedCassandraRepository
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(value_hashes={}, keyspace_name=nil, table_name=nil)
19
+ puts 'create'
20
+ if keyspace_name && table_name
21
+ session = cassandra_cluster.connect(keyspace_name)
22
+ cql = '' # Building the cql using 'INSERT INTO' with 'IF NOT EXISTS'
23
+ result = session.execute(cql)
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
+ cql = '' # Building the cql using UPDATE
32
+ result = session.execute(cql)
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
+ cql = '' # Building the cql using 'INSERT INTO' without 'IF NOT EXISTS'
41
+ result = session.execute(cql)
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
+ end
@@ -0,0 +1,32 @@
1
+ require 'cassandra'
2
+ require_relative '../ioc/injector'
3
+ require_relative 'abstracted_cassandra_repository'
4
+
5
+ class CassandraService
6
+ include ::AbstractedCassandraRepository
7
+
8
+ injector
9
+
10
+ attr_accessor :cassandra_cluster
11
+
12
+ def initialize
13
+ puts 'init cassandra'
14
+ self.cassandra_cluster = Cassandra.cluster
15
+ end
16
+
17
+ def start
18
+ puts 'start cassandra, create cluster'
19
+ if !cassandra_cluster
20
+ cassandra_cluster = Cassandra.cluster
21
+ end
22
+ cassandra_cluster
23
+ end
24
+
25
+ def stop
26
+ puts 'stop cassandra'
27
+ if cassandra_cluster
28
+ puts 'closing'
29
+ cassandra_cluster.close
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,39 @@
1
+ require 'diplomat'
2
+
3
+ module ConsulConfiguration
4
+ extend ApplicationConfiguration
5
+
6
+ CONFIG = {
7
+ port: 8500,
8
+ path: "http://localhost",
9
+ consul_service_data: {
10
+ name: "Service-1",
11
+ id: "Service1",
12
+ port: 9292,
13
+ check: {
14
+ id: "bluesky-api",
15
+ name: "HTTP Health Check API on port 9292",
16
+ http: "http://localhost:9292/health-check",
17
+ tls_skip_verify: false,
18
+ method: "GET",
19
+ interval: "10s",
20
+ timeout: "1s"
21
+ }
22
+ }
23
+ }.merge( ConsulConfiguration.config_consul )
24
+
25
+ def configure
26
+ Diplomat.configure do |config|
27
+ # Set up a custom Consul URL
28
+ config.url = "#{CONFIG[:path]}:#{CONFIG[:port].to_s}"
29
+ # Set up a custom Faraday Middleware
30
+ # config.middleware = MyCustomMiddleware
31
+ # Connect into consul with custom access token (ACL)
32
+ # config.acl_token = "qwertyui-asdf-zxcv-1234-123456789012"
33
+ # Set extra Faraday configuration options
34
+ # config.options = {ssl: { version: :TLSv1_2 }}
35
+ end
36
+
37
+ CONFIG[:consul_service_data]
38
+ end
39
+ end
@@ -0,0 +1,33 @@
1
+ require 'diplomat'
2
+ require_relative '../ioc/injector'
3
+ require_relative 'consul_configuration'
4
+ require_relative '../rest/rest_service'
5
+
6
+ class ConsulService
7
+ extend ConsulConfiguration
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 = ConsulService.configure
16
+ end
17
+
18
+ def start
19
+ puts 'start consul'
20
+ consul_service_data = ConsulConfiguration::CONFIG[:consul_service_data] if consul_service_data.nil?
21
+ Diplomat::Service.register(consul_service_data)
22
+
23
+ # start url for consul to check health
24
+ consul_check_route = "/" + consul_service_data[:check][:http].split('/').last
25
+ RestService.start_consul_check_http(consul_check_route)
26
+ end
27
+
28
+ def stop
29
+ puts 'stop consul'
30
+ consul_service_id = self.consul_service_data.try(:id) || ConsulConfiguration::CONFIG[:consul_service_data][:id]
31
+ Diplomat::Service.deregister(consul_service_id)
32
+ end
33
+ end
@@ -0,0 +1,28 @@
1
+ require_relative '../rest/rest_service'
2
+ require_relative '../security/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,23 @@
1
+ require_relative '../rest/rest_service'
2
+
3
+ module Validator
4
+ def validate params={}
5
+ lambda {|self_model, *args, &blk|
6
+ puts "Validate"
7
+ check_validate = self_model.check_validate(*args, &blk) # check validation and return [true]/[false, errors]
8
+ if check_validate[0]
9
+ true
10
+ else
11
+ check_validate[2].response_with_error(CommonError::InvalidData, check_validate[1])
12
+ end
13
+ }
14
+ end
15
+
16
+ def convert_errors_response(error_list)
17
+ errors = []
18
+ error_list.each do |key, value|
19
+ errors << {field: key, message: value}
20
+ end
21
+ errors
22
+ end
23
+ 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,25 @@
1
+ module CommonError
2
+ class InvalidToken < Exception
3
+ def initialize(msg = 'InvalidToken')
4
+ super
5
+ end
6
+ end
7
+
8
+ class PermissionDenied < Exception
9
+ def initialize(msg = 'PermissionDenied')
10
+ super
11
+ end
12
+ end
13
+
14
+ class EntityNotFound < Exception
15
+ def initialize(msg = 'EntityNotFound')
16
+ super
17
+ end
18
+ end
19
+
20
+ class InvalidData < Exception
21
+ def initialize(msg = 'InvalidData')
22
+ super
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,10 @@
1
+ module RestConfiguration
2
+ extend ApplicationConfiguration
3
+
4
+ CONFIG = {
5
+ host: 'localhost',
6
+ port: 9292,
7
+ path: '/api/v1'
8
+ }.merge( RestConfiguration.config_rest )
9
+
10
+ end
@@ -0,0 +1,33 @@
1
+ require 'sinatra/base'
2
+ require_relative 'rest_common_error'
3
+ require_relative 'rest_response_model'
4
+
5
+
6
+ class RestApplication < Sinatra::Base
7
+ extend ::RestResponseModel
8
+
9
+ error CommonError::InvalidToken do
10
+ status 401
11
+ JSON RestApplication.error_response('InvalidToken')
12
+ end
13
+
14
+ error CommonError::PermissionDenied do
15
+ status 403
16
+ JSON RestApplication.error_response('PermissionDenied')
17
+ end
18
+
19
+ error CommonError::EntityNotFound do
20
+ status 404
21
+ JSON RestApplication.error_response('EntityNotFound')
22
+ end
23
+
24
+ error CommonError::InvalidData do
25
+ status 422
26
+ JSON RestApplication.error_response('InvalidData', @errors)
27
+ end
28
+
29
+ def response_with_error(exception_class, errors=[])
30
+ @errors = errors if !errors.empty?
31
+ raise exception_class
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ module RestResponseModel
2
+ def success_response(data=nil)
3
+ response = {
4
+ status: 'OK'
5
+ }
6
+ response[:data] = data if data
7
+ response
8
+ end
9
+
10
+ def error_response(error_code='FAILED', errors=[])
11
+ response = {
12
+ status: error_code
13
+ }
14
+ response[:errors] = errors if !errors.nil? && errors.any?
15
+ response
16
+ end
17
+ end
@@ -0,0 +1,64 @@
1
+ require 'sinatra/base'
2
+ require "sinatra/namespace"
3
+ require_relative 'rest_configuration'
4
+ require_relative 'rest_error_handler'
5
+ require_relative 'rest_common_error'
6
+ require_relative 'rest_response_model'
7
+
8
+
9
+ class RestApplication < Sinatra::Base
10
+ set :server, :puma
11
+ disable :raise_errors
12
+ disable :show_exceptions
13
+
14
+ set :dump_errors, true
15
+ set :show_exceptions, :after_handler
16
+
17
+ register Sinatra::Namespace
18
+
19
+ configure :production do
20
+ # ...
21
+ end
22
+
23
+ configure :development do
24
+ # ...
25
+ end
26
+ end
27
+
28
+ class RestService < RestApplication
29
+ extend ::RestConfiguration
30
+ extend ::RestResponseModel
31
+
32
+ before '/*' do
33
+ puts 'before any route ...'
34
+ RequestStore.store[:user] = "Nhuan Lai"
35
+ end
36
+
37
+ # Health Check for Consul, run when start Consul
38
+ def self.start_consul_check_http(url)
39
+ get url do
40
+ 'The service is healthy!'
41
+ end
42
+ end
43
+ # # API route
44
+ # namespace RestConfiguration::CONFIG[:path] do
45
+ # get '/seed_1' do
46
+ # 'Seed 1 API'
47
+ # end
48
+ # get '/seed_2' do
49
+ # 'Seed 2 API'
50
+ # end
51
+ # end
52
+
53
+ # # Example for handling error
54
+ # get '/health' do
55
+ # errors = [
56
+ # {
57
+ # field: 'error field',
58
+ # code: 'error code',
59
+ # message: 'error message'
60
+ # }
61
+ # ]
62
+ # response_with_error(CommonError::InvalidData, errors)
63
+ # end
64
+ end
@@ -0,0 +1,5 @@
1
+ class SecurityContextHolder
2
+ def self.get_user
3
+ RequestStore.store[:user]
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,280 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: blsk_ruby_core_api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Fusin Thang
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: request_store
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: 1.4.1
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: 1.4.1
123
+ type: :runtime
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: 1.4.1
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: 1.4.1
133
+ - !ruby/object:Gem::Dependency
134
+ name: dry-validation
135
+ requirement: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: 0.12.0
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: 0.12.0
143
+ type: :runtime
144
+ prerelease: false
145
+ version_requirements: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - "~>"
148
+ - !ruby/object:Gem::Version
149
+ version: 0.12.0
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 0.12.0
153
+ - !ruby/object:Gem::Dependency
154
+ name: bundler
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 1.16.2
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: 1.16.2
163
+ type: :development
164
+ prerelease: false
165
+ version_requirements: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - "~>"
168
+ - !ruby/object:Gem::Version
169
+ version: 1.16.2
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: 1.16.2
173
+ - !ruby/object:Gem::Dependency
174
+ name: rake-test
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: 1.0.0
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: 1.0.0
183
+ type: :development
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
188
+ - !ruby/object:Gem::Version
189
+ version: 1.0.0
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: 1.0.0
193
+ - !ruby/object:Gem::Dependency
194
+ name: rake
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - "~>"
198
+ - !ruby/object:Gem::Version
199
+ version: 2.5.0
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: 2.5.0
203
+ type: :development
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: 2.5.0
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: 2.5.0
213
+ - !ruby/object:Gem::Dependency
214
+ name: rspec
215
+ requirement: !ruby/object:Gem::Requirement
216
+ requirements:
217
+ - - "~>"
218
+ - !ruby/object:Gem::Version
219
+ version: 3.7.0
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: 3.7.0
223
+ type: :development
224
+ prerelease: false
225
+ version_requirements: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: 3.7.0
230
+ - - ">="
231
+ - !ruby/object:Gem::Version
232
+ version: 3.7.0
233
+ description: Sample Core API gem
234
+ email: fusinthang@gmail.com
235
+ executables: []
236
+ extensions: []
237
+ extra_rdoc_files: []
238
+ files:
239
+ - lib/app_service.rb
240
+ - lib/application_configuration.rb
241
+ - lib/blsk_ruby_core_api.rb
242
+ - lib/cassandra/abstracted_cassandra_repository.rb
243
+ - lib/cassandra/cassandra_service.rb
244
+ - lib/consul/consul_configuration.rb
245
+ - lib/consul/consul_service.rb
246
+ - lib/decoractors/authenticate.rb
247
+ - lib/decoractors/valid.rb
248
+ - lib/ioc/container.rb
249
+ - lib/ioc/injector.rb
250
+ - lib/rest/rest_common_error.rb
251
+ - lib/rest/rest_configuration.rb
252
+ - lib/rest/rest_error_handler.rb
253
+ - lib/rest/rest_response_model.rb
254
+ - lib/rest/rest_service.rb
255
+ - lib/security/security_context_holder.rb
256
+ homepage: http://rubygems.org/gems/blsk_ruby_core_api
257
+ licenses:
258
+ - MIT
259
+ metadata: {}
260
+ post_install_message:
261
+ rdoc_options: []
262
+ require_paths:
263
+ - lib
264
+ required_ruby_version: !ruby/object:Gem::Requirement
265
+ requirements:
266
+ - - ">="
267
+ - !ruby/object:Gem::Version
268
+ version: 2.3.0
269
+ required_rubygems_version: !ruby/object:Gem::Requirement
270
+ requirements:
271
+ - - ">="
272
+ - !ruby/object:Gem::Version
273
+ version: '0'
274
+ requirements: []
275
+ rubyforge_project:
276
+ rubygems_version: 2.7.7
277
+ signing_key:
278
+ specification_version: 4
279
+ summary: Sample Core Api
280
+ test_files: []