blsk_ruby_core_api 0.1.0

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: 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: []