sp-duh 2.0.6
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/LICENSE +661 -0
- data/README.md +2 -0
- data/Rakefile +32 -0
- data/config/i18n/i18n.xlsx +0 -0
- data/config/initializers/active_record/connection_adapters_postgre_sql_adapter.rb +165 -0
- data/config/initializers/active_record/migration_without_transaction.rb +4 -0
- data/config/initializers/active_record/migrator.rb +34 -0
- data/config/initializers/rails/generators.rb +13 -0
- data/config/jsonapi/settings.yml +14 -0
- data/config/locales/pt.yml +15 -0
- data/lib/generators/accounting_migration/accounting_migration_generator.rb +10 -0
- data/lib/generators/accounting_migration/templates/migration.rb +42 -0
- data/lib/generators/accounting_payroll_migration/accounting_payroll_migration_generator.rb +10 -0
- data/lib/generators/accounting_payroll_migration/templates/migration.rb +73 -0
- data/lib/generators/sharded_migration/sharded_migration_generator.rb +10 -0
- data/lib/generators/sharded_migration/templates/migration.rb +45 -0
- data/lib/sp-duh.rb +32 -0
- data/lib/sp/duh.rb +180 -0
- data/lib/sp/duh/adapters/pg/text_decoder/json.rb +15 -0
- data/lib/sp/duh/adapters/pg/text_encoder/json.rb +15 -0
- data/lib/sp/duh/db/transfer/backup.rb +71 -0
- data/lib/sp/duh/db/transfer/restore.rb +89 -0
- data/lib/sp/duh/engine.rb +35 -0
- data/lib/sp/duh/exceptions.rb +70 -0
- data/lib/sp/duh/i18n/excel_loader.rb +26 -0
- data/lib/sp/duh/jsonapi/adapters/base.rb +168 -0
- data/lib/sp/duh/jsonapi/adapters/db.rb +36 -0
- data/lib/sp/duh/jsonapi/adapters/raw_db.rb +77 -0
- data/lib/sp/duh/jsonapi/configuration.rb +167 -0
- data/lib/sp/duh/jsonapi/doc/apidoc_documentation_format_generator.rb +286 -0
- data/lib/sp/duh/jsonapi/doc/generator.rb +32 -0
- data/lib/sp/duh/jsonapi/doc/schema_catalog_helper.rb +97 -0
- data/lib/sp/duh/jsonapi/doc/victor_pinus_metadata_format_parser.rb +374 -0
- data/lib/sp/duh/jsonapi/exceptions.rb +56 -0
- data/lib/sp/duh/jsonapi/model/base.rb +25 -0
- data/lib/sp/duh/jsonapi/model/concerns/attributes.rb +94 -0
- data/lib/sp/duh/jsonapi/model/concerns/model.rb +42 -0
- data/lib/sp/duh/jsonapi/model/concerns/persistence.rb +221 -0
- data/lib/sp/duh/jsonapi/model/concerns/serialization.rb +59 -0
- data/lib/sp/duh/jsonapi/parameters.rb +44 -0
- data/lib/sp/duh/jsonapi/resource_publisher.rb +28 -0
- data/lib/sp/duh/jsonapi/service.rb +110 -0
- data/lib/sp/duh/migrations.rb +47 -0
- data/lib/sp/duh/migrations/migrator.rb +41 -0
- data/lib/sp/duh/repl.rb +193 -0
- data/lib/sp/duh/version.rb +25 -0
- data/lib/tasks/db_utils.rake +98 -0
- data/lib/tasks/doc.rake +27 -0
- data/lib/tasks/i18n.rake +23 -0
- data/lib/tasks/oauth.rake +29 -0
- data/lib/tasks/transfer.rake +48 -0
- data/lib/tasks/xls2jrxml.rake +15 -0
- data/test/jsonapi/server.rb +67 -0
- data/test/tasks/test.rake +10 -0
- metadata +170 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
module SP
|
2
|
+
module Duh
|
3
|
+
module JSONAPI
|
4
|
+
class Parameters
|
5
|
+
attr_reader :user_id, :company_id, :company_schema, :sharded_schema, :default_accounting_schema, :accounting_schema, :accounting_prefix
|
6
|
+
|
7
|
+
def initialize(parameters = {})
|
8
|
+
check_jsonapi_args(parameters)
|
9
|
+
|
10
|
+
@user_id = parameters[:user_id].to_s unless parameters[:user_id].nil?
|
11
|
+
@company_id = parameters[:company_id].to_s unless parameters[:company_id].nil?
|
12
|
+
@company_schema = parameters[:company_schema] unless parameters[:company_schema].nil?
|
13
|
+
@sharded_schema = parameters[:sharded_schema] unless parameters[:sharded_schema].nil?
|
14
|
+
@default_accounting_schema = parameters[:default_accounting_schema] unless parameters[:default_accounting_schema].nil?
|
15
|
+
@accounting_schema = parameters[:accounting_schema] unless parameters[:accounting_schema].nil?
|
16
|
+
@accounting_prefix = parameters[:accounting_prefix] unless parameters[:accounting_prefix].nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json(options = {})
|
20
|
+
{
|
21
|
+
user_id: self.user_id,
|
22
|
+
company_id: self.company_id,
|
23
|
+
company_schema: self.company_schema,
|
24
|
+
sharded_schema: self.sharded_schema,
|
25
|
+
default_accounting_schema: self.default_accounting_schema,
|
26
|
+
accounting_schema: self.accounting_schema,
|
27
|
+
accounting_prefix: self.accounting_prefix
|
28
|
+
}.to_json
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def check_jsonapi_args(parameters)
|
33
|
+
if parameters.keys.any? && !(parameters.keys - valid_keys).empty?
|
34
|
+
raise SP::Duh::JSONAPI::Exceptions::InvalidJSONAPIKeyError.new(key: (parameters.keys - valid_keys).join(', '))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def valid_keys
|
39
|
+
[ :user_id, :company_id, :company_schema, :sharded_schema, :default_accounting_schema, :accounting_schema, :accounting_prefix ]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Usage (by a module or class belonging to a library or gem that publishes JSONAPI resources):
|
2
|
+
#
|
3
|
+
# In the module or class definition:
|
4
|
+
#
|
5
|
+
# include SP::Duh::JSONAPI::ResourcePublisher
|
6
|
+
# self.jsonapi_resources_root = "<path to the folder where the resources configurations are located>"
|
7
|
+
|
8
|
+
module SP
|
9
|
+
module Duh
|
10
|
+
module JSONAPI
|
11
|
+
|
12
|
+
module ResourcePublisher
|
13
|
+
extend ::ActiveSupport::Concern
|
14
|
+
|
15
|
+
included do
|
16
|
+
SP::Duh::JSONAPI::Configuration.add_publisher self
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
attr_reader :jsonapi_resources_root
|
21
|
+
private
|
22
|
+
attr_writer :jsonapi_resources_root
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module SP
|
2
|
+
module Duh
|
3
|
+
module JSONAPI
|
4
|
+
|
5
|
+
VERSION = '1.0'
|
6
|
+
|
7
|
+
class Status
|
8
|
+
OK = 200
|
9
|
+
ERROR = 500
|
10
|
+
end
|
11
|
+
|
12
|
+
class Service
|
13
|
+
|
14
|
+
def self.protocols ; [ :db, :http ] ; end
|
15
|
+
def connection ; @pg_connection ; end
|
16
|
+
def url ; @url ; end
|
17
|
+
def set_url(value) ; @url = value ; end
|
18
|
+
def configuration ; @configuration ; end
|
19
|
+
def adapter
|
20
|
+
raise Exceptions::ServiceSetupError.new('JSONAPI prefix not specified', nil) if url.blank?
|
21
|
+
@adapter_instance ||= @adapter.new(self)
|
22
|
+
SP::Duh::JSONAPI::Model::Base.adapter ||= @adapter_instance
|
23
|
+
@adapter_instance
|
24
|
+
end
|
25
|
+
|
26
|
+
def protocol ; @protocol ; end
|
27
|
+
def protocol=(value)
|
28
|
+
if !value.to_sym.in?(Service.protocols)
|
29
|
+
raise Exceptions::ServiceProtocolError.new(protocol: value.to_sym, protocols: Service.protocols.join(', '))
|
30
|
+
end
|
31
|
+
@protocol = value.to_sym
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize(pg_connection, url, default_adapter = SP::Duh::JSONAPI::Adapters::Db)
|
35
|
+
@pg_connection = pg_connection
|
36
|
+
@url = url
|
37
|
+
protocol = :db
|
38
|
+
@configuration = Configuration.new(pg_connection, url)
|
39
|
+
@adapter = default_adapter
|
40
|
+
adapter unless url.nil?
|
41
|
+
end
|
42
|
+
|
43
|
+
def setup
|
44
|
+
begin
|
45
|
+
create_jsonapi_function()
|
46
|
+
rescue StandardError => e
|
47
|
+
raise Exceptions::ServiceSetupError.new(nil, e)
|
48
|
+
end
|
49
|
+
configuration.setup()
|
50
|
+
end
|
51
|
+
|
52
|
+
def close
|
53
|
+
@pg_connection.close if !@pg_connection.nil? && !@pg_connection.finished?
|
54
|
+
@adapter_instance = nil
|
55
|
+
@adapter = nil
|
56
|
+
@url = nil
|
57
|
+
@configuration = nil
|
58
|
+
end
|
59
|
+
|
60
|
+
def set_jsonapi_parameters(parameters = nil) ; @parameters = parameters ; end
|
61
|
+
def clear_jsonapi_args ; @parameters = nil ; end
|
62
|
+
def parameters ; @parameters ; end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def create_jsonapi_function
|
67
|
+
connection.exec %Q[
|
68
|
+
|
69
|
+
CREATE OR REPLACE FUNCTION public.jsonapi (
|
70
|
+
IN method text,
|
71
|
+
IN uri text,
|
72
|
+
IN body text,
|
73
|
+
IN user_id text,
|
74
|
+
IN company_id text,
|
75
|
+
IN company_schema text,
|
76
|
+
IN sharded_schema text,
|
77
|
+
IN accounting_schema text,
|
78
|
+
IN accounting_prefix text,
|
79
|
+
OUT http_status integer,
|
80
|
+
OUT response text
|
81
|
+
) RETURNS record AS '$libdir/pg-jsonapi.so', 'jsonapi' LANGUAGE C;
|
82
|
+
|
83
|
+
CREATE OR REPLACE FUNCTION public.inside_jsonapi (
|
84
|
+
) RETURNS boolean AS '$libdir/pg-jsonapi.so', 'inside_jsonapi' LANGUAGE C;
|
85
|
+
|
86
|
+
CREATE OR REPLACE FUNCTION public.get_jsonapi_user (
|
87
|
+
) RETURNS text AS '$libdir/pg-jsonapi.so', 'get_jsonapi_user' LANGUAGE C;
|
88
|
+
|
89
|
+
CREATE OR REPLACE FUNCTION public.get_jsonapi_company (
|
90
|
+
) RETURNS text AS '$libdir/pg-jsonapi.so', 'get_jsonapi_company' LANGUAGE C;
|
91
|
+
|
92
|
+
CREATE OR REPLACE FUNCTION public.get_jsonapi_company_schema (
|
93
|
+
) RETURNS text AS '$libdir/pg-jsonapi.so', 'get_jsonapi_company_schema' LANGUAGE C;
|
94
|
+
|
95
|
+
CREATE OR REPLACE FUNCTION public.get_jsonapi_sharded_schema (
|
96
|
+
) RETURNS text AS '$libdir/pg-jsonapi.so', 'get_jsonapi_sharded_schema' LANGUAGE C;
|
97
|
+
|
98
|
+
CREATE OR REPLACE FUNCTION public.get_jsonapi_accounting_schema (
|
99
|
+
) RETURNS text AS '$libdir/pg-jsonapi.so', 'get_jsonapi_accounting_schema' LANGUAGE C;
|
100
|
+
|
101
|
+
CREATE OR REPLACE FUNCTION public.get_jsonapi_accounting_prefix (
|
102
|
+
) RETURNS text AS '$libdir/pg-jsonapi.so', 'get_jsonapi_accounting_prefix' LANGUAGE C;
|
103
|
+
|
104
|
+
]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2011-2017 Cloudware S.A. All rights reserved.
|
3
|
+
#
|
4
|
+
# This file is part of sp-duh.
|
5
|
+
#
|
6
|
+
# sp-duh is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# sp-duh is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with sp-duh. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#
|
19
|
+
# encoding: utf-8
|
20
|
+
#
|
21
|
+
module SP
|
22
|
+
module Duh
|
23
|
+
module Migrations
|
24
|
+
extend ::ActiveSupport::Concern
|
25
|
+
|
26
|
+
included do
|
27
|
+
end
|
28
|
+
|
29
|
+
module ClassMethods
|
30
|
+
|
31
|
+
attr_reader :migrations_root
|
32
|
+
|
33
|
+
def migrator(pg_connection)
|
34
|
+
if @migrator.nil? || @migrator.root != migrations_root || @migrator.connection != pg_connection
|
35
|
+
@migrator = Migrator.new(pg_connection, migrations_root)
|
36
|
+
end
|
37
|
+
@migrator
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
attr_writer :migrations_root
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module SP
|
2
|
+
module Duh
|
3
|
+
module Migrations
|
4
|
+
|
5
|
+
class Migrator
|
6
|
+
|
7
|
+
attr_reader :root
|
8
|
+
|
9
|
+
def connection ; @pg_connection ; end
|
10
|
+
|
11
|
+
def initialize(pg_connection, migrations_root)
|
12
|
+
@pg_connection = pg_connection
|
13
|
+
@root = migrations_root
|
14
|
+
end
|
15
|
+
|
16
|
+
def up(migration_name) ; migrate(migration_name, :up) ; end
|
17
|
+
def down(migration_name) ; migrate(migration_name, :down) ; end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def migrate(migration_name, direction = :up)
|
22
|
+
_log("Migrating #{direction.to_s} #{migration_name}...", "Migrations::Migrator")
|
23
|
+
run_all_on(File.join(root, migration_name, direction.to_s))
|
24
|
+
_log("[DONE]", "Migrations::Migrator")
|
25
|
+
end
|
26
|
+
|
27
|
+
def run_all_on(folder)
|
28
|
+
connection.transaction do |t|
|
29
|
+
Dir.glob(File.join(folder, '*.sql')).sort.each do |step|
|
30
|
+
name = File.basename(step, '.*')
|
31
|
+
_log(" #{name}", "Migrations::Migrator")
|
32
|
+
t.exec File.read(step)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/sp/duh/repl.rb
ADDED
@@ -0,0 +1,193 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2011-2017 Cloudware S.A. All rights reserved.
|
3
|
+
#
|
4
|
+
# This file is part of sp-duh.
|
5
|
+
#
|
6
|
+
# sp-duh is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# sp-duh is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with sp-duh. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#
|
19
|
+
# encoding: utf-8
|
20
|
+
#
|
21
|
+
module SP
|
22
|
+
module Duh
|
23
|
+
|
24
|
+
class Repl
|
25
|
+
|
26
|
+
@@help = Array.new
|
27
|
+
@@cmds = Array.new
|
28
|
+
|
29
|
+
def initialize (a_pg_conn)
|
30
|
+
@see_calc = false
|
31
|
+
@pg_conn = a_pg_conn
|
32
|
+
@hist_file = ".#{@prompt.split('>')[0].strip}_history"
|
33
|
+
begin
|
34
|
+
File.open(@hist_file).each do |line|
|
35
|
+
Readline::HISTORY << line.strip
|
36
|
+
end
|
37
|
+
rescue
|
38
|
+
# no history file
|
39
|
+
end
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.desc (a_msg)
|
44
|
+
@@help << a_msg
|
45
|
+
@@cmds << a_msg.split(' ')[0].strip
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
# http://bogojoker.com/readline/
|
50
|
+
# Smarter Readline to prevent empty and dups
|
51
|
+
# 1. Read a line and append to history
|
52
|
+
# 2. Quick Break on nil
|
53
|
+
# 3. Remove from history if empty or dup
|
54
|
+
#
|
55
|
+
def readline_with_hist_management ()
|
56
|
+
line = Readline.readline(@prompt, true)
|
57
|
+
return nil if line.nil?
|
58
|
+
if line =~ /^\s*$/ or Readline::HISTORY.to_a[-2] == line
|
59
|
+
Readline::HISTORY.pop
|
60
|
+
end
|
61
|
+
line
|
62
|
+
end
|
63
|
+
|
64
|
+
def check_db ()
|
65
|
+
raise "can't do that! database connection is not valid" if @pg_conn.nil?
|
66
|
+
end
|
67
|
+
|
68
|
+
desc 'help -- you are looking at it'
|
69
|
+
def help ()
|
70
|
+
puts @@help
|
71
|
+
end
|
72
|
+
|
73
|
+
def save_history
|
74
|
+
File.open(@hist_file, "w") do |f|
|
75
|
+
Readline::HISTORY.to_a[0..100].each do |line|
|
76
|
+
f.write "#{line}\n"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
desc 'quit -- exit this shell'
|
82
|
+
def quit ()
|
83
|
+
puts "quiting"
|
84
|
+
save_history()
|
85
|
+
exit
|
86
|
+
end
|
87
|
+
|
88
|
+
desc 'initsee -- install pg-see in the database'
|
89
|
+
def initsee (a_recreate = false)
|
90
|
+
SP::Duh.initsee(@pg_conn, a_recreate)
|
91
|
+
end
|
92
|
+
|
93
|
+
desc 'psql -- open sql console'
|
94
|
+
def psql ()
|
95
|
+
system("psql --user=#{@pg_conn.user} --host=#{@pg_conn.host} #{@pg_conn.db}")
|
96
|
+
end
|
97
|
+
|
98
|
+
desc 'open <file> -- open file with system command'
|
99
|
+
def open (a_file)
|
100
|
+
system("open #{File.expand_path(a_file)}")
|
101
|
+
end
|
102
|
+
|
103
|
+
desc 'debug -- enter IRB'
|
104
|
+
def debug
|
105
|
+
byebug
|
106
|
+
end
|
107
|
+
|
108
|
+
desc 'pid -- get pg backend pid'
|
109
|
+
def pid
|
110
|
+
pid = @pg_conn.exec("SELECT pg_backend_pid() AS pid")[0]["pid"]
|
111
|
+
puts "Backend PID: #{pid}"
|
112
|
+
end
|
113
|
+
|
114
|
+
#desc 'reload_jsonapi -- configure JSON API'
|
115
|
+
# @TODO check helpers to reload json and modules with JSM and TD
|
116
|
+
#def reload_jsonapi
|
117
|
+
# JSONAPI.service.setup
|
118
|
+
#end
|
119
|
+
|
120
|
+
def repl ()
|
121
|
+
cmdset = @@cmds.abbrev
|
122
|
+
while buf = readline_with_hist_management
|
123
|
+
begin
|
124
|
+
buf.strip!
|
125
|
+
args = buf.split(' ')
|
126
|
+
command = args[0]
|
127
|
+
args = args[1..-1]
|
128
|
+
unless cmdset.has_key?(command)
|
129
|
+
fallback_command(buf)
|
130
|
+
next
|
131
|
+
end
|
132
|
+
command = cmdset[command]
|
133
|
+
if respond_to?(command)
|
134
|
+
arity = method(command).arity
|
135
|
+
if arity >= 0
|
136
|
+
if arity != args.length
|
137
|
+
puts "command #{command} requires #{arity} arguments (#{args.length} given)"
|
138
|
+
next
|
139
|
+
end
|
140
|
+
elsif arity < 0
|
141
|
+
min_args = -arity - 1
|
142
|
+
if args.length < min_args or args.length > -arity
|
143
|
+
puts "command #{command} takes #{min_args} to #{-arity} arguments (#{args.length} given)"
|
144
|
+
next
|
145
|
+
end
|
146
|
+
end
|
147
|
+
send(command, *args)
|
148
|
+
else
|
149
|
+
fallback_command(buf)
|
150
|
+
end
|
151
|
+
rescue SystemExit
|
152
|
+
save_history()
|
153
|
+
exit
|
154
|
+
rescue Exception => e
|
155
|
+
puts e.message
|
156
|
+
puts e.backtrace
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
161
|
+
|
162
|
+
def fallback_command (a_command)
|
163
|
+
begin
|
164
|
+
if @see_calc and @pg_conn != nil
|
165
|
+
cmd = a_command.gsub("'", "''")
|
166
|
+
calc = @pg_conn.exec(%Q[
|
167
|
+
SELECT json::json FROM see_evaluate_expression('#{cmd}');
|
168
|
+
])
|
169
|
+
if calc.cmd_tuples != 1
|
170
|
+
puts "unknown error unable to calculate expression"
|
171
|
+
else
|
172
|
+
jresult = JSON.parse(calc[0]['json'])
|
173
|
+
if jresult['error'] != nil
|
174
|
+
if jresult['error']['type'] == 'osal::exception'
|
175
|
+
puts jresult['error']['trace']['why']
|
176
|
+
else
|
177
|
+
puts jresult['error']
|
178
|
+
end
|
179
|
+
else
|
180
|
+
puts jresult['result']
|
181
|
+
end
|
182
|
+
end
|
183
|
+
else
|
184
|
+
puts "#{a_command} is not a valid command"
|
185
|
+
end
|
186
|
+
rescue => e
|
187
|
+
puts e.message
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|