blazingdocs 1.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b91b8015b41363e73016f083c266037b25d78cdc36aaa3b7b8e7cd5625ecadfe
4
+ data.tar.gz: d0135b8cfc006264cae8ce41f4247dd22745103009aec6055a5828ceb6d08ea3
5
+ SHA512:
6
+ metadata.gz: e467a216544d7632643b97e693e381c8c4479d462f8792f2d36408b150f35f78a175af1f3725ec88b010d0526a1015aee48555b932bd93ca5b23425a513c0089
7
+ data.tar.gz: fb03c1237a1a534ed97eb2deb7d50da7883503bb5bc0288085a8fdff4a1ae0abd6d1083323f93a0a17da88cc432c0505624d901124d9d536130c56aac46817b9
data/Gemfile ADDED
@@ -0,0 +1 @@
1
+ gem 'multipart-post'
data/Gemfile.lock ADDED
@@ -0,0 +1,12 @@
1
+ GEM
2
+ specs:
3
+ multipart-post (2.1.1)
4
+
5
+ PLATFORMS
6
+ x64-mingw32
7
+
8
+ DEPENDENCIES
9
+ multipart-post
10
+
11
+ BUNDLED WITH
12
+ 2.2.22
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 BlazingDocs
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 all
13
+ 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 THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,56 @@
1
+ # BlazingDocs Ruby client
2
+ High-performance document generation API. Generate documents and reports from СSV, JSON, XML with 99,9% uptime and 24/7 monitoring.
3
+
4
+ ## Installation
5
+
6
+ Add this line to your application's Gemfile:
7
+
8
+ ```ruby
9
+ gem 'blazingdocs'
10
+ ```
11
+ ## Integration basics
12
+
13
+ ### Setup
14
+
15
+ You can get your API Key at https://app.blazingdocs.com
16
+ ```ruby
17
+ client = BlazingDocs.create_client('api-key')
18
+ ```
19
+ ### Getting account info
20
+
21
+ ```ruby
22
+ account = client.get_account
23
+ ```
24
+
25
+ ### Getting merge templates list
26
+
27
+ ```ruby
28
+ templates = client.get_templates
29
+
30
+ # with parent folder path
31
+ templates = client.get_templates('parentfolder')
32
+ ```
33
+
34
+ ### Getting usage info
35
+
36
+ ```ruby
37
+ usage = client.get_usage
38
+ ```
39
+
40
+ ### Executing merge
41
+
42
+ ```ruby
43
+ data = File.open('PO-Template.json').read
44
+ template = File.open('PO-Template.docx')
45
+
46
+ merge_parameters = BlazingDocs::MergeParameters.new
47
+ merge_parameters.sequence = false # data is object
48
+ merge_parameters.data_source_type = 'json' # data in json format
49
+ merge_parameters.strict = true # keep json types
50
+
51
+ merge_result = client.merge(data, 'output.pdf', merge_parameters, template)
52
+ ```
53
+
54
+ ## Documentation
55
+
56
+ See more details here https://docs.blazingdocs.com
@@ -0,0 +1,51 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ require 'blazingdocs/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'blazingdocs'
8
+ spec.version = BlazingDocs::VERSION
9
+ spec.authors = ['Mentalstack']
10
+ spec.email = ['hello@blazingdocs.com']
11
+
12
+ spec.summary = 'BlazingDocs Ruby client'
13
+ spec.description = 'BlazingDocs Ruby client. High-performance document generation API. Generate documents and reports from СSV, JSON, XML with 99,9% uptime and 24/7 monitoring'
14
+ spec.homepage = 'https://blazingdocs.com'
15
+ spec.license = 'MIT'
16
+ spec.metadata = {
17
+ "bug_tracker_uri" => "https://github.com/blazingdocs/blazingdocs-ruby/issues",
18
+ "changelog_uri" => "https://github.com/blazingdocs/blazingdocs-ruby/blob/master/CHANGELOG.md",
19
+ "documentation_uri" => "https://docs.blazingdocs.com",
20
+ "homepage_uri" => spec.homepage,
21
+ "source_code_uri" => "https://github.com/blazingdocs/blazingdocs-ruby"
22
+ }
23
+
24
+ ignored = Regexp.union(
25
+ /\.editorconfig/,
26
+ /\.git/,
27
+ /\.vscode/,
28
+ /^test/,
29
+ /^examples/,
30
+ /^templates/
31
+ )
32
+ spec.files = `git ls-files`.split("\n").reject { |f| ignored.match(f) }
33
+ puts(spec.files)
34
+ #spec.files = `git ls-files -z`.split("\x0").reject do |f|
35
+ # f.match(%r{^(test|spec|features|examples|templates)/})
36
+ #end
37
+ #spec.files.reject! { |fn| fn.include? "gitignore" }
38
+
39
+ spec.bindir = 'exe'
40
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
41
+ spec.require_paths = ['lib']
42
+
43
+ spec.extra_rdoc_files = Dir["README.md", "CHANGELOG.md", "LICENSE.txt"]
44
+ spec.rdoc_options += [
45
+ "--title", "BlazingDocs Ruby client",
46
+ "--main", "README.md",
47
+ "--line-numbers",
48
+ "--inline-source",
49
+ "--quiet"
50
+ ]
51
+ end
@@ -0,0 +1,152 @@
1
+ require 'net/https'
2
+ require 'uri'
3
+ require 'cgi'
4
+ require 'json'
5
+ require 'net/http/post/multipart'
6
+ require 'blazingdocs/utils/hash_utils'
7
+ require 'blazingdocs/models/account_model'
8
+ require 'blazingdocs/models/usage_model'
9
+ require 'blazingdocs/models/template_model'
10
+ require 'blazingdocs/models/operation_model'
11
+ require 'blazingdocs/parameters/merge_parameters'
12
+ require 'blazingdocs/errors/blazing_error'
13
+
14
+ module BlazingDocs
15
+ class BlazingClient
16
+ API_KEY_HEADER ||= 'X-API-Key'
17
+
18
+ DEFAULT_HEADERS ||= {
19
+ 'Accept' => 'application/json'
20
+ }
21
+
22
+ def initialize(api_key, config)
23
+ raise TypeError, 'api_key expects a string' unless api_key.kind_of?(String)
24
+
25
+ @configuration = config.nil? ? Configuration.new : config.clone
26
+ @configuration.api_key = api_key
27
+ end
28
+
29
+ def get_account
30
+ hash = get('/account')
31
+ AccountModel.new(to_snake_keys(hash))
32
+ end
33
+
34
+ def get_templates(path = nil)
35
+ hashes = get("/templates/#{path or ''}")
36
+ hashes.map { |hash| TemplateModel.new(to_snake_keys(hash)) }
37
+ end
38
+
39
+ def get_usage
40
+ hash = get('/usage')
41
+ UsageModel.new(to_snake_keys(hash))
42
+ end
43
+
44
+ def merge(data, file_name, merge_parameters, template)
45
+ form_data = {}
46
+
47
+ raise ArgumentError, 'data is not provided' if data.nil?
48
+ raise ArgumentError, 'data expects a string' unless data.kind_of?(String)
49
+
50
+ form_data['Data'] = data
51
+
52
+ raise ArgumentError, 'file_name is not provided' if file_name.nil?
53
+
54
+ form_data['OutputName'] = file_name
55
+
56
+ raise ArgumentError, 'merge_parameters is not provided' if merge_parameters.nil?
57
+
58
+ if merge_parameters.is_a?(Hash)
59
+ form_data['MergeParameters'] = to_camel_keys(merge_parameters).to_json
60
+ elsif merge_parameters.is_a?(BlazingDocs::MergeParameters)
61
+ form_data['MergeParameters'] = to_camel_keys(to_hash(merge_parameters)).to_json
62
+ else
63
+ raise ArgumentError, 'merge_parameters expects Hash or MergeParameters'
64
+ end
65
+
66
+ raise ArgumentError, 'template is not provided' if template.nil?
67
+
68
+ options = default_options
69
+ if template.is_a?(File)
70
+ form_data['Template'] = UploadIO.new(template, 'application/octet-stream', File.basename(template))
71
+ options = upload_options
72
+ elsif template.is_a?(String)
73
+ form_data['Template'] = template
74
+ end
75
+
76
+ hash = multipart_post('/operation/merge', form_data, options)
77
+ OperationModel.new(to_snake_keys(hash))
78
+ end
79
+
80
+ private
81
+
82
+ include BlazingDocs::Utils
83
+
84
+ attr_accessor :configuration
85
+
86
+ def get(path, params = {}, options = {})
87
+ handle_response do
88
+ headers = DEFAULT_HEADERS.merge({ API_KEY_HEADER => @configuration.api_key })
89
+ request = Net::HTTP::Get.new(request_uri(path, params), headers)
90
+
91
+ http(options).request(request)
92
+ end
93
+ end
94
+
95
+ def multipart_post(path, form_data, options = {})
96
+ handle_response do
97
+ headers = DEFAULT_HEADERS.merge({ API_KEY_HEADER => @configuration.api_key })
98
+ request = Net::HTTP::Post::Multipart.new(path, form_data, headers)
99
+
100
+ http(options).request(request)
101
+ end
102
+ end
103
+
104
+ def handle_response
105
+ response = yield
106
+ status = response.code.to_i
107
+
108
+ if status != 200
109
+ raise(
110
+ BlazingError,
111
+ status: status,
112
+ body: response.body,
113
+ headers: response.each_header.to_h,
114
+ )
115
+ end
116
+
117
+ JSON.parse(response.body)
118
+ end
119
+
120
+ def http(options = {})
121
+ options = default_options if options.empty?
122
+
123
+ http = Net::HTTP.new(base_uri.host, base_uri.port)
124
+ http.open_timeout = options.fetch(:open_timeout)
125
+ http.read_timeout = options.fetch(:read_timeout)
126
+ http.use_ssl = base_uri.scheme == 'https'
127
+ # http.set_debug_output $stderr
128
+ http
129
+ end
130
+
131
+ def request_uri(path, params = {})
132
+ query = URI.encode_www_form(params)
133
+ base_uri.path + path + '?' + query
134
+ end
135
+
136
+ def base_uri
137
+ @configuration.base_uri
138
+ end
139
+
140
+ def default_options
141
+ options = { read_timeout: @configuration.read_timeout }
142
+ options[:open_timeout] = @configuration.connect_timeout if RUBY_VERSION > '2.2.0'
143
+ options
144
+ end
145
+
146
+ def upload_options
147
+ options = default_options
148
+ options[:read_timeout] = @configuration.upload_timeout
149
+ options
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,19 @@
1
+ require 'uri'
2
+
3
+ module BlazingDocs
4
+ class Configuration
5
+ attr_accessor :api_key
6
+ attr_accessor :connect_timeout
7
+ attr_accessor :read_timeout
8
+ attr_accessor :upload_timeout
9
+
10
+ attr_reader :base_uri
11
+
12
+ def initialize
13
+ @base_uri = URI('https://api.blazingdocs.com')
14
+ @connect_timeout = 5
15
+ @read_timeout = 60
16
+ @upload_timeout = 1800
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,41 @@
1
+ module BlazingDocs
2
+ class BlazingError < StandardError
3
+ attr_reader :response
4
+
5
+ def initialize(response)
6
+ @response = response
7
+ end
8
+
9
+ def to_s
10
+ return "the server responded with status #{http_status}" unless json?
11
+
12
+ "Status: #{http_status}. Error message: #{error_message}. Errors: #{errors}".strip
13
+ end
14
+
15
+ def error_message
16
+ response_json['message']
17
+ end
18
+
19
+ def errors
20
+ response_json['errors']
21
+ end
22
+
23
+ def http_status
24
+ response[:status]
25
+ end
26
+
27
+ def response_json
28
+ @response_json ||= begin
29
+ JSON.parse(response[:body])
30
+ rescue JSON::ParserError
31
+ {}
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def json?
38
+ response[:headers]['content-type'] =~ /json/
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,42 @@
1
+ require 'date'
2
+ require 'blazingdocs/models/base_model'
3
+ require 'blazingdocs/models/plan_model'
4
+
5
+ module BlazingDocs
6
+ class AccountModel < BaseModel
7
+ attr_accessor :id
8
+ attr_accessor :api_key
9
+ attr_accessor :obsolete_api_key
10
+ attr_accessor :name
11
+ attr_accessor :is_disabled
12
+
13
+ attr_reader :plan
14
+ attr_reader :created_at
15
+ attr_reader :last_synced_at
16
+ attr_reader :updated_at
17
+
18
+ def plan=(plan_hash)
19
+ @plan = PlanModel.new(plan_hash)
20
+ end
21
+
22
+ def created_at=(created_at_str)
23
+ @created_at = DateTime.iso8601(created_at_str)
24
+ end
25
+
26
+ def last_synced_at=(last_synced_at_str)
27
+ @last_synced_at = if !last_synced_at_str.nil?
28
+ DateTime.iso8601(last_synced_at_str)
29
+ else
30
+ nil
31
+ end
32
+ end
33
+
34
+ def updated_at=(updated_at_str)
35
+ @updated_at = if !updated_at_str.nil?
36
+ DateTime.iso8601(updated_at_str)
37
+ else
38
+ nil
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,9 @@
1
+ module BlazingDocs
2
+ class BaseModel
3
+ def initialize(hash = {})
4
+ hash.each do |option, value|
5
+ self.send("#{option}=", value)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,36 @@
1
+ require 'date'
2
+ require 'blazingdocs/models/base_model'
3
+
4
+ module BlazingDocs
5
+ class FileModel < BaseModel
6
+ attr_accessor :id
7
+ attr_accessor :name
8
+ attr_accessor :content_type
9
+ attr_accessor :download_url
10
+ attr_accessor :length
11
+
12
+ attr_reader :created_at
13
+ attr_reader :last_modified_at
14
+ attr_reader :last_accessed_at
15
+
16
+ def created_at=(created_at_str)
17
+ @created_at = DateTime.iso8601(created_at_str)
18
+ end
19
+
20
+ def last_modified_at=(last_modified_at_str)
21
+ @last_modified_at = if !last_modified_at_str.nil?
22
+ DateTime.iso8601(last_modified_at_str)
23
+ else
24
+ nil
25
+ end
26
+ end
27
+
28
+ def last_accessed_at=(last_accessed_at_str)
29
+ @last_accessed_at = if !last_accessed_at_str.nil?
30
+ DateTime.iso8601(last_accessed_at_str)
31
+ else
32
+ nil
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,23 @@
1
+ require 'blazingdocs/models/base_model'
2
+ require 'blazingdocs/models/file_model'
3
+ require 'blazingdocs/models/operation_type_model'
4
+
5
+ module BlazingDocs
6
+ class OperationModel < BaseModel
7
+ attr_accessor :id
8
+ attr_accessor :page_count
9
+ attr_accessor :elapsed_milliseconds
10
+ attr_accessor :remote_ip_address
11
+
12
+ attr_reader :files
13
+ attr_reader :type
14
+
15
+ def files=(file_hashes)
16
+ @files = file_hashes.map { |hash| FileModel.new(hash) }
17
+ end
18
+
19
+ def type=(type_hash)
20
+ @type = OperationTypeModel.new(type_hash)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,7 @@
1
+ require 'blazingdocs/models/base_model'
2
+
3
+ module BlazingDocs
4
+ class OperationTypeModel < BaseModel
5
+ attr_accessor :name
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ require 'blazingdocs/models/base_model'
2
+
3
+ module BlazingDocs
4
+ class PlanModel < BaseModel
5
+ attr_accessor :id
6
+ attr_accessor :name
7
+ attr_accessor :price
8
+ attr_accessor :price_per_unit
9
+ attr_accessor :quota
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ require 'blazingdocs/models/file_model'
2
+
3
+ module BlazingDocs
4
+ class TemplateModel < FileModel
5
+ end
6
+ end
@@ -0,0 +1,9 @@
1
+ require 'blazingdocs/models/base_model'
2
+
3
+ module BlazingDocs
4
+ class UsageModel < BaseModel
5
+ attr_accessor :quota
6
+ attr_accessor :page_count
7
+ attr_accessor :usage
8
+ end
9
+ end
@@ -0,0 +1,43 @@
1
+ module BlazingDocs
2
+ DATA_SOURCE_TYPES ||= {
3
+ 'csv' => 'Csv',
4
+ 'json' => 'Json',
5
+ 'xml' => 'Xml'
6
+ }
7
+
8
+ class MergeParameters
9
+ attr_accessor :data_source_name
10
+ attr_accessor :parse_columns
11
+ attr_accessor :sequence
12
+ attr_accessor :data_source_type
13
+ attr_accessor :strict
14
+
15
+ def initialize(sequence = false, data_source_type = 'json', strict = false, data_source_name = 'data', parse_columns = false)
16
+ @data_source_name = data_source_name
17
+
18
+ if !!sequence == sequence
19
+ @sequence = sequence
20
+ else
21
+ raise TypeError, 'sequence expects to be boolean'
22
+ end
23
+
24
+ if !DATA_SOURCE_TYPES[data_source_type.downcase].nil?
25
+ @data_source_type = DATA_SOURCE_TYPES[data_source_type.downcase]
26
+ else
27
+ raise TypeError, 'data_source_type expects csv, json or xml'
28
+ end
29
+
30
+ if !!strict == strict
31
+ @strict = strict
32
+ else
33
+ raise TypeError, 'strict expects to be boolean'
34
+ end
35
+
36
+ if !!parse_columns == parse_columns
37
+ @parse_columns = parse_columns
38
+ else
39
+ raise TypeError, 'parse_columns expects to be boolean'
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,82 @@
1
+ module BlazingDocs
2
+ module Utils
3
+
4
+ def to_snake_keys(value = {})
5
+ case value
6
+ when Array
7
+ value.map { |v| to_snake_keys(v) }
8
+ when Hash
9
+ snake_hash(value)
10
+ else
11
+ value
12
+ end
13
+ end
14
+
15
+ def to_camel_keys(value = {})
16
+ case value
17
+ when Array
18
+ value.map { |v| to_camel_keys(v) }
19
+ when Hash
20
+ camel_hash(value)
21
+ else
22
+ value
23
+ end
24
+ end
25
+
26
+ def to_hash(obj)
27
+ hash = {}
28
+ obj.instance_variables.each { |var| hash[var.to_s.delete('@')] = obj.instance_variable_get(var) }
29
+ hash
30
+ end
31
+
32
+ private
33
+
34
+ def snake_hash(value)
35
+ value.map { |k, v| [underscore_key(k), to_snake_keys(v)] }.to_h
36
+ end
37
+
38
+ def underscore_key(key)
39
+ case key
40
+ when Symbol
41
+ underscore(key.to_s).to_sym
42
+ when String
43
+ underscore(key)
44
+ else
45
+ key
46
+ end
47
+ end
48
+
49
+ def underscore(string)
50
+ @__memoize_underscore ||= {}
51
+
52
+ return @__memoize_underscore[string] if @__memoize_underscore[string]
53
+
54
+ @__memoize_underscore[string] =
55
+ string.tr("::", "/")
56
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
57
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
58
+ .tr("-", "_")
59
+ .downcase
60
+ @__memoize_underscore[string]
61
+ end
62
+
63
+ def camel_hash(value)
64
+ value.map { |k, v| [camel_case_key(k), to_camel_keys(v)] }.to_h
65
+ end
66
+
67
+ def camel_case_key(key)
68
+ case key
69
+ when Symbol
70
+ camel_case_lower(key.to_s).to_sym
71
+ when String
72
+ camel_case_lower(key)
73
+ else
74
+ key
75
+ end
76
+ end
77
+
78
+ def camel_case_lower(string)
79
+ string.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,3 @@
1
+ module BlazingDocs
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,19 @@
1
+ require 'blazingdocs/version'
2
+ require 'blazingdocs/configuration'
3
+ require 'blazingdocs/blazing_client'
4
+
5
+ module BlazingDocs
6
+ module_function
7
+
8
+ def configure
9
+ yield(config)
10
+ end
11
+
12
+ def config
13
+ @config ||= Configuration.new
14
+ end
15
+
16
+ def create_client(api_key)
17
+ BlazingClient.new(api_key, config)
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: blazingdocs
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Mentalstack
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-12-19 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: BlazingDocs Ruby client. High-performance document generation API. Generate
14
+ documents and reports from СSV, JSON, XML with 99,9% uptime and 24/7 monitoring
15
+ email:
16
+ - hello@blazingdocs.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files:
20
+ - README.md
21
+ files:
22
+ - Gemfile
23
+ - Gemfile.lock
24
+ - LICENSE
25
+ - README.md
26
+ - blazingdocs.gemspec
27
+ - lib/blazingdocs.rb
28
+ - lib/blazingdocs/blazing_client.rb
29
+ - lib/blazingdocs/configuration.rb
30
+ - lib/blazingdocs/errors/blazing_error.rb
31
+ - lib/blazingdocs/models/account_model.rb
32
+ - lib/blazingdocs/models/base_model.rb
33
+ - lib/blazingdocs/models/file_model.rb
34
+ - lib/blazingdocs/models/operation_model.rb
35
+ - lib/blazingdocs/models/operation_type_model.rb
36
+ - lib/blazingdocs/models/plan_model.rb
37
+ - lib/blazingdocs/models/template_model.rb
38
+ - lib/blazingdocs/models/usage_model.rb
39
+ - lib/blazingdocs/parameters/merge_parameters.rb
40
+ - lib/blazingdocs/utils/hash_utils.rb
41
+ - lib/blazingdocs/version.rb
42
+ homepage: https://blazingdocs.com
43
+ licenses:
44
+ - MIT
45
+ metadata:
46
+ bug_tracker_uri: https://github.com/blazingdocs/blazingdocs-ruby/issues
47
+ changelog_uri: https://github.com/blazingdocs/blazingdocs-ruby/blob/master/CHANGELOG.md
48
+ documentation_uri: https://docs.blazingdocs.com
49
+ homepage_uri: https://blazingdocs.com
50
+ source_code_uri: https://github.com/blazingdocs/blazingdocs-ruby
51
+ post_install_message:
52
+ rdoc_options:
53
+ - "--title"
54
+ - BlazingDocs Ruby client
55
+ - "--main"
56
+ - README.md
57
+ - "--line-numbers"
58
+ - "--inline-source"
59
+ - "--quiet"
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ requirements: []
73
+ rubygems_version: 3.2.22
74
+ signing_key:
75
+ specification_version: 4
76
+ summary: BlazingDocs Ruby client
77
+ test_files: []