xmlservice 1.3.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.
Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +19 -0
  3. data/README_IBM_i +62 -0
  4. data/lib/adapters/abstract_adapter.rb +82 -0
  5. data/lib/adapters/db2_adapter.rb +70 -0
  6. data/lib/adapters/rest_adapter.rb +32 -0
  7. data/lib/password/password.rb +229 -0
  8. data/lib/xmlservice.rb +2477 -0
  9. data/test/README_IBM_i +3 -0
  10. data/test/Rakefile +42 -0
  11. data/test/genpassword.rb +111 -0
  12. data/test/test_60000_toolkit_driver/Rakefile +11 -0
  13. data/test/test_60000_toolkit_driver/test_60010_DriverCallPgmZZCALL.rb +403 -0
  14. data/test/test_60000_toolkit_driver/test_60110_DriverCallSrvPgmZZARRAY.rb +149 -0
  15. data/test/test_60000_toolkit_driver/test_60310_DriverCMD.rb +77 -0
  16. data/test/test_60000_toolkit_driver/test_60510_DriverDataQueue.rb +126 -0
  17. data/test/test_60000_toolkit_driver/test_60610_DriverCallSrvPgmZZBINARY.rb +59 -0
  18. data/test/test_60000_toolkit_driver/test_60710_DriverSH.rb +73 -0
  19. data/test/test_60000_toolkit_driver/test_60910_DriverCallPgmZZMISS.rb +44 -0
  20. data/test/test_60000_toolkit_driver/test_65010_DriverCallDB2.rb +265 -0
  21. data/test/test_60000_toolkit_driver/zzassign.rb +66 -0
  22. data/test/test_60000_toolkit_driver/zzquick.rb +149 -0
  23. data/test/test_60000_toolkit_driver/zztestrest.rb +45 -0
  24. data/test/test_60000_toolkit_driver/zzthreadold.rb +78 -0
  25. data/test/test_70000_toolkit_testonly/Rakefile +11 -0
  26. data/test/test_70000_toolkit_testonly/test_70010_DriverCallPgmTestOnly.rb +270 -0
  27. data/test/test_80000_toolkit_dsl/Rakefile +11 -0
  28. data/test/test_80000_toolkit_dsl/test_80010_DSLCallPgmZZCALL.rb +162 -0
  29. data/test/test_80000_toolkit_dsl/test_80110_DSLCallSrvPgmZZARRAY.rb +150 -0
  30. data/test/test_authorization/README_IBM_i +15 -0
  31. data/test/test_authorization/auth.rb +101 -0
  32. data/test/test_authorization/key.yml +2 -0
  33. data/test/test_authorization/password.yml +3 -0
  34. data/test/test_authorization/xmlservice.yml +69 -0
  35. data/test/test_data/rowcol.rb +57 -0
  36. data/version.txt +1 -0
  37. metadata +92 -0
