micro-rb 0.1.0.rc1
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 +7 -0
- data/.gitignore +11 -0
- data/.rubocop.yml +1399 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +11 -0
- data/LICENSE.txt +21 -0
- data/README.md +204 -0
- data/Rakefile +12 -0
- data/bin/console +16 -0
- data/bin/microrb +7 -0
- data/bin/setup +8 -0
- data/lib/micro/cli.rb +69 -0
- data/lib/micro/configuration.rb +34 -0
- data/lib/micro/examples/proto/sum.proto +12 -0
- data/lib/micro/examples/proto/sum_pb.rb +21 -0
- data/lib/micro/examples/sum.rb +22 -0
- data/lib/micro/handler.rb +63 -0
- data/lib/micro/handler_manager.rb +60 -0
- data/lib/micro/handlers/debug.rb +26 -0
- data/lib/micro/project_generator.rb +75 -0
- data/lib/micro/proto/debug.proto +10 -0
- data/lib/micro/proto/debug_pb.rb +19 -0
- data/lib/micro/servers/error.rb +58 -0
- data/lib/micro/servers/web.rb +162 -0
- data/lib/micro/sidecar/base.rb +26 -0
- data/lib/micro/sidecar/call.rb +18 -0
- data/lib/micro/sidecar/register.rb +18 -0
- data/lib/micro/version.rb +6 -0
- data/lib/micro-rb.rb +4 -0
- data/lib/microrb.rb +25 -0
- data/micro-rb.gemspec +37 -0
- data/registry.png +0 -0
- data/sum.png +0 -0
- data/templates/Dockerfile +3 -0
- data/templates/Gemfile +18 -0
- data/templates/LICENSE +21 -0
- data/templates/README.md +17 -0
- data/templates/Rakefile +9 -0
- data/templates/bin/app +17 -0
- data/templates/lib/app/handlers/example_handler.rb +16 -0
- data/templates/lib/app/proto/sum.proto +12 -0
- data/templates/lib/app/proto/sum_pb.rb +21 -0
- data/templates/lib/app/version.rb +4 -0
- data/templates/lib/app.rb +14 -0
- data/templates/test/app_test.rb +11 -0
- data/templates/test/test_helper.rb +9 -0
- metadata +277 -0
@@ -0,0 +1,75 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'active_support/core_ext/string/inflections'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'erb'
|
7
|
+
|
8
|
+
module MicroRb
|
9
|
+
class ProjectGenerator
|
10
|
+
attr_reader :name, :class_name, :username,
|
11
|
+
:year, :encryption, :active_record, :engine
|
12
|
+
|
13
|
+
def initialize(name, encryption, active_record)
|
14
|
+
@active_record = active_record
|
15
|
+
@class_name = name.classify
|
16
|
+
@encryption = encryption
|
17
|
+
@username = ENV['USERNAME'] || ENV['USER']
|
18
|
+
@name = name
|
19
|
+
@year = Time.new.year
|
20
|
+
@engine = RUBY_ENGINE == 'jruby' ? 'activerecord-jdbcmysql-adapter' : 'mysql2'
|
21
|
+
end
|
22
|
+
|
23
|
+
def create!
|
24
|
+
move_files
|
25
|
+
render_templates
|
26
|
+
install
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def move_files
|
32
|
+
template_path = File.expand_path('../../../templates', __FILE__)
|
33
|
+
|
34
|
+
FileUtils.cp_r(template_path, name)
|
35
|
+
FileUtils.mv File.join(name, 'lib', 'app'), File.join(name, 'lib', name)
|
36
|
+
FileUtils.mv File.join(name, 'lib', 'app.rb'), File.join(name, 'lib', "#{name}.rb")
|
37
|
+
FileUtils.mv File.join(name, 'test', 'app_test.rb'),
|
38
|
+
File.join(name, 'test', "#{name}_test.rb")
|
39
|
+
FileUtils.mv File.join(name, 'bin', 'app'), File.join(name, 'bin', name)
|
40
|
+
FileUtils.chmod 'u=wrx', File.join(name, 'bin', name)
|
41
|
+
end
|
42
|
+
|
43
|
+
def render_templates
|
44
|
+
[
|
45
|
+
File.join(name, 'bin', name),
|
46
|
+
File.join(name, 'lib', "#{name}.rb"),
|
47
|
+
File.join(name, 'lib', name, 'version.rb'),
|
48
|
+
File.join(name, 'lib', name, 'handlers', 'example_handler.rb'),
|
49
|
+
File.join(name, 'lib', name, 'proto', 'sum_pb.rb'),
|
50
|
+
File.join(name, 'lib', name, 'proto', 'sum.proto'),
|
51
|
+
File.join(name, 'test', "#{name}_test.rb"),
|
52
|
+
File.join(name, 'README.md'),
|
53
|
+
File.join(name, 'LICENSE'),
|
54
|
+
File.join(name, 'Gemfile'),
|
55
|
+
File.join(name, 'Dockerfile')
|
56
|
+
].each { |file| render_template(file, binding) }
|
57
|
+
end
|
58
|
+
|
59
|
+
def install
|
60
|
+
Dir.chdir(name) do
|
61
|
+
Bundler.with_clean_env do
|
62
|
+
system('bundle')
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def render_template(template, context)
|
68
|
+
t = File.read(template)
|
69
|
+
|
70
|
+
File.open(template, 'w') do |f|
|
71
|
+
f << ERB.new(t, nil, '-').result(context)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
+
# source: debug.proto
|
3
|
+
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
6
|
+
Google::Protobuf::DescriptorPool.generated_pool.build do
|
7
|
+
add_message 'micro_rb.debug.Request' do
|
8
|
+
end
|
9
|
+
add_message 'micro_rb.debug.Response' do
|
10
|
+
optional :status, :string, 1
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module MicroRb
|
15
|
+
module Debug
|
16
|
+
Request = Google::Protobuf::DescriptorPool.generated_pool.lookup('micro_rb.debug.Request').msgclass
|
17
|
+
Response = Google::Protobuf::DescriptorPool.generated_pool.lookup('micro_rb.debug.Response').msgclass
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module MicroRb
|
5
|
+
module Servers
|
6
|
+
class Error < StandardError
|
7
|
+
attr_accessor :code, :message
|
8
|
+
|
9
|
+
def initialize(code, message)
|
10
|
+
self.code = code
|
11
|
+
self.message = message
|
12
|
+
|
13
|
+
super(message)
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_h
|
17
|
+
{ code: code, message: message }
|
18
|
+
end
|
19
|
+
|
20
|
+
class ParseError < Error
|
21
|
+
def initialize
|
22
|
+
super(-32_700, 'Invalid JSON was received by the server. '\
|
23
|
+
'An error occurred on the server while parsing the JSON text.')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class InvalidParams < Error
|
28
|
+
def initialize
|
29
|
+
super(-32_602, 'Invalid method parameter(s).')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class ServerError < Error
|
34
|
+
def initialize(code, message)
|
35
|
+
super(code, message)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class InvalidRequest < Error
|
40
|
+
def initialize
|
41
|
+
super(-32_600, 'The JSON sent is not a valid Request object.')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class InternalError < Error
|
46
|
+
def initialize(e)
|
47
|
+
super(-32_603, "Internal server error: #{e}")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class MethodNotFound < Error
|
52
|
+
def initialize(method)
|
53
|
+
super(-32_601, "Method '#{method}' not found.")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'rack'
|
5
|
+
require 'rack/request'
|
6
|
+
require 'rack/response'
|
7
|
+
require 'multi_json'
|
8
|
+
|
9
|
+
module MicroRb
|
10
|
+
module Servers
|
11
|
+
class Web
|
12
|
+
attr_accessor :host, :port, :show_errors, :debug, :metadata, :version
|
13
|
+
attr_accessor :handler_manager, :name, :node_id, :server
|
14
|
+
|
15
|
+
REQUIRED_TYPES = { method: [String], params: [Hash, Array],
|
16
|
+
id: [String, Integer, NilClass] }.freeze
|
17
|
+
|
18
|
+
REQUIRED_KEYS = ['method'].freeze
|
19
|
+
|
20
|
+
def initialize(name, opts = {})
|
21
|
+
self.port = opts.delete(:port) || 3000
|
22
|
+
self.host = opts.delete(:host) || '0.0.0.0'
|
23
|
+
self.metadata = opts.delete(:metadata) || {}
|
24
|
+
self.version = opts.delete(:version) || '0.0.1'
|
25
|
+
self.debug = opts.delete(:debug)
|
26
|
+
self.name = name
|
27
|
+
self.node_id = "#{name}-#{SecureRandom.uuid}"
|
28
|
+
self.handler_manager = MicroRb::HandlerManager.new
|
29
|
+
|
30
|
+
server_opts = opts.merge(Host: host, Port: port, app: self)
|
31
|
+
self.server = Rack::Server.new(server_opts)
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_handler(handler)
|
35
|
+
handler_manager.add_handler(handler)
|
36
|
+
end
|
37
|
+
|
38
|
+
def start!
|
39
|
+
# Register the debug handler. This is kinda poor.
|
40
|
+
add_handler(MicroRb::Handlers::Debug.new)
|
41
|
+
|
42
|
+
# Value will raise an error on anything not 2XX
|
43
|
+
MicroRb::Sidecar::Register.notify(self).response.value
|
44
|
+
|
45
|
+
if debug
|
46
|
+
MicroRb.logger
|
47
|
+
.debug("Registered #{name}:#{host}:#{port} with sidecar.")
|
48
|
+
end
|
49
|
+
|
50
|
+
add_finalizer_hook!
|
51
|
+
server.start
|
52
|
+
rescue Net::HTTPFatalError => e
|
53
|
+
msg = "Sidecar error: #{e.message}"
|
54
|
+
MicroRb.logger.warn(msg)
|
55
|
+
|
56
|
+
raise MicroRb::Servers::Error::ServerError.new(-32_000, msg)
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_h
|
60
|
+
{
|
61
|
+
version: version,
|
62
|
+
metadata: metadata,
|
63
|
+
name: name,
|
64
|
+
nodes: [{ id: node_id, address: host, port: port }],
|
65
|
+
endpoints: handler_manager.endpoints
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_json
|
70
|
+
to_h.to_json
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
# Entry point for Rack
|
75
|
+
#
|
76
|
+
def call(env)
|
77
|
+
req = Rack::Request.new(env)
|
78
|
+
resp = Rack::Response.new
|
79
|
+
|
80
|
+
return resp.finish unless req.post?
|
81
|
+
|
82
|
+
resp.write process(req.body.read)
|
83
|
+
resp.finish
|
84
|
+
end
|
85
|
+
|
86
|
+
def process(content)
|
87
|
+
response = handle_request(content)
|
88
|
+
|
89
|
+
MultiJson.encode(response)
|
90
|
+
end
|
91
|
+
|
92
|
+
def create_response(request)
|
93
|
+
method = request['method'].strip.to_sym
|
94
|
+
params = request['params'].map(&:symbolize_keys!)
|
95
|
+
|
96
|
+
unless handler_manager.rpc_method?(method)
|
97
|
+
return error_response(Error::MethodNotFound.new(method), request)
|
98
|
+
end
|
99
|
+
|
100
|
+
rpc_method = handler_manager.rpc_method(method)
|
101
|
+
response = rpc_method.call(request: handler_manager.rpc_method_request(method, params),
|
102
|
+
response: handler_manager.rpc_method_response(method))
|
103
|
+
|
104
|
+
success_response(request, response)
|
105
|
+
end
|
106
|
+
|
107
|
+
def handle_request(request)
|
108
|
+
request = parse_request(request)
|
109
|
+
response = nil
|
110
|
+
|
111
|
+
begin
|
112
|
+
response = create_response(request) if valid_request?(request)
|
113
|
+
response ||= error_response(Error::InvalidRequest.new, request)
|
114
|
+
rescue MultiJson::ParseError => e
|
115
|
+
MicroRb.logger.warn(e)
|
116
|
+
response = error_response(Error::ParseError.new)
|
117
|
+
rescue StandardError => e
|
118
|
+
MicroRb.logger.warn(e)
|
119
|
+
response = error_response(Error::InternalError.new(e), request)
|
120
|
+
end
|
121
|
+
|
122
|
+
response
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def valid_request?(request)
|
128
|
+
return false unless request.is_a?(Hash)
|
129
|
+
|
130
|
+
REQUIRED_KEYS.each do |key|
|
131
|
+
return false unless request.key?(key)
|
132
|
+
end
|
133
|
+
|
134
|
+
REQUIRED_TYPES.each do |key, types|
|
135
|
+
return false if request.key?(key) &&
|
136
|
+
types.none? { |type| request[key].is_a?(type) }
|
137
|
+
end
|
138
|
+
|
139
|
+
true
|
140
|
+
end
|
141
|
+
|
142
|
+
def success_response(request, result)
|
143
|
+
{ result: result, id: request['id'] }
|
144
|
+
end
|
145
|
+
|
146
|
+
def error_response(error, request = {})
|
147
|
+
{ error: error.to_h, id: request['id'] }
|
148
|
+
end
|
149
|
+
|
150
|
+
def add_finalizer_hook!
|
151
|
+
at_exit do
|
152
|
+
MicroRb.logger.debug("Shutting down #{name}:#{host}:#{port}") if debug
|
153
|
+
MicroRb::Sidecar::Register.remove(self)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def parse_request(request)
|
158
|
+
MultiJson.decode(request)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'httparty'
|
5
|
+
|
6
|
+
module MicroRb
|
7
|
+
module Sidecar
|
8
|
+
module Base
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
CONTENT_TYPE = 'application/json'
|
12
|
+
|
13
|
+
included do
|
14
|
+
include HTTParty
|
15
|
+
|
16
|
+
def self.options(body)
|
17
|
+
{ body: body.to_json, headers: { 'Content-Type' => CONTENT_TYPE } }
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.registry_uri
|
21
|
+
MicroRb::Configuration.instance.sidecar_registry_uri
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module MicroRb
|
5
|
+
module Sidecar
|
6
|
+
class Call
|
7
|
+
include MicroRb::Sidecar::Base
|
8
|
+
|
9
|
+
def self.rpc(path, request)
|
10
|
+
post(path, options(request))
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.http(path, request)
|
14
|
+
post(path, query: request)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module MicroRb
|
5
|
+
module Sidecar
|
6
|
+
class Register
|
7
|
+
include MicroRb::Sidecar::Base
|
8
|
+
|
9
|
+
def self.notify(service)
|
10
|
+
post(registry_uri, options(service))
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.remove(service)
|
14
|
+
delete(registry_uri, options(service))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/micro-rb.rb
ADDED
data/lib/microrb.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'active_support/all'
|
6
|
+
require 'semantic_logger'
|
7
|
+
|
8
|
+
module MicroRb
|
9
|
+
include SemanticLogger::Loggable
|
10
|
+
|
11
|
+
def self.env
|
12
|
+
ActiveSupport::StringInquirer.new(ENV['MICRO_ENV'] || 'development')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
require 'micro/version'
|
17
|
+
require 'micro/configuration'
|
18
|
+
require 'micro/sidecar/base'
|
19
|
+
require 'micro/sidecar/register'
|
20
|
+
require 'micro/sidecar/call'
|
21
|
+
require 'micro/handler'
|
22
|
+
require 'micro/handler_manager'
|
23
|
+
require 'micro/servers/web'
|
24
|
+
require 'micro/servers/error'
|
25
|
+
require 'micro/handlers/debug'
|
data/micro-rb.gemspec
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'micro/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'micro-rb'
|
9
|
+
spec.version = MicroRb::VERSION
|
10
|
+
spec.authors = ['Andrew Medeiros']
|
11
|
+
spec.email = ['andrew@amedeiros.com']
|
12
|
+
|
13
|
+
spec.summary = 'Write micro services in Ruby for the Micro framework'
|
14
|
+
spec.homepage = 'https://github.com/amedeiros/micro-rb'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
|
+
f.match(%r{^(test|spec|features)/})
|
19
|
+
end
|
20
|
+
|
21
|
+
spec.bindir = 'bin'
|
22
|
+
spec.executables = ['microrb']
|
23
|
+
spec.require_paths = ['lib']
|
24
|
+
|
25
|
+
spec.add_development_dependency 'bundler', '~> 1.14'
|
26
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
27
|
+
spec.add_development_dependency 'minitest', '~> 5.0'
|
28
|
+
spec.add_development_dependency 'minitest-reporters', '~> 1.1'
|
29
|
+
spec.add_development_dependency 'shoulda', '~> 3.5'
|
30
|
+
|
31
|
+
spec.add_runtime_dependency 'activesupport', '~> 5.1', '>= 5.1.0'
|
32
|
+
spec.add_runtime_dependency 'httparty', '~> 0.14.0'
|
33
|
+
spec.add_runtime_dependency 'multi_json', '~> 1.12', '>= 1.12.1'
|
34
|
+
spec.add_runtime_dependency 'rack', '~> 1.6', '>= 1.6.5'
|
35
|
+
spec.add_runtime_dependency 'semantic_logger', '~> 4.0', '>= 4.0.0'
|
36
|
+
spec.add_runtime_dependency 'google-protobuf', '~> 3.3', '>= 3.3.0'
|
37
|
+
end
|
data/registry.png
ADDED
Binary file
|
data/sum.png
ADDED
Binary file
|
data/templates/Gemfile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gem 'rake'
|
4
|
+
|
5
|
+
gem 'bundler'
|
6
|
+
gem 'micro-rb'
|
7
|
+
<% if @encryption %>
|
8
|
+
gem 'symmetric-encryption'
|
9
|
+
<%end%>
|
10
|
+
<% if @active_record %>
|
11
|
+
gem 'activerecord'
|
12
|
+
gem <%= "'#{@engine}'" %>
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
group :test do
|
16
|
+
gem 'minitest'
|
17
|
+
gem 'minitest-reporters'
|
18
|
+
end
|
data/templates/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) <%= @year %> <%= @username %>
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/templates/README.md
ADDED
data/templates/Rakefile
ADDED
data/templates/bin/app
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$LOAD_PATH << File.expand_path(File.dirname(__FILE__) + '/../lib')
|
4
|
+
require '<%= @name %>'
|
5
|
+
<% if @active_record %>
|
6
|
+
# Change the following to reflect your database settings
|
7
|
+
ActiveRecord::Base.establish_connection(
|
8
|
+
adapter: <%= "'#{@engine}'" %>,
|
9
|
+
host: ENV[:DB_HOST],
|
10
|
+
database: ENV[:DB_NAME],
|
11
|
+
username: ENV[:DB_USERNAME],
|
12
|
+
password: ENV[:DB_PASSWORD]
|
13
|
+
)
|
14
|
+
<% end %>
|
15
|
+
server = MicroRb::Servers::Web.new(:example_service, debug: true)
|
16
|
+
server.add_handler <%= @class_name %>::ExampleHandler.new
|
17
|
+
server.start!
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require_relative '../proto/sum_pb'
|
2
|
+
|
3
|
+
module <%= @class_name %>
|
4
|
+
# Example MicroRb handler
|
5
|
+
class ExampleHandler
|
6
|
+
include MicroRb::Handler
|
7
|
+
include <%= @class_name %>::SumHandler
|
8
|
+
handler name: :example, metadata: { hello: 'Micro-Rb' }, rpc_method: :sum
|
9
|
+
|
10
|
+
def sum(request: Request.new, response: Response.new)
|
11
|
+
response.total = request.a + request.b
|
12
|
+
|
13
|
+
response
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
+
# source: sum.proto
|
3
|
+
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
6
|
+
Google::Protobuf::DescriptorPool.generated_pool.build do
|
7
|
+
add_message '<%= @name %>.sum_handler.Request' do
|
8
|
+
optional :a, :int32, 1
|
9
|
+
optional :b, :int32, 2
|
10
|
+
end
|
11
|
+
add_message '<%= @name %>.sum_handler.Response' do
|
12
|
+
optional :total, :int32, 1
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module <%= @class_name %>
|
17
|
+
module SumHandler
|
18
|
+
Request = Google::Protobuf::DescriptorPool.generated_pool.lookup('<%= @name %>.sum_handler.Request').msgclass
|
19
|
+
Response = Google::Protobuf::DescriptorPool.generated_pool.lookup('<%= @name %>.sum_handler.Response').msgclass
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Load Bundler and load all your gems
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
4
|
+
# Explicitly load any gems you need.
|
5
|
+
require 'microrb'
|
6
|
+
require '<%= @name %>/version'
|
7
|
+
require '<%= @name %>/handlers/example_handler'
|
8
|
+
|
9
|
+
module <%= @class_name %>
|
10
|
+
# Your code goes here...
|
11
|
+
# Good place for your main application logic if this is a library.
|
12
|
+
|
13
|
+
# be sure to create unit tests for them too.
|
14
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Your tests should require this file which sets up the test harness.
|
5
|
+
require 'minitest/autorun'
|
6
|
+
require 'minitest/reporters'
|
7
|
+
|
8
|
+
reporter_options = { color: true }
|
9
|
+
Minitest::Reporters.use! [Minitest::Reporters::DefaultReporter.new(reporter_options)]
|