bump-cli 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f05f855eadd927f38eaa826e35ca2261414d3e46b004a1f0ebea38cf3687def8
4
- data.tar.gz: 68b1c1580133034e65b7e501caf218ebbeb4f496c9bb9acc9c2bb5276d0945fa
3
+ metadata.gz: a76424c2ad6eed8a8b65caa28e57e26c7efb892b8909a9e6aed60871b9964105
4
+ data.tar.gz: 4f597a0961e36cfb2108409198a11abae798333b49fadf298fbd0f7b332c529a
5
5
  SHA512:
6
- metadata.gz: b83e980a9565c4b0ccb28d4853ec70da95e35c3579df9efc251555c370abe82d1568d1005b5e43a505a32fbcad8569181f5c2dca6341af07832663e15025ca16
7
- data.tar.gz: d6bff352f2a5611cfd293ee9eb142277e9931f0e675f9769ae2f57c0ca534d5d8dca412737529f2126a5624660af1ef7b49b3241c6fa48a604478c5138e192f0
6
+ metadata.gz: bda499aed9b3edfb4600ccd8ede77a65dd6bd98403937f29b714c557e8fb5457f8258d49d55ab5968499c5e10ff67b6a0cd446d3304a5b0ea69afeab20f0e47d
7
+ data.tar.gz: 2fa948728d09d134b552954d12d2f64d3141bf5c0422ffdd95ec853afed861aed0440c4c6a3ff5378025f5788d1ceb535e04c37a12e8b4180441d35b850b499c
@@ -1,5 +1,5 @@
1
- require 'open-uri'
2
- require 'bump/cli/tools/uuid'
1
+ require 'bump/cli/definition'
2
+ require 'bump/cli/uuid'
3
3
 
4
4
  module Bump
5
5
  class CLI
@@ -20,7 +20,7 @@ module Bump
20
20
 
