xapixctl 1.0.0 → 1.2.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 +4 -4
- data/.github/workflows/cd.yaml +17 -0
- data/.rubocop.yml +5 -1
- data/.ruby-version +1 -1
- data/Gemfile.lock +63 -41
- data/README.md +8 -0
- data/Rakefile +1 -1
- data/lib/xapixctl.rb +0 -3
- data/lib/xapixctl/base_cli.rb +75 -0
- data/lib/xapixctl/cli.rb +68 -136
- data/lib/xapixctl/phoenix_client.rb +58 -142
- data/lib/xapixctl/phoenix_client/connection.rb +50 -0
- data/lib/xapixctl/phoenix_client/organization_connection.rb +61 -0
- data/lib/xapixctl/phoenix_client/project_connection.rb +164 -0
- data/lib/xapixctl/phoenix_client/result_handler.rb +35 -0
- data/lib/xapixctl/preview_cli.rb +54 -0
- data/lib/xapixctl/sync_cli.rb +166 -0
- data/lib/xapixctl/util.rb +42 -0
- data/lib/xapixctl/version.rb +3 -1
- data/xapixctl.gemspec +16 -9
- metadata +93 -24
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Xapixctl
|
4
|
+
module PhoenixClient
|
5
|
+
class ResultHandler
|
6
|
+
def initialize(default_success_handler:, default_error_handler:)
|
7
|
+
@success_handler = default_success_handler
|
8
|
+
@error_handler = default_error_handler
|
9
|
+
@result_handler = nil
|
10
|
+
yield self if block_given?
|
11
|
+
end
|
12
|
+
|
13
|
+
def on_success(&block); @success_handler = block; self; end
|
14
|
+
|
15
|
+
def on_error(&block); @error_handler = block; self; end
|
16
|
+
|
17
|
+
def prepare_data(proc); @result_handler = proc; self; end
|
18
|
+
|
19
|
+
def formatter(proc); @formatter = proc; self; end
|
20
|
+
|
21
|
+
def run
|
22
|
+
res = yield
|
23
|
+
res = res.present? ? JSON.parse(res) : res
|
24
|
+
res = @result_handler ? @result_handler.call(res) : res
|
25
|
+
res = @formatter ? @formatter.call(res) : res
|
26
|
+
@success_handler.call(res)
|
27
|
+
rescue RestClient::Exception => err
|
28
|
+
response = JSON.parse(err.response) rescue {}
|
29
|
+
@error_handler.call(err, response)
|
30
|
+
rescue SocketError, Errno::ECONNREFUSED => err
|
31
|
+
@error_handler.call(err, nil)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'xapixctl/base_cli'
|
4
|
+
|
5
|
+
module Xapixctl
|
6
|
+
class PreviewCli < BaseCli
|
7
|
+
option :format, aliases: "-f", default: 'text', enum: ['text', 'yaml', 'json'], desc: "Output format"
|
8
|
+
desc "pipeline ID", "Preview a pipeline"
|
9
|
+
long_desc <<-LONGDESC
|
10
|
+
`xapixctl preview pipeline` will return a preview of the given pipeline.
|
11
|
+
|
12
|
+
The preview function will not call any external data sources but calculate a preview based on the provided sample data.
|
13
|
+
|
14
|
+
To preview a pipeline attached to an endpoint, please use `xapixctl preview endpoint` to see the correct preview.
|
15
|
+
|
16
|
+
Examples:
|
17
|
+
\x5> $ xapixctl preview pipeline -o xapix -p some-project pipeline
|
18
|
+
\x5> $ xapixctl preview pipeline -p xapix/some-project pipeline
|
19
|
+
LONGDESC
|
20
|
+
def pipeline(pipeline)
|
21
|
+
puts prj_connection.pipeline_preview(pipeline, format: options[:format].to_sym)
|
22
|
+
end
|
23
|
+
|
24
|
+
option :format, aliases: "-f", default: 'text', enum: ['text', 'yaml', 'json'], desc: "Output format"
|
25
|
+
desc "endpoint ID", "Preview an endpoint"
|
26
|
+
long_desc <<-LONGDESC
|
27
|
+
`xapixctl preview endpoint` will return a preview of the given endpoint.
|
28
|
+
|
29
|
+
The preview function will not call any external data sources but calculate a preview based on the provided sample data.
|
30
|
+
|
31
|
+
Examples:
|
32
|
+
\x5> $ xapixctl preview endpoint -o xapix -p some-project endpoint
|
33
|
+
\x5> $ xapixctl preview endpoint -p xapix/some-project endpoint
|
34
|
+
LONGDESC
|
35
|
+
def endpoint(endpoint)
|
36
|
+
puts prj_connection.endpoint_preview(endpoint, format: options[:format].to_sym)
|
37
|
+
end
|
38
|
+
|
39
|
+
option :format, aliases: "-f", default: 'text', enum: ['text', 'yaml', 'json'], desc: "Output format"
|
40
|
+
desc "stream-processor ID", "Preview a stream processor"
|
41
|
+
long_desc <<-LONGDESC
|
42
|
+
`xapixctl preview stream-processor` will return a preview of the given stream processor.
|
43
|
+
|
44
|
+
The preview function will not call any external data sources but calculate a preview based on the provided sample data.
|
45
|
+
|
46
|
+
Examples:
|
47
|
+
\x5> $ xapixctl preview stream-processor -o xapix -p some-project processor
|
48
|
+
\x5> $ xapixctl preview stream-processor -p xapix/some-project processor
|
49
|
+
LONGDESC
|
50
|
+
def stream_processor(stream_processor)
|
51
|
+
puts prj_connection.stream_processor_preview(stream_processor, format: options[:format].to_sym)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'xapixctl/base_cli'
|
4
|
+
require 'pathname'
|
5
|
+
|
6
|
+
module Xapixctl
|
7
|
+
class SyncCli < BaseCli
|
8
|
+
class_option :credentials, desc: "Whether to include Credential resources in sync", type: :boolean, default: true
|
9
|
+
class_option :exclude_types, desc: "Resource types to exclude from sync", type: :array
|
10
|
+
|
11
|
+
desc "to-dir DIRECTORY", "Syncs resources in project to directory"
|
12
|
+
long_desc <<-LONGDESC
|
13
|
+
`xapixctl sync to-dir DIRECTORY` will export all resources of a given project and remove any additional resources from the directory.
|
14
|
+
|
15
|
+
With --no-credentials you can exclude all credentials from getting exported.
|
16
|
+
|
17
|
+
With --exclude-types you can specify any resource types besides Project you'd like to exclude.
|
18
|
+
|
19
|
+
When excluding types, the excluded types will be recorded in the sync directory in a file called .excluded_types, so that any future syncs will exclude those types.
|
20
|
+
|
21
|
+
Examples:
|
22
|
+
\x5> $ xapixctl sync to-dir ./project_dir -p xapix/some-project
|
23
|
+
\x5> $ xapixctl sync to-dir ./project_dir -p xapix/some-project --no-credentials
|
24
|
+
\x5> $ xapixctl sync to-dir ./project_dir -p xapix/some-project --exclude-types=ApiPublishing ApiPublishingRole Credential
|
25
|
+
LONGDESC
|
26
|
+
def to_dir(dir)
|
27
|
+
sync_path = SyncPath.new(dir, prj_connection.resource_types_for_export, excluded_types)
|
28
|
+
|
29
|
+
res_details = prj_connection.project_resource
|
30
|
+
sync_path.write_file(generate_readme(res_details), 'README.md')
|
31
|
+
sync_path.write_resource_yaml(res_details, 'project')
|
32
|
+
|
33
|
+
sync_path.types_to_sync.each do |type|
|
34
|
+
res_path = sync_path.resource_path(type)
|
35
|
+
prj_connection.resource_ids(type).each do |res_id|
|
36
|
+
res_details = prj_connection.resource(type, res_id)
|
37
|
+
res_path.write_resource_yaml(res_details, res_id)
|
38
|
+
end
|
39
|
+
res_path.remove_outdated_resources
|
40
|
+
end
|
41
|
+
sync_path.update_excluded_types_file
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "from-dir DIRECTORY", "Syncs resources in project from directory"
|
45
|
+
long_desc <<-LONGDESC
|
46
|
+
`xapixctl sync from-dir project dir` will import all resources into the given project from the directory and remove any additional resources which are not present in the directory.
|
47
|
+
|
48
|
+
With --no-credentials you can exclude all credentials from getting exported.
|
49
|
+
|
50
|
+
With --exclude-types you can specify any resource types besides Project you'd like to exclude.
|
51
|
+
|
52
|
+
Examples:
|
53
|
+
\x5> $ xapixctl sync from-dir ./project_dir -p xapix/some-project
|
54
|
+
\x5> $ xapixctl sync from-dir ./project_dir -p xapix/some-project --no-credentials
|
55
|
+
\x5> $ xapixctl sync from-dir ./project_dir -p xapix/some-project --exclude-types=ApiPublishing ApiPublishingRole Credential
|
56
|
+
LONGDESC
|
57
|
+
def from_dir(dir)
|
58
|
+
sync_path = SyncPath.new(dir, prj_connection.resource_types_for_export, excluded_types)
|
59
|
+
|
60
|
+
sync_path.load_resource('project') do |desc|
|
61
|
+
puts "applying #{desc['kind']} #{desc.dig('metadata', 'id')} to #{prj_connection.project}"
|
62
|
+
desc['metadata']['id'] = prj_connection.project
|
63
|
+
prj_connection.organization.apply(desc)
|
64
|
+
end
|
65
|
+
|
66
|
+
outdated_resources = {}
|
67
|
+
sync_path.types_to_sync.each do |type|
|
68
|
+
res_path = sync_path.resource_path(type)
|
69
|
+
updated_resource_ids = []
|
70
|
+
res_path.load_resources do |desc|
|
71
|
+
puts "applying #{desc['kind']} #{desc.dig('metadata', 'id')}"
|
72
|
+
updated_resource_ids += prj_connection.apply(desc)
|
73
|
+
end
|
74
|
+
outdated_resources[type] = prj_connection.resource_ids(type) - updated_resource_ids
|
75
|
+
end
|
76
|
+
|
77
|
+
outdated_resources.each do |type, resource_ids|
|
78
|
+
resource_ids.each do |resource_id|
|
79
|
+
puts "removing #{type} #{resource_id}"
|
80
|
+
prj_connection.delete(type, resource_id)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
class ResourcePath
|
88
|
+
def initialize(path)
|
89
|
+
@path = path
|
90
|
+
@resource_files = []
|
91
|
+
end
|
92
|
+
|
93
|
+
def write_file(content, filename)
|
94
|
+
@path.mkpath
|
95
|
+
unless @path.directory? && @path.writable?
|
96
|
+
warn "Cannot write to #{@path}, please check directory exists and is writable"
|
97
|
+
exit 1
|
98
|
+
end
|
99
|
+
file = @path.join(filename)
|
100
|
+
file.write(content)
|
101
|
+
puts "updated #{file}..."
|
102
|
+
file
|
103
|
+
end
|
104
|
+
|
105
|
+
def write_resource_yaml(res_details, res_name)
|
106
|
+
file = write_file(res_details.to_yaml, "#{res_name}.yaml")
|
107
|
+
@resource_files << file
|
108
|
+
file
|
109
|
+
end
|
110
|
+
|
111
|
+
def load_resources(&block)
|
112
|
+
Util.resources_from_file(@path, ignore_missing: true, &block)
|
113
|
+
end
|
114
|
+
|
115
|
+
def load_resource(res_name, &block)
|
116
|
+
Util.resources_from_file(@path.join("#{res_name}.yaml"), ignore_missing: false, &block)
|
117
|
+
end
|
118
|
+
|
119
|
+
def remove_outdated_resources
|
120
|
+
(@path.glob('*.yaml') - @resource_files).each do |outdated_file|
|
121
|
+
outdated_file.delete
|
122
|
+
puts "removed #{outdated_file}"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
class SyncPath < ResourcePath
|
128
|
+
attr_reader :types_to_sync
|
129
|
+
|
130
|
+
def initialize(dir, all_types, excluded_types)
|
131
|
+
super(Pathname.new(dir))
|
132
|
+
@all_types = all_types
|
133
|
+
@excluded_types_file = @path.join('.excluded_types')
|
134
|
+
@excluded_types = excluded_types || []
|
135
|
+
@excluded_types += @excluded_types_file.read.split if @excluded_types_file.exist?
|
136
|
+
@excluded_types &= @all_types
|
137
|
+
@excluded_types.sort!
|
138
|
+
@types_to_sync = @all_types - @excluded_types
|
139
|
+
puts "Resource types excluded from sync: #{@excluded_types.join(', ')}" if @excluded_types.any?
|
140
|
+
end
|
141
|
+
|
142
|
+
def resource_path(type)
|
143
|
+
ResourcePath.new(@path.join(type.underscore))
|
144
|
+
end
|
145
|
+
|
146
|
+
def update_excluded_types_file
|
147
|
+
@excluded_types_file.write(@excluded_types.join(" ") + "\n") if @excluded_types.any?
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def excluded_types
|
152
|
+
excluded = options[:exclude_types]
|
153
|
+
excluded += ['Credential'] unless options[:credentials]
|
154
|
+
excluded
|
155
|
+
end
|
156
|
+
|
157
|
+
def generate_readme(res_details)
|
158
|
+
<<~EOREADME
|
159
|
+
# #{res_details.dig('definition', 'name')}
|
160
|
+
#{res_details.dig('definition', 'description')}
|
161
|
+
|
162
|
+
Project exported from #{File.join(prj_connection.public_project_url)} by xapixctl v#{Xapixctl::VERSION}.
|
163
|
+
EOREADME
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
module Xapixctl
|
6
|
+
module Util
|
7
|
+
extend self
|
8
|
+
|
9
|
+
class InvalidDocumentStructureError < StandardError
|
10
|
+
def initialize(file)
|
11
|
+
super("#{file} has invalid document structure")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
DOCUMENT_STRUCTURE = %w[version kind metadata definition].freeze
|
16
|
+
|
17
|
+
def resources_from_file(filename, ignore_missing: false)
|
18
|
+
load_files(filename, ignore_missing) do |actual_file, yaml_string|
|
19
|
+
yaml_string.split(/^---\s*\n/).map { |yml| Psych.safe_load(yml) }.compact.each do |doc|
|
20
|
+
raise InvalidDocumentStructureError, actual_file unless (DOCUMENT_STRUCTURE - doc.keys.map(&:to_s)).empty?
|
21
|
+
yield doc
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def load_files(filename, ignore_missing)
|
27
|
+
if filename == '-'
|
28
|
+
yield 'STDIN', $stdin.read
|
29
|
+
else
|
30
|
+
pn = filename.is_a?(Pathname) ? filename : Pathname.new(filename)
|
31
|
+
if pn.directory?
|
32
|
+
pn.glob(["**/*.yaml", "**/*.yml"]).sort.each { |dpn| yield dpn.to_s, dpn.read }
|
33
|
+
elsif pn.exist?
|
34
|
+
yield pn.to_s, pn.read
|
35
|
+
elsif !ignore_missing
|
36
|
+
warn "file not found: #{filename}"
|
37
|
+
exit 1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/xapixctl/version.rb
CHANGED
data/xapixctl.gemspec
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
lib = File.expand_path("lib", __dir__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
5
|
require "xapixctl/version"
|
@@ -8,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
8
10
|
spec.authors = ["Michael Reinsch"]
|
9
11
|
spec.email = ["michael@xapix.io"]
|
10
12
|
|
11
|
-
spec.summary =
|
13
|
+
spec.summary = 'xapix client library and command line tool'
|
12
14
|
spec.homepage = "https://github.com/xapix-io/xapixctl"
|
13
15
|
spec.license = "EPL-2.0"
|
14
16
|
|
@@ -17,20 +19,25 @@ Gem::Specification.new do |spec|
|
|
17
19
|
|
18
20
|
# Specify which files should be added to the gem when it is released.
|
19
21
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
20
|
-
spec.files
|
22
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
21
23
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
22
24
|
end
|
23
25
|
spec.bindir = "exe"
|
24
26
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
25
27
|
spec.require_paths = ["lib"]
|
26
28
|
|
27
|
-
spec.
|
28
|
-
|
29
|
-
spec.add_dependency "
|
29
|
+
spec.required_ruby_version = '>= 2.6'
|
30
|
+
|
31
|
+
spec.add_dependency "activesupport", ">= 5.2.3", "< 6.0.0"
|
32
|
+
spec.add_dependency "rest-client", ">= 2.1.0", "< 3.0.0"
|
33
|
+
spec.add_dependency "thor", ">= 1.0.0", "< 1.2.0"
|
30
34
|
|
31
|
-
spec.add_development_dependency "bundler", "~> 1.
|
32
|
-
spec.add_development_dependency "rake", "~>
|
35
|
+
spec.add_development_dependency "bundler", "~> 2.1.4"
|
36
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
33
37
|
spec.add_development_dependency "relaxed-rubocop", "~> 2.5"
|
34
|
-
spec.add_development_dependency "rspec", "~> 3.0"
|
35
|
-
spec.add_development_dependency "rubocop", "~>
|
38
|
+
spec.add_development_dependency "rspec", "~> 3.10.0"
|
39
|
+
spec.add_development_dependency "rubocop", "~> 1.11.0"
|
40
|
+
spec.add_development_dependency "rubocop-rake", "~> 0.5.1"
|
41
|
+
spec.add_development_dependency "rubocop-rspec", "~> 2.2.0"
|
42
|
+
spec.add_development_dependency "webmock", "~> 3.11.0"
|
36
43
|
end
|
metadata
CHANGED
@@ -1,85 +1,103 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xapixctl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Reinsch
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 5.2.3
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 6.0.0
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: 5.2.3
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 6.0.0
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: rest-client
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
|
-
- - "
|
37
|
+
- - ">="
|
32
38
|
- !ruby/object:Gem::Version
|
33
39
|
version: 2.1.0
|
40
|
+
- - "<"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 3.0.0
|
34
43
|
type: :runtime
|
35
44
|
prerelease: false
|
36
45
|
version_requirements: !ruby/object:Gem::Requirement
|
37
46
|
requirements:
|
38
|
-
- - "
|
47
|
+
- - ">="
|
39
48
|
- !ruby/object:Gem::Version
|
40
49
|
version: 2.1.0
|
50
|
+
- - "<"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 3.0.0
|
41
53
|
- !ruby/object:Gem::Dependency
|
42
54
|
name: thor
|
43
55
|
requirement: !ruby/object:Gem::Requirement
|
44
56
|
requirements:
|
45
|
-
- - "
|
57
|
+
- - ">="
|
46
58
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
59
|
+
version: 1.0.0
|
60
|
+
- - "<"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 1.2.0
|
48
63
|
type: :runtime
|
49
64
|
prerelease: false
|
50
65
|
version_requirements: !ruby/object:Gem::Requirement
|
51
66
|
requirements:
|
52
|
-
- - "
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 1.0.0
|
70
|
+
- - "<"
|
53
71
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
72
|
+
version: 1.2.0
|
55
73
|
- !ruby/object:Gem::Dependency
|
56
74
|
name: bundler
|
57
75
|
requirement: !ruby/object:Gem::Requirement
|
58
76
|
requirements:
|
59
77
|
- - "~>"
|
60
78
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.
|
79
|
+
version: 2.1.4
|
62
80
|
type: :development
|
63
81
|
prerelease: false
|
64
82
|
version_requirements: !ruby/object:Gem::Requirement
|
65
83
|
requirements:
|
66
84
|
- - "~>"
|
67
85
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.
|
86
|
+
version: 2.1.4
|
69
87
|
- !ruby/object:Gem::Dependency
|
70
88
|
name: rake
|
71
89
|
requirement: !ruby/object:Gem::Requirement
|
72
90
|
requirements:
|
73
91
|
- - "~>"
|
74
92
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
93
|
+
version: '13.0'
|
76
94
|
type: :development
|
77
95
|
prerelease: false
|
78
96
|
version_requirements: !ruby/object:Gem::Requirement
|
79
97
|
requirements:
|
80
98
|
- - "~>"
|
81
99
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
100
|
+
version: '13.0'
|
83
101
|
- !ruby/object:Gem::Dependency
|
84
102
|
name: relaxed-rubocop
|
85
103
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,29 +118,71 @@ dependencies:
|
|
100
118
|
requirements:
|
101
119
|
- - "~>"
|
102
120
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
121
|
+
version: 3.10.0
|
104
122
|
type: :development
|
105
123
|
prerelease: false
|
106
124
|
version_requirements: !ruby/object:Gem::Requirement
|
107
125
|
requirements:
|
108
126
|
- - "~>"
|
109
127
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
128
|
+
version: 3.10.0
|
111
129
|
- !ruby/object:Gem::Dependency
|
112
130
|
name: rubocop
|
113
131
|
requirement: !ruby/object:Gem::Requirement
|
114
132
|
requirements:
|
115
133
|
- - "~>"
|
116
134
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
135
|
+
version: 1.11.0
|
136
|
+
type: :development
|
137
|
+
prerelease: false
|
138
|
+
version_requirements: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
140
|
+
- - "~>"
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: 1.11.0
|
143
|
+
- !ruby/object:Gem::Dependency
|
144
|
+
name: rubocop-rake
|
145
|
+
requirement: !ruby/object:Gem::Requirement
|
146
|
+
requirements:
|
147
|
+
- - "~>"
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 0.5.1
|
118
150
|
type: :development
|
119
151
|
prerelease: false
|
120
152
|
version_requirements: !ruby/object:Gem::Requirement
|
121
153
|
requirements:
|
122
154
|
- - "~>"
|
123
155
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.
|
125
|
-
|
156
|
+
version: 0.5.1
|
157
|
+
- !ruby/object:Gem::Dependency
|
158
|
+
name: rubocop-rspec
|
159
|
+
requirement: !ruby/object:Gem::Requirement
|
160
|
+
requirements:
|
161
|
+
- - "~>"
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: 2.2.0
|
164
|
+
type: :development
|
165
|
+
prerelease: false
|
166
|
+
version_requirements: !ruby/object:Gem::Requirement
|
167
|
+
requirements:
|
168
|
+
- - "~>"
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
version: 2.2.0
|
171
|
+
- !ruby/object:Gem::Dependency
|
172
|
+
name: webmock
|
173
|
+
requirement: !ruby/object:Gem::Requirement
|
174
|
+
requirements:
|
175
|
+
- - "~>"
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
version: 3.11.0
|
178
|
+
type: :development
|
179
|
+
prerelease: false
|
180
|
+
version_requirements: !ruby/object:Gem::Requirement
|
181
|
+
requirements:
|
182
|
+
- - "~>"
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: 3.11.0
|
185
|
+
description:
|
126
186
|
email:
|
127
187
|
- michael@xapix.io
|
128
188
|
executables:
|
@@ -130,6 +190,7 @@ executables:
|
|
130
190
|
extensions: []
|
131
191
|
extra_rdoc_files: []
|
132
192
|
files:
|
193
|
+
- ".github/workflows/cd.yaml"
|
133
194
|
- ".gitignore"
|
134
195
|
- ".rspec"
|
135
196
|
- ".rubocop.yml"
|
@@ -143,8 +204,16 @@ files:
|
|
143
204
|
- bin/setup
|
144
205
|
- exe/xapixctl
|
145
206
|
- lib/xapixctl.rb
|
207
|
+
- lib/xapixctl/base_cli.rb
|
146
208
|
- lib/xapixctl/cli.rb
|
147
209
|
- lib/xapixctl/phoenix_client.rb
|
210
|
+
- lib/xapixctl/phoenix_client/connection.rb
|
211
|
+
- lib/xapixctl/phoenix_client/organization_connection.rb
|
212
|
+
- lib/xapixctl/phoenix_client/project_connection.rb
|
213
|
+
- lib/xapixctl/phoenix_client/result_handler.rb
|
214
|
+
- lib/xapixctl/preview_cli.rb
|
215
|
+
- lib/xapixctl/sync_cli.rb
|
216
|
+
- lib/xapixctl/util.rb
|
148
217
|
- lib/xapixctl/version.rb
|
149
218
|
- xapixctl.gemspec
|
150
219
|
homepage: https://github.com/xapix-io/xapixctl
|
@@ -153,7 +222,7 @@ licenses:
|
|
153
222
|
metadata:
|
154
223
|
homepage_uri: https://github.com/xapix-io/xapixctl
|
155
224
|
source_code_uri: https://github.com/xapix-io/xapixctl
|
156
|
-
post_install_message:
|
225
|
+
post_install_message:
|
157
226
|
rdoc_options: []
|
158
227
|
require_paths:
|
159
228
|
- lib
|
@@ -161,15 +230,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
161
230
|
requirements:
|
162
231
|
- - ">="
|
163
232
|
- !ruby/object:Gem::Version
|
164
|
-
version: '
|
233
|
+
version: '2.6'
|
165
234
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
166
235
|
requirements:
|
167
236
|
- - ">="
|
168
237
|
- !ruby/object:Gem::Version
|
169
238
|
version: '0'
|
170
239
|
requirements: []
|
171
|
-
rubygems_version: 3.0.
|
172
|
-
signing_key:
|
240
|
+
rubygems_version: 3.0.9
|
241
|
+
signing_key:
|
173
242
|
specification_version: 4
|
174
243
|
summary: xapix client library and command line tool
|
175
244
|
test_files: []
|