@@ -0,0 +1,150 @@
1
+ # File: test_80110_DSLCallSrvPgmZZARRAY.rb
2
+ require "../test_authorization/auth"
3
+ require "../test_data/rowcol"
4
+
5
+ # D ARRAYMAX c const(999)
6
+ # D dcRec_t ds qualified based(Template)
7
+ # D dcMyName 10A
8
+ # D dcMyJob 4096A
9
+ # D dcMyRank 10i 0
10
+ # D dcMyPay 12p 2
11
+ # *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12
+ # * zzarray: check return array aggregate
13
+ # *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
14
+ # P zzarray B export
15
+ # D zzarray PI likeds(dcRec_t) dim(ARRAYMAX)
16
+ # D myName 10A
17
+ # D myMax 10i 0
18
+ # D myCount 10i 0
19
+ class Test_80110_DSLCallSrvPgmZZARRAY < RowColUnitTest
20
+ # -------------------------------
21
+ # test functions (start with prefix test_)
22
+ # rake test -- Unit run alpha sort order
23
+ # run #1) test_0000_connect
24
+ # run #2) test_nnnn_xxx
25
+ # :
26
+ # run #n) test_9999_close
27
+ # -------------------------------
28
+
29
+ def test_0050_zzarray
30
+ count = 5
31
+ zzwho = 'Ranger'
32
+ zzarray = XMLService::I_SRVPGM.new("ZZSRV","ZZARRAY",$toolkit_test_lib,{'error'=>'on'})
33
+ zzarray.input_parms do
34
+ char "myName", 10
35
+ long "myMax"
36
+ long_enddo "myCount"
37
+ end
38
+ zzarray.return_parms do
39
+ struct_dou "dcRec_t", 999, "myCount" do
40
+ char "dcMyName", 10
41
+ char "dcMyJob", 4096
42
+ long "dcMyRank"
43
+ dec "dcMyPay", 12, 2
44
+ end
45
+ end
46
+
47
+ # set input variables for call
48
+ zzarray.input.PARM0.myName = 'Skippy'
49
+ zzarray.input.PARM1.myMax = 9
50
+ zzarray.input.PARM2.myCount= 0
51
+ puts "\n+++++++++ input normal ++++++++++++++++"
52
+ puts zzarray.to_xml
53
+ # verify
54
+ self.match_value(__method__,__LINE__,'myName' ,'Skippy' ,zzarray.input.PARM0.myName)
55
+ self.match_value(__method__,__LINE__,'myMax' ,9 ,zzarray.input.PARM1.myMax)
56
+ self.match_value(__method__,__LINE__,'myCount' ,0 ,zzarray.input.PARM2.myCount)
57
+
58
+
59
+ # set input variables for call
60
+ zzarray.input.myName = zzwho
61
+ zzarray.input.myMax = count
62
+ zzarray.input.myCount= 0
63
+ puts "\n+++++++++ input fewer ++++++++++++++++"
64
+ puts zzarray.to_xml
65
+ # verify
66
+ self.match_value(__method__,__LINE__,'myName' ,zzwho ,zzarray.input.PARM0.myName)
67
+ self.match_value(__method__,__LINE__,'myMax' ,count ,zzarray.input.PARM1.myMax)
68
+ self.match_value(__method__,__LINE__,'myCount' ,0 ,zzarray.input.PARM2.myCount)
69
+
70
+ # call IBM i
71
+ zzarray.call
72
+
73
+ # puts zzarray.inspect
74
+ puts "\n+++++++++ dump_inspect ++++++++++++++++"
75
+ puts zzarray.dump_inspect
76
+
77
+ # xmlservice error occurred?
78
+ rc = zzarray.xmlservice_error
79
+ if rc
80
+ puts zzcall.dump_error
81
+ self.match_value(__method__,__LINE__,'error' ,false,rc)
82
+ end
83
+
84
+ # output xml
85
+ puts "\n+++++++++ output xml ++++++++++++++++"
86
+ puts zzarray.out_xml
87
+
88
+
89
+ # output
90
+ puts "\n+++++++++ output ++++++++++++++++"
91
+ puts "#{zzarray.name}.#{zzarray.func}:\n"
92
+ puts " myName....#{zzarray.response.myName}\n"
93
+ puts " myMax.....#{zzarray.response.myMax}\n"
94
+ puts " myCount...#{zzarray.response.myCount}\n"
95
+ i = 0
96
+ zzarray.returndata.dcRec_t.each do |dcRec_t|
97
+ i += 1
98
+ puts "dcRec_t[#{i}]"
99
+ puts " Name...#{dcRec_t.dcMyName}"
100
+ puts " Job....#{dcRec_t.dcMyJob}"
101
+ puts " Rank...#{dcRec_t.dcMyRank}"
102
+ puts " Pay....#{dcRec_t.dcMyPay}"
103
+ end
104
+ # verify
105
+ self.match_value(__method__,__LINE__,'myName' ,zzwho ,zzarray.response.myName)
106
+ self.match_value(__method__,__LINE__,'myMax' ,count ,zzarray.response.myMax)
107
+ self.match_value(__method__,__LINE__,'myCount' ,count ,zzarray.response.myCount)
108
+ for i in 0..zzarray.returndata.dcRec_t.count-1
109
+ dcMyName = zzarray.response.myName.to_s + (i+1).to_s
110
+ dcMyJob = "Test " + (100 + i + 1).to_s
111
+ dcMyRank = 10 + i + 1
112
+ dcMyPay = 13.42 * (i+1)
113
+ self.match_value(__method__,__LINE__,'dcMyName' ,dcMyName ,zzarray.returndata.dcRec_t[i].dcMyName)
114
+ self.match_value(__method__,__LINE__,'dcMyJob' ,dcMyJob ,zzarray.returndata.dcRec_t[i].dcMyJob)
115
+ self.match_value(__method__,__LINE__,'dcMyRank' ,dcMyRank ,zzarray.returndata.dcRec_t[i].dcMyRank)
116
+ self.match_value(__method__,__LINE__,'dcMyPay' ,dcMyPay ,zzarray.returndata.dcRec_t[i].dcMyPay)
117
+ end
118
+
119
+ # output
120
+ puts "\n+++++++++ output long ++++++++++++++++"
121
+ puts "#{zzarray.name}.#{zzarray.func}:\n"
122
+ puts " myName....#{zzarray.response.PARM0.myName}\n"
123
+ puts " myMax.....#{zzarray.response.PARM1.myMax}\n"
124
+ puts " myCount...#{zzarray.response.PARM2.myCount}\n"
125
+ i = 0
126
+ zzarray.returndata.douaggr.dcRec_t.each do |dcRec_t|
127
+ i += 1
128
+ puts "dcRec_t[#{i}]"
129
+ puts " Name...#{dcRec_t.dcMyName}"
130
+ puts " Job....#{dcRec_t.dcMyJob}"
131
+ puts " Rank...#{dcRec_t.dcMyRank}"
132
+ puts " Pay....#{dcRec_t.dcMyPay}"
133
+ end
134
+ # verify
135
+ self.match_value(__method__,__LINE__,'myName' ,zzwho ,zzarray.response.PARM0.myName)
136
+ self.match_value(__method__,__LINE__,'myMax' ,count ,zzarray.response.PARM1.myMax)
137
+ self.match_value(__method__,__LINE__,'myCount' ,count ,zzarray.response.PARM2.myCount)
138
+ for i in 0..zzarray.returndata.douaggr.dcRec_t.count-1
139
+ dcMyName = zzarray.response.PARM0.myName.to_s + (i+1).to_s
140
+ dcMyJob = "Test " + (100 + i + 1).to_s
141
+ dcMyRank = 10 + i + 1
142
+ dcMyPay = 13.42 * (i+1)
143
+ self.match_value(__method__,__LINE__,'dcMyName' ,dcMyName ,zzarray.returndata.douaggr.dcRec_t[i].dcMyName)
144
+ self.match_value(__method__,__LINE__,'dcMyJob' ,dcMyJob ,zzarray.returndata.douaggr.dcRec_t[i].dcMyJob)
145
+ self.match_value(__method__,__LINE__,'dcMyRank' ,dcMyRank ,zzarray.returndata.douaggr.dcRec_t[i].dcMyRank)
146
+ self.match_value(__method__,__LINE__,'dcMyPay' ,dcMyPay ,zzarray.returndata.douaggr.dcRec_t[i].dcMyPay)
147
+ end
148
+ end
149
+
150
+ end
@@ -0,0 +1,15 @@
1
+ ===================
2
+ Encrypted passwords
3
+ ===================
4
+ cd xmlservice/test
5
+ > genpassword.rb
6
+ Syntax:
7
+ ruby genpassword.rb db user password [key]
8
+ db - *LOCAL (see WRKRDBDIRE)
9
+ user - user profile id
10
+ password - user profile password
11
+ Optional:"
12
+ key - pass key (generate if missing)
13
+ - /path/key.yml
14
+ - YIPS4321AAAAAAAAAAAAAAA132424245 (actual key)
15
+
@@ -0,0 +1,101 @@
1
+ require 'xmlservice'
2
+
3
+ # =================
4
+ # IBM i tests (see xmlservice/README_IBM_i)
5
+ # =================
6
+ $test_url = ENV['TEST_URL']
7
+ $test_db = ENV['TEST_DATABASE']
8
+ $test_user = ENV['TEST_USER']
9
+ $test_pwd = ENV['TEST_PWD']
10
+ $test_ctl = ENV['TEST_CTL']
11
+ $test_ipc = ENV['TEST_IPC']
12
+ $test_xmlservice = ENV['TEST_XMLSERVICE']
13
+ $test_lib = ENV['TEST_LIB']
14
+ if $test_url == nil
15
+ $test_url = "http://174.79.32.155/cgi-bin/xmlcgi.pgm"
16
+ end
17
+ if $test_db == nil
18
+ $test_db = "*LOCAL"
19
+ end
20
+ if $test_user == nil
21
+ $test_user = "*NONE"
22
+ end
23
+ if $test_pwd == nil
24
+ $test_pwd = "*NONE"
25
+ end
26
+ if $test_ctl == nil
27
+ $test_ctl = "*here"
28
+ end
29
+ if $test_ipc == nil
30
+ $test_ipc = "*na"
31
+ end
32
+ if $test_xmlservice == nil
33
+ $test_xmlservice = "XMLSERVICE"
34
+ end
35
+ if $test_lib == nil
36
+ $test_lib = "DB2"
37
+ end
38
+
39
+ # =================
40
+ # developer only yaml
41
+ # encrypt password tests
42
+ # =================
43
+ # $test_url = "yaml"
44
+ $test_env = ENV['TEST_ENV']
45
+ $test_yaml = ENV['TEST_YAML']
46
+ if $test_yaml == nil
47
+ $test_yaml = "../test_authorization/xmlservice.yml"
48
+ end
49
+ if $test_env == nil
50
+ $test_env = "db2public"
51
+ end
52
+
53
+
54
+ case $test_url
55
+ when "ibm_db"
56
+ # =================
57
+ # establish connection (DB2)
58
+ # =================
59
+ ActiveXMLService::Base.establish_connection(
60
+ :adapter => "ibm_db",
61
+ :connection => "ActiveRecord",
62
+ :database => $test_db,
63
+ :username => $test_user,
64
+ :password => $test_pwd,
65
+ :ctl => $test_ctl,
66
+ :ipc => $test_ipc,
67
+ :size => 15000000,
68
+ :head => "<?xml version='1.0'?>",
69
+ :test_i_lib => $test_xmlservice, # custom attributes (not xmlservice required)
70
+ :test_i_db2_lib => $test_lib # custom attributes (not xmlservice required)
71
+ )
72
+ when "yaml"
73
+ # =================
74
+ # establish connection (based on yaml)
75
+ # =================
76
+ ActiveXMLService::Base.establish_connection(
77
+ :test_yaml => $test_yaml,
78
+ :test_env => $test_env
79
+ )
80
+ else
81
+ # =================
82
+ # establish connection (REST)
83
+ # =================
84
+ ActiveXMLService::Base.establish_connection(
85
+ :connection => $test_url,
86
+ :database => $test_db,
87
+ :username => $test_user,
88
+ :password => $test_pwd,
89
+ :ctl => $test_ctl,
90
+ :ipc => $test_ipc,
91
+ :size => 15000000,
92
+ :head => "<?xml version='1.0'?>",
93
+ :test_i_lib => $test_xmlservice, # custom attributes (not xmlservice required)
94
+ :test_i_db2_lib => $test_lib # custom attributes (not xmlservice required)
95
+ )
96
+ end
97
+
98
+ # custom attributes (not xmlservice required)
99
+ $toolkit_test_lib = ActiveXMLService::Base.configurations[:test_i_lib];
100
+ $toolkit_test_db2_lib = ActiveXMLService::Base.configurations[:test_i_db2_lib];
101
+
@@ -0,0 +1,2 @@
1
+ pwd_key: "YIPS4321AAAAAAAAAAAAAAA132424245"
2
+
@@ -0,0 +1,3 @@
1
+ DB2:
2
+ pwd_enc: "YiYNfodSh5MGZVX7TXktEPSrnVlrAPjoyzzn48SdC/k=%0A"
3
+
@@ -0,0 +1,69 @@
1
+ # Profile DB2 (xmlcgi.pgm or ibm_db)
2
+ db2profile: &db2profile
3
+ # database: "LP0364D"
4
+ database: "*LOCAL"
5
+ username: DB2
6
+ #password: MYPWD
7
+ pwd_yaml: ../test_authorization/password.yml
8
+
9
+ # REST client to XMLSERVICE
10
+ xmlrest: &xmlrest
11
+ connection: "http://174.79.32.155/cgi-bin/xmlcgi.pgm"
12
+
13
+ # DB2 client to XMLSERVICE
14
+ xmldb2: &xmldb2
15
+ connection: "ActiveRecord"
16
+ adapter: ibm_db
17
+
18
+ # xmlservice common
19
+ xmlservicecommon: &xmlservicecommon
20
+ install: XMLSERVICE
21
+ size: 15000000
22
+ head: "<?xml version='1.0'?>"
23
+ test_i_lib: XMLSERVICE
24
+ test_i_db2_lib: DB2
25
+
26
+ # xmlservice state full private connection (yes XTOOLKIT job)
27
+ xmlserviceprivate: &xmlserviceprivate
28
+ ctl: "*sbmjob"
29
+ ipc: /tmp/ruby042
30
+
31
+ # xmlservice stateless public connection (no XTOOLKIT job)
32
+ xmlservicepublic: &xmlservicepublic
33
+ ctl: "*here"
34
+ ipc: "/none"
35
+
36
+ # ---------------------------------
37
+ # xmlservice using ibm_db
38
+ # ActiveXMLService::Base.establish_connection(
39
+ # :test_yaml => '/path/xmlservice.yml',
40
+ # :test_env => 'sqlpublic'
41
+ #)
42
+ db2private:
43
+ <<: *xmldb2
44
+ <<: *db2profile
45
+ <<: *xmlservicecommon
46
+ <<: *xmlserviceprivate
47
+ db2public:
48
+ <<: *xmldb2
49
+ <<: *db2profile
50
+ <<: *xmlservicecommon
51
+ <<: *xmlservicepublic
52
+
53
+ # ---------------------------------
54
+ # xmlservice using REST (xmlcgi.pgm)
55
+ # ActiveXMLService::Base.establish_connection(
56
+ # :test_yaml => '/path/xmlservice.yml',
57
+ # :test_env => 'restpublic'
58
+ #)
59
+ restprivate:
60
+ <<: *xmlrest
61
+ <<: *db2profile
62
+ <<: *xmlservicecommon
63
+ <<: *xmlserviceprivate
64
+ restpublic:
65
+ <<: *xmlrest
66
+ <<: *db2profile
67
+ <<: *xmlservicecommon
68
+ <<: *xmlservicepublic
69
+
@@ -0,0 +1,57 @@
1
+ # test data for various tables
2
+ require "../test_authorization/auth"
3
+ require "test/unit"
4
+
5
+ class RowColUnitTest < Test::Unit::TestCase
6
+ def match_hash(test,linenbr,text,a,b)
7
+ i = 0
8
+ a.each do |key, value|
9
+ if(b.has_key?(key))
10
+ self.match_value(test,linenbr,"#{text} => #{key}",a[key],b[key])
11
+ else
12
+ k1 = key
13
+ k2 = 'missing'
14
+ assert_match( k2, k1, "#{test}:#{linenbr} mismatch: #{text}[#{k1}] == #{text}[]")
15
+ end
16
+ end
17
+ end
18
+ def match_value(test,linenbr,text,a,b)
19
+ # float/real/decimal/string,
20
+ # you sir are a String/BigDecimal,
21
+ # therefore you must float yourself, etc. ...
22
+ # Ruby perfection be my name (Borg),
23
+ # perhaps yet another reason to use PHP
24
+ case a
25
+ when String
26
+ case b
27
+ when String
28
+ # ok
29
+ else
30
+ b = b.to_s()
31
+ end
32
+ when Integer
33
+ case b
34
+ when Integer
35
+ # ok
36
+ else
37
+ b = b.to_i()
38
+ end
39
+ when Float
40
+ case b
41
+ when Float
42
+ # ok
43
+ else
44
+ b = b.to_f()
45
+ end
46
+ else
47
+ end
48
+ # make a check
49
+ case a
50
+ when String
51
+ assert_match( a, b, "#{test}:#{linenbr} #{text} mismatch: #{a} == #{b}")
52
+ else
53
+ assert_equal( a, b, "#{test}:#{linenbr} #{text} mismatch: #{a} == #{b}")
54
+ end
55
+ end
56
+ end
57
+
@@ -0,0 +1 @@
1
+ 1.3.0 GA5-test
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xmlservice
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Tony Cairns
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Call IBM i PGM, SRVPGM, CMD, PASE
28
+ email: adc@us.ibm.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - LICENSE
34
+ - README_IBM_i
35
+ - lib/adapters/abstract_adapter.rb
36
+ - lib/adapters/db2_adapter.rb
37
+ - lib/adapters/rest_adapter.rb
38
+ - lib/password/password.rb
39
+ - lib/xmlservice.rb
40
+ - test/README_IBM_i
41
+ - test/Rakefile
42
+ - test/genpassword.rb
43
+ - test/test_60000_toolkit_driver/Rakefile
44
+ - test/test_60000_toolkit_driver/test_60010_DriverCallPgmZZCALL.rb
45
+ - test/test_60000_toolkit_driver/test_60110_DriverCallSrvPgmZZARRAY.rb
46
+ - test/test_60000_toolkit_driver/test_60310_DriverCMD.rb
47
+ - test/test_60000_toolkit_driver/test_60510_DriverDataQueue.rb
48
+ - test/test_60000_toolkit_driver/test_60610_DriverCallSrvPgmZZBINARY.rb
49
+ - test/test_60000_toolkit_driver/test_60710_DriverSH.rb
50
+ - test/test_60000_toolkit_driver/test_60910_DriverCallPgmZZMISS.rb
51
+ - test/test_60000_toolkit_driver/test_65010_DriverCallDB2.rb
52
+ - test/test_60000_toolkit_driver/zzassign.rb
53
+ - test/test_60000_toolkit_driver/zzquick.rb
54
+ - test/test_60000_toolkit_driver/zztestrest.rb
55
+ - test/test_60000_toolkit_driver/zzthreadold.rb
56
+ - test/test_70000_toolkit_testonly/Rakefile
57
+ - test/test_70000_toolkit_testonly/test_70010_DriverCallPgmTestOnly.rb
58
+ - test/test_80000_toolkit_dsl/Rakefile
59
+ - test/test_80000_toolkit_dsl/test_80010_DSLCallPgmZZCALL.rb
60
+ - test/test_80000_toolkit_dsl/test_80110_DSLCallSrvPgmZZARRAY.rb
61
+ - test/test_authorization/README_IBM_i
62
+ - test/test_authorization/auth.rb
63
+ - test/test_authorization/key.yml
64
+ - test/test_authorization/password.yml
65
+ - test/test_authorization/xmlservice.yml
66
+ - test/test_data/rowcol.rb
67
+ - version.txt
68
+ homepage: http://github.com/adc/xmlservice
69
+ licenses:
70
+ - BSD
71
+ metadata: {}
72
+ post_install_message:
73
+ rdoc_options: []
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 2.2.2
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: IBM i Access
92
+ test_files: []