fabric-gateway 0.4.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rspec.yml +7 -5
- data/.github/workflows/rubocop.yml +2 -3
- data/.github/workflows/yardoc.yml +1 -2
- data/.rubocop.yml +4 -2
- data/.ruby-version +1 -1
- data/Gemfile +9 -0
- data/README.md +11 -9
- data/Rakefile +0 -1
- data/fabric-gateway.gemspec +2 -11
- data/lib/fabric/client.rb +13 -5
- data/lib/fabric/ec_crypto_suite.rb +48 -25
- data/lib/fabric/entities/identity.rb +1 -1
- data/lib/fabric/entities/status.rb +2 -2
- data/lib/fabric/version.rb +1 -1
- metadata +15 -135
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97655326a3d8126a2a70b6a58063695c944b6620e9b2b8611ed4962d4d95337e
|
4
|
+
data.tar.gz: b7d8f9b3ae323335e40477bd4f66943d8c1a72e194e6624c53dcbc495ab01d4b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8a83cf4492950b145988ce9a7aaf88c49da2a7f23e3e2559f9f4a95ced9997d8bb567696a52995504ae49de90a80c7825055e6affc61b5fab251f9f29eabeeb
|
7
|
+
data.tar.gz: 4b406361a801e789d1bffd7059c595d5f46f76e30e4b8a9c6262fd7d06f381b767b0a1f4f649a37dd6452595352f3f150b43f9e85a920cffc051cfe5e7087c27
|
data/.github/workflows/rspec.yml
CHANGED
@@ -19,19 +19,21 @@ jobs:
|
|
19
19
|
runs-on: ubuntu-latest
|
20
20
|
strategy:
|
21
21
|
matrix:
|
22
|
-
ruby-version: ['
|
22
|
+
ruby-version: ['3.0', '3.1', '3.2']
|
23
23
|
|
24
24
|
steps:
|
25
|
-
- uses: actions/checkout@
|
25
|
+
- uses: actions/checkout@v4
|
26
26
|
- name: Set up Ruby
|
27
27
|
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
28
28
|
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
29
29
|
# uses: ruby/setup-ruby@v1
|
30
|
-
uses: ruby/setup-ruby@
|
30
|
+
uses: ruby/setup-ruby@master
|
31
31
|
with:
|
32
32
|
ruby-version: ${{ matrix.ruby-version }}
|
33
33
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
34
34
|
- name: Run tests
|
35
35
|
run: bundle exec rake
|
36
|
-
|
37
|
-
|
36
|
+
- uses: codecov/codecov-action@v3
|
37
|
+
with:
|
38
|
+
token: 4b75ccca-3149-4610-99fb-3a5aeff4ff00
|
39
|
+
|
@@ -8,10 +8,10 @@ jobs:
|
|
8
8
|
|
9
9
|
steps:
|
10
10
|
- uses: actions/checkout@v2
|
11
|
-
- name: Set up Ruby
|
11
|
+
- name: Set up Ruby 3.0
|
12
12
|
uses: ruby/setup-ruby@v1
|
13
13
|
with:
|
14
|
-
ruby-version:
|
14
|
+
ruby-version: 3.0
|
15
15
|
- name: Cache gems
|
16
16
|
uses: actions/cache@v1
|
17
17
|
with:
|
@@ -22,7 +22,6 @@ jobs:
|
|
22
22
|
- name: Install gems
|
23
23
|
run: |
|
24
24
|
bundle config path vendor/bundle
|
25
|
-
bundle config set without 'default doc job cable storage ujs test db'
|
26
25
|
bundle install --jobs 4 --retry 3
|
27
26
|
- name: Run RuboCop
|
28
27
|
run: bundle exec rubocop --parallel
|
@@ -11,7 +11,7 @@ jobs:
|
|
11
11
|
- name: Set up Ruby 2.7
|
12
12
|
uses: ruby/setup-ruby@v1
|
13
13
|
with:
|
14
|
-
ruby-version: 2
|
14
|
+
ruby-version: 3.2
|
15
15
|
- name: Cache gems
|
16
16
|
uses: actions/cache@v1
|
17
17
|
with:
|
@@ -22,7 +22,6 @@ jobs:
|
|
22
22
|
- name: Install gems
|
23
23
|
run: |
|
24
24
|
bundle config path vendor/bundle
|
25
|
-
bundle config set without 'default doc job cable storage ujs test db'
|
26
25
|
bundle install --jobs 4 --retry 3
|
27
26
|
- name: Run yard stats
|
28
27
|
run: bundle exec yard stats --list-undoc --no-cache --fail-on-warning
|
data/.rubocop.yml
CHANGED
@@ -9,7 +9,7 @@ Metrics/BlockLength:
|
|
9
9
|
|
10
10
|
AllCops:
|
11
11
|
NewCops: enable
|
12
|
-
TargetRubyVersion:
|
12
|
+
TargetRubyVersion: 3.0
|
13
13
|
Exclude:
|
14
14
|
- vendor/bundle/**/*
|
15
15
|
# exclude protoc generated code
|
@@ -20,4 +20,6 @@ AllCops:
|
|
20
20
|
- 'lib/orderer/*'
|
21
21
|
- 'lib/peer/*'
|
22
22
|
|
23
|
-
|
23
|
+
RSpec/SpecFilePathFormat:
|
24
|
+
Exclude:
|
25
|
+
- spec/fabric/entities/*
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
3.2.2
|
data/Gemfile
CHANGED
@@ -7,3 +7,12 @@ gemspec
|
|
7
7
|
|
8
8
|
gem 'rake', '~> 12.3.3'
|
9
9
|
gem 'rspec', '~> 3.0'
|
10
|
+
|
11
|
+
gem 'factory_bot', '~> 6.3.0'
|
12
|
+
gem 'grpc-tools', '~> 1.59.0'
|
13
|
+
gem 'rubocop', '~> 1.57', '>= 1.57.1'
|
14
|
+
gem 'rubocop-rspec', '~> 2.24.1'
|
15
|
+
gem 'simplecov', '~> 0.22.0'
|
16
|
+
gem 'simplecov-cobertura', '~> 2.1'
|
17
|
+
gem 'timecop', '~> 0.9.8'
|
18
|
+
gem 'yard', '~> 0.9.34'
|
data/README.md
CHANGED
@@ -22,14 +22,6 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
$ gem install fabric-gateway
|
24
24
|
|
25
|
-
### ISSUES
|
26
|
-
|
27
|
-
Note, there is an issue with the grpc library for MacOS (https://github.com/grpc/grpc/issues/28271). It results in a segfault in ruby when trying to make a connection.
|
28
|
-
|
29
|
-
Workaround: Either run on linux or use a docker container as a workaround.
|
30
|
-
|
31
|
-
Will update to new version of grpc when fix is released.
|
32
|
-
|
33
25
|
## Usage
|
34
26
|
|
35
27
|
This is a beta stage library with all the main hyperledger gateway calls implemented. Although this library has good unit test coverage, it is fairly new and has not yet been run in production environments. The library will be updated to 1.0.0 when the library has proven to be stable.
|
@@ -56,7 +48,7 @@ client_opts = {
|
|
56
48
|
GRPC::Core::Channel::SSL_TARGET => 'peer0.org1.example.com'
|
57
49
|
}
|
58
50
|
}
|
59
|
-
# optional, if you want to set
|
51
|
+
# optional, if you want to set an absolute deadline for each of the individual calls (in seconds)
|
60
52
|
default_call_options = {
|
61
53
|
endorse_options: { deadline: GRPC::Core::TimeConsts.from_relative_time(5) },
|
62
54
|
evaluate_options: { deadline: GRPC::Core::TimeConsts.from_relative_time(5) },
|
@@ -64,6 +56,16 @@ default_call_options = {
|
|
64
56
|
commit_status_options: { deadline: GRPC::Core::TimeConsts.from_relative_time(5) },
|
65
57
|
chaincode_events_options: { deadline: GRPC::Core::TimeConsts.from_relative_time(60) }
|
66
58
|
}
|
59
|
+
|
60
|
+
# for a relative time from when the call is made, pass an integer instead of a GRPC::Core::TimeConsts (still in seconds)
|
61
|
+
default_call_options = {
|
62
|
+
endorse_options: { deadline: 5 },
|
63
|
+
evaluate_options: { deadline: 5 },
|
64
|
+
submit_options: { deadline: 5 },
|
65
|
+
commit_status_options: { deadline: 5 },
|
66
|
+
chaincode_events_options: { deadline: 60 }
|
67
|
+
}
|
68
|
+
|
67
69
|
creds = GRPC::Core::ChannelCredentials.new(load_certs[0])
|
68
70
|
client=Fabric::Client.new(host: 'localhost:7051', creds: creds, default_call_options: default_call_options, **client_opts)
|
69
71
|
|
data/Rakefile
CHANGED
data/fabric-gateway.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
|
|
12
12
|
spec.description = 'Ruby port of the Hyperledger Fabric Gateway SDK'
|
13
13
|
spec.homepage = 'https://github.com/ethicalidentity/fabric-gateway-ruby'
|
14
14
|
spec.license = 'MIT'
|
15
|
-
spec.required_ruby_version = Gem::Requirement.new('>=
|
15
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 3.0')
|
16
16
|
|
17
17
|
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
18
18
|
|
@@ -28,17 +28,8 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.bindir = 'exe'
|
29
29
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
30
30
|
spec.require_paths = ['lib']
|
31
|
-
spec.add_dependency('google-protobuf', '>= 3.
|
31
|
+
spec.add_dependency('google-protobuf', '~> 3.24', '>= 3.24.4')
|
32
32
|
spec.add_dependency('grpc', '~> 1.42')
|
33
|
-
spec.add_development_dependency('codecov', '~> 0.6.0')
|
34
|
-
spec.add_development_dependency('factory_bot', '~> 6.2.0')
|
35
|
-
spec.add_development_dependency('grpc-tools', '~> 1.46.2')
|
36
|
-
spec.add_development_dependency('rake-notes', '~> 0.2.0')
|
37
|
-
spec.add_development_dependency('rubocop', '~> 1.23.0')
|
38
|
-
spec.add_development_dependency('rubocop-rspec', '~> 2.6.0')
|
39
|
-
spec.add_development_dependency('simplecov', '~> 0.21.2')
|
40
|
-
spec.add_development_dependency('timecop', '~> 0.9.4')
|
41
|
-
spec.add_development_dependency('yard', '~> 0.9.27')
|
42
33
|
spec.metadata = {
|
43
34
|
'rubygems_mfa_required' => 'true'
|
44
35
|
}
|
data/lib/fabric/client.rb
CHANGED
@@ -60,7 +60,7 @@ module Fabric
|
|
60
60
|
# @return [Gateway::EvaluateResponse] evaluate_response
|
61
61
|
#
|
62
62
|
def evaluate(evaluate_request, options = {})
|
63
|
-
@grpc_client.evaluate(evaluate_request,
|
63
|
+
@grpc_client.evaluate(evaluate_request, final_call_options(:evaluate, options))
|
64
64
|
end
|
65
65
|
|
66
66
|
#
|
@@ -72,7 +72,7 @@ module Fabric
|
|
72
72
|
# @return [Gateway::EndorseResponse] endorse_response
|
73
73
|
#
|
74
74
|
def endorse(endorse_request, options = {})
|
75
|
-
@grpc_client.endorse(endorse_request,
|
75
|
+
@grpc_client.endorse(endorse_request, final_call_options(:endorse, options))
|
76
76
|
end
|
77
77
|
|
78
78
|
#
|
@@ -84,7 +84,7 @@ module Fabric
|
|
84
84
|
# @return [Gateway::SubmitResponse] submit_response
|
85
85
|
#
|
86
86
|
def submit(submit_request, options = {})
|
87
|
-
@grpc_client.submit(submit_request,
|
87
|
+
@grpc_client.submit(submit_request, final_call_options(:submit, options))
|
88
88
|
end
|
89
89
|
|
90
90
|
#
|
@@ -97,7 +97,7 @@ module Fabric
|
|
97
97
|
# @return [Gateway::CommitStatusResponse] commit_status_response
|
98
98
|
#
|
99
99
|
def commit_status(commit_status_request, options = {})
|
100
|
-
@grpc_client.commit_status(commit_status_request,
|
100
|
+
@grpc_client.commit_status(commit_status_request, final_call_options(:commit_status, options))
|
101
101
|
end
|
102
102
|
|
103
103
|
#
|
@@ -164,7 +164,7 @@ module Fabric
|
|
164
164
|
#
|
165
165
|
def chaincode_events(chaincode_events_request, options = {}, &block)
|
166
166
|
@grpc_client.chaincode_events(chaincode_events_request,
|
167
|
-
|
167
|
+
final_call_options(:chaincode_events, options), &block)
|
168
168
|
end
|
169
169
|
|
170
170
|
private
|
@@ -195,5 +195,13 @@ module Fabric
|
|
195
195
|
@default_call_options[:commit_status_options] ||= {}
|
196
196
|
@default_call_options[:chaincode_events_options] ||= {}
|
197
197
|
end
|
198
|
+
|
199
|
+
def final_call_options(call_type, call_options)
|
200
|
+
options = @default_call_options["#{call_type}_options".to_sym].merge(call_options || {})
|
201
|
+
if (deadline = options[:deadline]) && !(deadline.is_a? Time)
|
202
|
+
options[:deadline] = GRPC::Core::TimeConsts.from_relative_time(deadline)
|
203
|
+
end
|
204
|
+
options
|
205
|
+
end
|
198
206
|
end
|
199
207
|
end
|
@@ -40,7 +40,7 @@ module Fabric
|
|
40
40
|
|
41
41
|
def verify(public_key, message, signature)
|
42
42
|
digest = digest message
|
43
|
-
openssl_pkey =
|
43
|
+
openssl_pkey = pkey_from_public_key public_key
|
44
44
|
sequence = OpenSSL::ASN1.decode signature
|
45
45
|
return false unless check_malleability sequence, openssl_pkey.group.order
|
46
46
|
|
@@ -48,8 +48,7 @@ module Fabric
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def generate_private_key
|
51
|
-
key = OpenSSL::PKey::EC.
|
52
|
-
key.generate_key!
|
51
|
+
key = OpenSSL::PKey::EC.generate(curve)
|
53
52
|
|
54
53
|
key.private_key.to_s(16).downcase
|
55
54
|
end
|
@@ -133,15 +132,35 @@ module Fabric
|
|
133
132
|
aes.update(encrypted_data) + aes.final
|
134
133
|
end
|
135
134
|
|
136
|
-
|
135
|
+
# when https://github.com/ruby/openssl/pull/555 gets merged, consider refactoring
|
136
|
+
# the code here
|
137
|
+
# rubocop:disable Metrics/AbcSize
|
138
|
+
# rubocop:disable Metrics/MethodLength
|
139
|
+
def pkey_from_private_key(private_key)
|
137
140
|
public_key = restore_public_key private_key
|
138
|
-
key = OpenSSL::PKey::EC.new curve
|
139
|
-
key.private_key = OpenSSL::BN.new private_key, 16
|
140
|
-
key.public_key = OpenSSL::PKey::EC::Point.new key.group,
|
141
|
-
OpenSSL::BN.new(public_key, 16)
|
142
141
|
|
143
|
-
|
144
|
-
|
142
|
+
group = OpenSSL::PKey::EC::Group.new(curve)
|
143
|
+
|
144
|
+
private_key_bn = OpenSSL::BN.new(private_key, 16)
|
145
|
+
public_key_bn = OpenSSL::BN.new(public_key, 16)
|
146
|
+
public_key_point = OpenSSL::PKey::EC::Point.new(group, public_key_bn)
|
147
|
+
|
148
|
+
asn1 = OpenSSL::ASN1::Sequence(
|
149
|
+
[
|
150
|
+
OpenSSL::ASN1::Integer.new(1),
|
151
|
+
OpenSSL::ASN1::OctetString(private_key_bn.to_s(2)),
|
152
|
+
OpenSSL::ASN1::ObjectId(curve, 0, :EXPLICIT),
|
153
|
+
OpenSSL::ASN1::BitString(public_key_point.to_octet_string(:uncompressed), 1, :EXPLICIT)
|
154
|
+
]
|
155
|
+
)
|
156
|
+
|
157
|
+
OpenSSL::PKey::EC.new(asn1.to_der)
|
158
|
+
end
|
159
|
+
# rubocop:enable Metrics/AbcSize
|
160
|
+
# rubocop:enable Metrics/MethodLength
|
161
|
+
|
162
|
+
def pem_from_private_key(private_key)
|
163
|
+
pkey = pkey_from_private_key(private_key)
|
145
164
|
|
146
165
|
pkey.to_pem
|
147
166
|
end
|
@@ -151,29 +170,33 @@ module Fabric
|
|
151
170
|
key.private_key.to_s(16).downcase
|
152
171
|
end
|
153
172
|
|
154
|
-
def
|
173
|
+
def public_key_from_x509_certificate(certificate)
|
155
174
|
cert = OpenSSL::X509::Certificate.new(certificate)
|
156
175
|
cert.public_key.public_key.to_bn.to_s(16).downcase
|
157
176
|
end
|
158
177
|
|
159
|
-
|
160
|
-
|
161
|
-
|
178
|
+
# rubocop:disable Metrics/MethodLength
|
179
|
+
def pkey_from_public_key(public_key)
|
180
|
+
group = OpenSSL::PKey::EC::Group.new(curve)
|
162
181
|
|
163
|
-
|
164
|
-
|
182
|
+
public_key_bn = OpenSSL::BN.new(public_key, 16)
|
183
|
+
public_key_point = OpenSSL::PKey::EC::Point.new(group, public_key_bn)
|
165
184
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
185
|
+
asn1 = OpenSSL::ASN1::Sequence.new(
|
186
|
+
[
|
187
|
+
OpenSSL::ASN1::Sequence.new([
|
188
|
+
OpenSSL::ASN1::ObjectId.new('id-ecPublicKey'),
|
189
|
+
OpenSSL::ASN1::ObjectId.new(group.curve_name)
|
190
|
+
]),
|
191
|
+
OpenSSL::ASN1::BitString.new(public_key_point.to_octet_string(:uncompressed))
|
192
|
+
]
|
193
|
+
)
|
174
194
|
|
175
|
-
|
195
|
+
OpenSSL::PKey::EC.new(asn1.to_der)
|
176
196
|
end
|
197
|
+
# rubocop:enable Metrics/MethodLength
|
198
|
+
|
199
|
+
private
|
177
200
|
|
178
201
|
# barely understand this code - this link provides a good explanation:
|
179
202
|
# http://coders-errand.com/malleability-ecdsa-signatures/
|
@@ -42,7 +42,7 @@ module Fabric
|
|
42
42
|
# @return [boolean] true if valid, false otherwise
|
43
43
|
#
|
44
44
|
def validate_key_integrity
|
45
|
-
cert_pubkey = @crypto_suite.
|
45
|
+
cert_pubkey = @crypto_suite.public_key_from_x509_certificate(certificate)
|
46
46
|
priv_pubkey = @crypto_suite.restore_public_key(@private_key)
|
47
47
|
|
48
48
|
@public_key == cert_pubkey && @public_key == priv_pubkey
|
@@ -6,9 +6,9 @@ module Fabric
|
|
6
6
|
#
|
7
7
|
class Status
|
8
8
|
TRANSACTION_STATUSES = ::Protos::TxValidationCode.constants.map(&::Protos::TxValidationCode.method(:const_get))
|
9
|
-
.
|
9
|
+
.to_h do |i|
|
10
10
|
[::Protos::TxValidationCode.lookup(i), i]
|
11
|
-
end
|
11
|
+
end
|
12
12
|
|
13
13
|
# @return [Integer] Block number in which the transaction committed.
|
14
14
|
attr_reader :block_number
|
data/lib/fabric/version.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fabric-gateway
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Chan
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-protobuf
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.24'
|
17
20
|
- - ">="
|
18
21
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.
|
22
|
+
version: 3.24.4
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.24'
|
24
30
|
- - ">="
|
25
31
|
- !ruby/object:Gem::Version
|
26
|
-
version: 3.
|
32
|
+
version: 3.24.4
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: grpc
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,132 +44,6 @@ dependencies:
|
|
38
44
|
- - "~>"
|
39
45
|
- !ruby/object:Gem::Version
|
40
46
|
version: '1.42'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: codecov
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 0.6.0
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 0.6.0
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: factory_bot
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 6.2.0
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 6.2.0
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: grpc-tools
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 1.46.2
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: 1.46.2
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: rake-notes
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: 0.2.0
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: 0.2.0
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: rubocop
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: 1.23.0
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: 1.23.0
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: rubocop-rspec
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: 2.6.0
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - "~>"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: 2.6.0
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: simplecov
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - "~>"
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: 0.21.2
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - "~>"
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: 0.21.2
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: timecop
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - "~>"
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: 0.9.4
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - "~>"
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: 0.9.4
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: yard
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - "~>"
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: 0.9.27
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - "~>"
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: 0.9.27
|
167
47
|
description: Ruby port of the Hyperledger Fabric Gateway SDK
|
168
48
|
email:
|
169
49
|
- jonathan.chan@ethicalidentity.com
|
@@ -237,7 +117,7 @@ licenses:
|
|
237
117
|
- MIT
|
238
118
|
metadata:
|
239
119
|
rubygems_mfa_required: 'true'
|
240
|
-
post_install_message:
|
120
|
+
post_install_message:
|
241
121
|
rdoc_options: []
|
242
122
|
require_paths:
|
243
123
|
- lib
|
@@ -245,15 +125,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
245
125
|
requirements:
|
246
126
|
- - ">="
|
247
127
|
- !ruby/object:Gem::Version
|
248
|
-
version:
|
128
|
+
version: '3.0'
|
249
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
250
130
|
requirements:
|
251
131
|
- - ">="
|
252
132
|
- !ruby/object:Gem::Version
|
253
133
|
version: '0'
|
254
134
|
requirements: []
|
255
|
-
rubygems_version: 3.
|
256
|
-
signing_key:
|
135
|
+
rubygems_version: 3.4.10
|
136
|
+
signing_key:
|
257
137
|
specification_version: 4
|
258
138
|
summary: Hyperledger Fabric Gateway SDK
|
259
139
|
test_files: []
|