dibuk 0.0.1
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/.github/workflows/ruby.yml +33 -0
- data/.gitignore +12 -0
- data/.idea/.gitignore +2 -0
- data/.idea/.rakeTasks +7 -0
- data/.idea/dibuk.iml +427 -0
- data/.idea/inspectionProfiles/Project_Default.xml +7 -0
- data/.idea/misc.xml +7 -0
- data/.idea/modules.xml +8 -0
- data/.idea/vcs.xml +6 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +62 -0
- data/LICENSE.txt +21 -0
- data/README.md +165 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/dibuk.gemspec +35 -0
- data/lib/dibuk.rb +22 -0
- data/lib/dibuk/client.rb +31 -0
- data/lib/dibuk/http_request.rb +63 -0
- data/lib/dibuk/item.rb +12 -0
- data/lib/dibuk/request.rb +8 -0
- data/lib/dibuk/request/base.rb +24 -0
- data/lib/dibuk/request/license.rb +30 -0
- data/lib/dibuk/request/links.rb +25 -0
- data/lib/dibuk/request/send.rb +30 -0
- data/lib/dibuk/response.rb +8 -0
- data/lib/dibuk/response/base.rb +68 -0
- data/lib/dibuk/response/licensed.rb +9 -0
- data/lib/dibuk/response/linked.rb +70 -0
- data/lib/dibuk/response/sent.rb +26 -0
- data/lib/dibuk/user.rb +11 -0
- data/lib/dibuk/version.rb +6 -0
- metadata +136 -0
data/lib/dibuk/client.rb
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Dibuk
|
|
2
|
+
class Client
|
|
3
|
+
extend Dry::Initializer::Mixin
|
|
4
|
+
|
|
5
|
+
option :seller_id
|
|
6
|
+
option :signature
|
|
7
|
+
option :sandbox, default: proc { false }
|
|
8
|
+
|
|
9
|
+
def license(user, item)
|
|
10
|
+
request = Dibuk::Request::License.new(user, item)
|
|
11
|
+
Dibuk::Response::Licensed.new(http_response: call(request))
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def send(user, item, email)
|
|
15
|
+
request = Dibuk::Request::Send.new(user, item, email)
|
|
16
|
+
Dibuk::Response::Sent.new(http_response: call(request))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def links(user, item)
|
|
20
|
+
request = Dibuk::Request::Links.new(user, item)
|
|
21
|
+
Dibuk::Response::Linked.new(http_response: call(request))
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def call(request)
|
|
27
|
+
http_request = Dibuk::HttpRequest.new(request: request, seller_id: seller_id, signature: signature, sandbox: sandbox)
|
|
28
|
+
http_request.call
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
module Dibuk
|
|
2
|
+
class HttpRequest
|
|
3
|
+
|
|
4
|
+
ENDPOINT_URL = 'https://agregator.dibuk.eu/2_3/call.php'.freeze
|
|
5
|
+
ENDPOINT_SANDBOX_URL = 'https://sandbox.dibuk.eu/agregator/2_3/call.php'.freeze
|
|
6
|
+
|
|
7
|
+
extend Dry::Initializer::Mixin
|
|
8
|
+
|
|
9
|
+
option :request
|
|
10
|
+
option :seller_id
|
|
11
|
+
option :signature
|
|
12
|
+
option :sandbox, default: proc { false }
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def call
|
|
16
|
+
# pr endpoint
|
|
17
|
+
# pr body_sign
|
|
18
|
+
uri = URI(endpoint)
|
|
19
|
+
|
|
20
|
+
net_http = Net::HTTP.new(uri.host, uri.port)
|
|
21
|
+
net_http.use_ssl=true
|
|
22
|
+
request = Net::HTTP::Post.new(uri)
|
|
23
|
+
|
|
24
|
+
net_http.start do |http|
|
|
25
|
+
post_data = URI.encode_www_form(body_sign)
|
|
26
|
+
http.request(request, post_data)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def endpoint
|
|
31
|
+
sandbox? ? ENDPOINT_SANDBOX_URL : ENDPOINT_URL
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def sandbox?
|
|
35
|
+
sandbox
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def body_sign
|
|
39
|
+
params = {
|
|
40
|
+
:a => request.action,
|
|
41
|
+
:v => ::Dibuk::API_VERSION,
|
|
42
|
+
:did => seller_id
|
|
43
|
+
}
|
|
44
|
+
request.body.each do |key, value|
|
|
45
|
+
params[key] = value
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
query = ''
|
|
49
|
+
params.each do |key, value|
|
|
50
|
+
query += '&' unless query == ''
|
|
51
|
+
query += key.to_s
|
|
52
|
+
query += '=' + CGI.escape(value)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
#ph = Faraday::Utils::ParamsHash.new
|
|
56
|
+
#ph.update(params)
|
|
57
|
+
#puts ph.to_query wrong, changing order of keys
|
|
58
|
+
|
|
59
|
+
params[:ch] = OpenSSL::HMAC.hexdigest("sha1", Base64.decode64(signature), query)
|
|
60
|
+
params
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
data/lib/dibuk/item.rb
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Dibuk::Request
|
|
2
|
+
class Base
|
|
3
|
+
|
|
4
|
+
def method
|
|
5
|
+
'POST'
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def body
|
|
9
|
+
''
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def headers
|
|
13
|
+
{
|
|
14
|
+
'Content-Type' => 'application/json',
|
|
15
|
+
#'Authorization' => "Bearer #{client.auth_token}"
|
|
16
|
+
}
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# @return [String]
|
|
20
|
+
def action
|
|
21
|
+
raise 'Action should be implemented'
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Dibuk::Request
|
|
2
|
+
class License < Base
|
|
3
|
+
# @param [User] user
|
|
4
|
+
# @param [Item] item
|
|
5
|
+
# @return [self]
|
|
6
|
+
def initialize(user, item)
|
|
7
|
+
@item = item
|
|
8
|
+
@user = user
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def body
|
|
12
|
+
{
|
|
13
|
+
:book_id => @item.id,
|
|
14
|
+
:user_id => @user.id,
|
|
15
|
+
:user_email => @user.email,
|
|
16
|
+
:user_order => @item.order_id,
|
|
17
|
+
:seller_price => @item.price,
|
|
18
|
+
:payment_channel => @item.payment_id,
|
|
19
|
+
:user_name => @user.name,
|
|
20
|
+
:user_surname => @user.surname,
|
|
21
|
+
:uniq_license_id => @item.unique_id,
|
|
22
|
+
}
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @return [String]
|
|
26
|
+
def action
|
|
27
|
+
'buy'
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Dibuk::Request
|
|
2
|
+
class Links < Base
|
|
3
|
+
# @param [User] user
|
|
4
|
+
# @param [Item] item
|
|
5
|
+
def initialize(user, item)
|
|
6
|
+
@item = item
|
|
7
|
+
@user = user
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def body
|
|
11
|
+
{
|
|
12
|
+
:book_id => @item.id,
|
|
13
|
+
:user_id => @user.id,
|
|
14
|
+
:user_name => @user.name,
|
|
15
|
+
:user_surname => @user.surname,
|
|
16
|
+
:user_email => @user.email,
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# @return [String]
|
|
21
|
+
def action
|
|
22
|
+
'downloadLinks'
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Dibuk::Request
|
|
2
|
+
class Send < Base
|
|
3
|
+
# @param [User] user
|
|
4
|
+
# @param [Item] item
|
|
5
|
+
# @param [string] email
|
|
6
|
+
# @return [Response]
|
|
7
|
+
def initialize(user, item, email)
|
|
8
|
+
@item = item
|
|
9
|
+
@user = user
|
|
10
|
+
@email = email
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# @return [Hash{Symbol->String}]
|
|
14
|
+
def body
|
|
15
|
+
{
|
|
16
|
+
:book_id => @item.id,
|
|
17
|
+
:send_to_email => @user.email,
|
|
18
|
+
:user_id => @user.id,
|
|
19
|
+
:user_name => @user.name,
|
|
20
|
+
:user_surname => @user.surname,
|
|
21
|
+
:user_email => @user.email,
|
|
22
|
+
}
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @return [String]
|
|
26
|
+
def action
|
|
27
|
+
'sendByEmail'
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module Dibuk::Response
|
|
2
|
+
class Base
|
|
3
|
+
extend Dry::Initializer::Mixin
|
|
4
|
+
|
|
5
|
+
option :http_response
|
|
6
|
+
|
|
7
|
+
SUCCESS_HTTP_STATUSES = [200].freeze
|
|
8
|
+
SUCCESS_STATUSES = ['SUCCESS'].freeze
|
|
9
|
+
|
|
10
|
+
def success?
|
|
11
|
+
http_success? && status_success?
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def error?
|
|
15
|
+
!success?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def error_code
|
|
19
|
+
return unless error?
|
|
20
|
+
body[:eNum].to_s
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def error_data
|
|
24
|
+
return unless error?
|
|
25
|
+
body[:eData]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def limit_exceeded?
|
|
29
|
+
error_code == '2015'
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def not_buyed?
|
|
33
|
+
error_code == '2004'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def body
|
|
37
|
+
return unless raw_body
|
|
38
|
+
@body ||=
|
|
39
|
+
begin
|
|
40
|
+
JSON.parse(raw_body, symbolize_names: true)
|
|
41
|
+
rescue => e
|
|
42
|
+
raise InvalidResponseError, e.message
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def http_status_ok
|
|
47
|
+
@http_status_ok ||= http_response.instance_of? Net::HTTPOK
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def http_success?
|
|
53
|
+
http_status_ok
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def status_success?
|
|
57
|
+
self.class::SUCCESS_STATUSES.include?(status)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def status
|
|
61
|
+
body[:status] || ''
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def raw_body
|
|
65
|
+
@raw_body ||= http_response.body
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Dibuk::Response
|
|
4
|
+
class Linked < Base
|
|
5
|
+
SUCCESS_HTTP_STATUSES = [200].freeze
|
|
6
|
+
SUCCESS_STATUSES = [
|
|
7
|
+
'OK'
|
|
8
|
+
].freeze
|
|
9
|
+
|
|
10
|
+
@@formats = {
|
|
11
|
+
"3": {
|
|
12
|
+
'title': 'EPUB',
|
|
13
|
+
'code': 'epub',
|
|
14
|
+
'mimetype': 'application/epub+zip'
|
|
15
|
+
},
|
|
16
|
+
"4": {
|
|
17
|
+
'title': 'PDF',
|
|
18
|
+
'code': 'pdf',
|
|
19
|
+
'mimetype': 'application/pdf'
|
|
20
|
+
},
|
|
21
|
+
"5": {
|
|
22
|
+
'title': 'MOBI',
|
|
23
|
+
'code': 'mobi',
|
|
24
|
+
'mimetype': 'application/x-mobipocket-ebook'
|
|
25
|
+
},
|
|
26
|
+
"1": {
|
|
27
|
+
'title': 'EPUB (Adobe DRM)',
|
|
28
|
+
'code': 'acs_epub',
|
|
29
|
+
'mimetype': 'application/epub+zip'
|
|
30
|
+
},
|
|
31
|
+
"2": {
|
|
32
|
+
'title': 'PDF (Adobe DRM)',
|
|
33
|
+
'code': 'acs_pdf',
|
|
34
|
+
'mimetype': 'application/pdf'
|
|
35
|
+
},
|
|
36
|
+
"6": {'title': 'EPUB', 'code': 'social_epub', 'mimetype': 'application/epub+zip'},
|
|
37
|
+
"7": {'title': 'PDF', 'code': 'social_pdf', 'mimetype': 'application/pdf'},
|
|
38
|
+
"8": {'title': 'MOBI', 'code': 'social_mobi', 'mimetype': 'application/x-mobipocket-ebook'},
|
|
39
|
+
"9 ": {'title': 'MP3', 'code': 'mp3', 'mimetype': 'audio/mpeg'}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def all
|
|
44
|
+
@formats || parse_formats
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def epub
|
|
48
|
+
get_format "epub"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def parse_formats
|
|
54
|
+
@formats || begin
|
|
55
|
+
@formats = {}
|
|
56
|
+
body[:data].each do |num, url|
|
|
57
|
+
@formats[@@formats[num][:code]] = url
|
|
58
|
+
end
|
|
59
|
+
@formats
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# @param [String] format
|
|
64
|
+
# @return [String] download url
|
|
65
|
+
def get_format(format)
|
|
66
|
+
parse_formats
|
|
67
|
+
@formats[format]
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Dibuk::Response
|
|
2
|
+
class Sent < Base
|
|
3
|
+
SUCCESS_HTTP_STATUSES = [200].freeze
|
|
4
|
+
SUCCESS_STATUSES = [
|
|
5
|
+
'OK'
|
|
6
|
+
].freeze
|
|
7
|
+
|
|
8
|
+
WRONG_EMAIL_CODES = [
|
|
9
|
+
'2010', #email is not valid
|
|
10
|
+
'2011', #email domain is not supported
|
|
11
|
+
].freeze
|
|
12
|
+
|
|
13
|
+
NOT_AVAILABLE_FORMAT_CODES = [
|
|
14
|
+
'2012', #format for this email is not available
|
|
15
|
+
'2022', #PDF size is limited to 50MB
|
|
16
|
+
].freeze
|
|
17
|
+
|
|
18
|
+
def wrong_email?
|
|
19
|
+
self.class::WRONG_EMAIL_CODES.include?(status)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def not_available_format?
|
|
23
|
+
self.class::NOT_AVAILABLE_FORMAT_CODES.include?(status)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
data/lib/dibuk/user.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: dibuk
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Samuel Szabo
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: exe
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2020-10-18 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: dry-initializer
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0.4'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0.4'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: webmock
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '3.1'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '3.1'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rubocop-performance
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '1.5'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '1.5'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rubocop-rspec
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '1.36'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '1.36'
|
|
69
|
+
description: Dibuk allow you to download purchased ebooks.
|
|
70
|
+
email:
|
|
71
|
+
- info@dibuk.eu
|
|
72
|
+
executables: []
|
|
73
|
+
extensions: []
|
|
74
|
+
extra_rdoc_files: []
|
|
75
|
+
files:
|
|
76
|
+
- ".github/workflows/ruby.yml"
|
|
77
|
+
- ".gitignore"
|
|
78
|
+
- ".idea/.gitignore"
|
|
79
|
+
- ".idea/.rakeTasks"
|
|
80
|
+
- ".idea/dibuk.iml"
|
|
81
|
+
- ".idea/inspectionProfiles/Project_Default.xml"
|
|
82
|
+
- ".idea/misc.xml"
|
|
83
|
+
- ".idea/modules.xml"
|
|
84
|
+
- ".idea/vcs.xml"
|
|
85
|
+
- CODE_OF_CONDUCT.md
|
|
86
|
+
- Gemfile
|
|
87
|
+
- Gemfile.lock
|
|
88
|
+
- LICENSE.txt
|
|
89
|
+
- README.md
|
|
90
|
+
- Rakefile
|
|
91
|
+
- bin/console
|
|
92
|
+
- bin/setup
|
|
93
|
+
- dibuk.gemspec
|
|
94
|
+
- lib/dibuk.rb
|
|
95
|
+
- lib/dibuk/client.rb
|
|
96
|
+
- lib/dibuk/http_request.rb
|
|
97
|
+
- lib/dibuk/item.rb
|
|
98
|
+
- lib/dibuk/request.rb
|
|
99
|
+
- lib/dibuk/request/base.rb
|
|
100
|
+
- lib/dibuk/request/license.rb
|
|
101
|
+
- lib/dibuk/request/links.rb
|
|
102
|
+
- lib/dibuk/request/send.rb
|
|
103
|
+
- lib/dibuk/response.rb
|
|
104
|
+
- lib/dibuk/response/base.rb
|
|
105
|
+
- lib/dibuk/response/licensed.rb
|
|
106
|
+
- lib/dibuk/response/linked.rb
|
|
107
|
+
- lib/dibuk/response/sent.rb
|
|
108
|
+
- lib/dibuk/user.rb
|
|
109
|
+
- lib/dibuk/version.rb
|
|
110
|
+
homepage: https://www.dibuk.eu
|
|
111
|
+
licenses:
|
|
112
|
+
- MIT
|
|
113
|
+
metadata:
|
|
114
|
+
homepage_uri: https://www.dibuk.eu
|
|
115
|
+
source_code_uri: http://github.com/dibukeu/client-rb
|
|
116
|
+
changelog_uri: http://github.com/dibukeu/client-rb/releases
|
|
117
|
+
post_install_message:
|
|
118
|
+
rdoc_options: []
|
|
119
|
+
require_paths:
|
|
120
|
+
- lib
|
|
121
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
122
|
+
requirements:
|
|
123
|
+
- - ">="
|
|
124
|
+
- !ruby/object:Gem::Version
|
|
125
|
+
version: 2.3.0
|
|
126
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
|
+
requirements:
|
|
128
|
+
- - ">="
|
|
129
|
+
- !ruby/object:Gem::Version
|
|
130
|
+
version: '0'
|
|
131
|
+
requirements: []
|
|
132
|
+
rubygems_version: 3.1.2
|
|
133
|
+
signing_key:
|
|
134
|
+
specification_version: 4
|
|
135
|
+
summary: Ruby wrapper for Dibuk API
|
|
136
|
+
test_files: []
|