21
21
  compact(
22
22
  {
23
- definition: open(file).read,
23
+ definition: prepare_file(file, options),
24
24
  specification: options[:specification],
25
25
  validation: options[:validation],
26
26
  auto_create_documentation: options[:'auto-create']
@@ -28,6 +28,10 @@ module Bump
28
28
  )
29
29
  end
30
30
 
31
+ def prepare_file(file, options)
32
+ Definition.new(file, import_external_references: options[:'import-external-references']).prepare
33
+ end
34
+
31
35
  def deprecation_warning(options)
32
36
  if present?(options[:id])
33
37
  puts "[DEPRECATION WARNING] --id option is deprecated. Please use --doc instead."
@@ -56,7 +60,7 @@ module Bump
56
60
  end
57
61
 
58
62
  def documentation_uuid?(options)
59
- Bump::CLI::Tools::UUID.valid?(options[:doc])
63
+ Bump::CLI::UUID.valid?(options[:doc])
60
64
  end
61
65
 
62
66
  def documentation_slug?(options)
@@ -64,7 +68,7 @@ module Bump
64
68
  end
65
69
 
66
70
  def hub_uuid?(options)
67
- Bump::CLI::Tools::UUID.valid?(options[:hub])
71
+ Bump::CLI::UUID.valid?(options[:hub])
68
72
  end
69
73
 
70
74
  def hub_slug?(options)
@@ -14,6 +14,7 @@ module Bump
14
14
  option :specification, desc: "Specification of the definition"
15
15
  option :validation, desc: "Validation mode", values: %w(basic strict), default: 'basic'
16
16
  option :'auto-create', type: :boolean, default: false, desc: 'Automatically create the documentation if needed (only available with a hub and when specifying a slug for documentation)'
17
+ option :'import-external-references', type: :boolean, default: false, desc: 'Import external $refs (URI or file system) into the specification before sending it to Bump servers'
17
18
 
18
19
  def call(file:, **options)
19
20
  with_errors_rescued do
@@ -6,6 +6,7 @@ module Bump
6
6
  argument :file, required: true, desc: "Path or URL to your API documentation file. OpenAPI (2.0 to 3.0.2) and AsyncAPI (2.0) specifications are currently supported."
7
7
  option :specification, desc: "Specification of the definition"
8
8
  option :validation, desc: "Validation mode", values: %w(basic strict), default: 'basic'
9
+ option :'import-external-references', type: :boolean, default: false, desc: 'Import external $refs (URI or file system) into the specification before sending it to Bump servers'
9
10
 
10
11
  def call(file:, **options)
11
12
  with_errors_rescued do
@@ -14,6 +14,7 @@ module Bump
14
14
  option :specification, desc: "Specification of the definition"
15
15
  option :validation, desc: "Validation mode", values: %w(basic strict), default: 'basic'
16
16
  option :'auto-create', type: :boolean, default: false, desc: 'Automatically create the documentation if needed (only available with a hub and when specifying a slug for documentation)'
17
+ option :'import-external-references', type: :boolean, default: false, desc: 'Import external $refs (URI or file system) into the specification before sending it to Bump servers'
17
18
 
18
19
  def call(file:, **options)
19
20
  with_errors_rescued do
@@ -0,0 +1,43 @@
1
+ require 'open-uri'
2
+ require 'bump/cli/parser'
3
+ require 'bump/cli/references'
4
+
5
+ module Bump
6
+ class CLI
7
+ class Definition
8
+ def initialize(path, import_external_references: false)
9
+ @path = path
10
+ @import_external_references = import_external_references
11
+ end
12
+
13
+ def prepare
14
+ if !import_external_references
15
+ read_file
16
+ else
17
+ parse_file_and_import_external_references
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :path, :import_external_references
24
+
25
+ def read_file
26
+ open(path).read
27
+ end
28
+
29
+ def parse_file_and_import_external_references
30
+ original_format, definition = parser.load(read_file)
31
+
32
+ references = References.new(definition, base_path: path)
33
+ references.import!
34
+
35
+ parser.dump(references.definition, original_format)
36
+ end
37
+
38
+ def parser
39
+ @parser ||= Parser.new
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,24 @@
1
+ require 'json'
2
+ require 'yaml'
3
+
4
+ module Bump
5
+ class CLI
6
+ class Parser
7
+ def load(content)
8
+ [:json, ::JSON.parse(content)]
9
+ rescue ::JSON::ParserError => e
10
+ [:yaml, ::YAML.safe_load(content, [Date, Time])]
11
+ rescue ::Psych::SyntaxError
12
+ raise 'Invalid format: definition file should be valid YAML or JSON'
13
+ end
14
+
15
+ def dump(definition, format)
16
+ if format == :yaml
17
+ ::YAML.dump(definition)
18
+ else
19
+ ::JSON.dump(definition)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,88 @@
1
+ require 'open-uri'
2
+ require 'pathname'
3
+
4
+ module Bump
5
+ class CLI
6
+ class References
7
+ attr_reader :definition
8
+
9
+ def initialize(definition, base_path: '')
10
+ @definition = definition
11
+ @base_path = cleanup(base_path)
12
+ @processed = false
13
+ @external_references = {}
14
+ end
15
+
16
+ def import!
17
+ if !processed
18
+ @definition = traverse_and_replace_external_references(definition)
19
+ import_references
20
+ @processed = true
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :base_path, :processed, :external_references
27
+
28
+ def traverse_and_replace_external_references(current, parent = nil)
29
+ current.each do |key, value|
30
+ if key == '$ref'
31
+ current[key] = replace_external_reference(value)
32
+ elsif value.is_a?(Hash)
33
+ traverse_and_replace_external_references(value, key)
34
+ end
35
+ end
36
+ end
37
+
38
+ def replace_external_reference(reference)
39
+ if external?(reference)
40
+ if external_references[reference].nil?
41
+ @external_references[reference] = "#{external_references.count + 1}"
42
+ end
43
+
44
+ subpath = reference[/#(.*)$/, 1]
45
+ "#/components/x-imported/#{external_references[reference]}#{ '/' + subpath if !subpath.nil? }"
46
+ else
47
+ reference
48
+ end
49
+ end
50
+
51
+ def import_references
52
+ if external_references.count > 0
53
+ @definition['components'] = {} if @definition['components'].nil?
54
+ @definition['components']['x-imported'] = {} if @definition['components']['x-imported'].nil?
55
+
56
+ external_references.each do |key, value|
57
+ _, @definition['components']['x-imported'][value.to_s] = Parser.new.load(open(prepare_path(key)).read)
58
+ end
59
+ end
60
+ end
61
+
62
+ def prepare_path(key)
63
+ key = key.sub(/#.*/, '')
64
+ if url?(key) || absolute_path?(key)
65
+ key
66
+ else
67
+ base_path + key
68
+ end
69
+ end
70
+
71
+ def external?(reference)
72
+ !reference.start_with?('#')
73
+ end
74
+
75
+ def url?(path)
76
+ path.start_with?('http')
77
+ end
78
+
79
+ def absolute_path?(path)
80
+ path.start_with?('/')
81
+ end
82
+
83
+ def cleanup(path)
84
+ Pathname.new(path).dirname.to_s + Pathname::SEPARATOR_LIST
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,11 @@
1
+ module Bump
2
+ class CLI
3
+ class UUID
4
+ REGEXP = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/
5
+
6
+ def self.valid?(string)
7
+ string.to_s =~ REGEXP
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,5 +1,5 @@
1
1
  module Bump
2
2
  class CLI
3
- VERSION = "0.5.1"
3
+ VERSION = "0.6.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bump-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mehdi Lahmam
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-04-08 00:00:00.000000000 Z
12
+ date: 2020-06-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: dry-cli
@@ -155,7 +155,10 @@ files:
155
155
  - lib/bump/cli/commands/deploy.rb
156
156
  - lib/bump/cli/commands/preview.rb
157
157
  - lib/bump/cli/commands/validate.rb
158
- - lib/bump/cli/tools/uuid.rb
158
+ - lib/bump/cli/definition.rb
159
+ - lib/bump/cli/parser.rb
160
+ - lib/bump/cli/references.rb
161
+ - lib/bump/cli/uuid.rb
159
162
  - lib/bump/cli/version.rb
160
163
  homepage: https://bump.sh
161
164
  licenses:
@@ -1,13 +0,0 @@
1
- module Bump
2
- class CLI
3
- module Tools
4
- class UUID
5
- REGEXP = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/
6
-
7
- def self.valid?(string)
8
- string.to_s =~ REGEXP
9
- end
10
- end
11
- end
12
- end
13
- end