xapixctl 1.1.2 → 1.2.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 +4 -4
- data/.github/workflows/cd.yaml +19 -0
- data/.ruby-version +1 -1
- data/Gemfile.lock +53 -36
- data/lib/xapixctl.rb +0 -3
- data/lib/xapixctl/base_cli.rb +45 -12
- data/lib/xapixctl/cli.rb +40 -62
- data/lib/xapixctl/phoenix_client.rb +36 -259
- 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 +6 -18
- data/lib/xapixctl/sync_cli.rb +97 -0
- data/lib/xapixctl/version.rb +1 -1
- data/xapixctl.gemspec +10 -3
- metadata +58 -10
@@ -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
|
data/lib/xapixctl/preview_cli.rb
CHANGED
@@ -4,8 +4,6 @@ require 'xapixctl/base_cli'
|
|
4
4
|
|
5
5
|
module Xapixctl
|
6
6
|
class Preview < BaseCli
|
7
|
-
option :org, aliases: "-o", desc: "Organization", required: true
|
8
|
-
option :project, aliases: "-p", desc: "Project", required: true
|
9
7
|
option :format, aliases: "-f", default: 'text', enum: ['text', 'yaml', 'json'], desc: "Output format"
|
10
8
|
desc "pipeline ID", "Preview a pipeline"
|
11
9
|
long_desc <<-LONGDESC
|
@@ -17,16 +15,12 @@ module Xapixctl
|
|
17
15
|
|
18
16
|
Examples:
|
19
17
|
\x5> $ xapixctl preview pipeline -o xapix -p some-project pipeline
|
18
|
+
\x5> $ xapixctl preview pipeline -p xapix/some-project pipeline
|
20
19
|
LONGDESC
|
21
20
|
def pipeline(pipeline)
|
22
|
-
|
23
|
-
res.on_success { |preview| puts preview }
|
24
|
-
res.on_error { |err, result| warn_api_error('could not fetch preview', err, result) }
|
25
|
-
end
|
21
|
+
puts prj_connection.pipeline_preview(pipeline, format: options[:format].to_sym)
|
26
22
|
end
|
27
23
|
|
28
|
-
option :org, aliases: "-o", desc: "Organization", required: true
|
29
|
-
option :project, aliases: "-p", desc: "Project", required: true
|
30
24
|
option :format, aliases: "-f", default: 'text', enum: ['text', 'yaml', 'json'], desc: "Output format"
|
31
25
|
desc "endpoint ID", "Preview an endpoint"
|
32
26
|
long_desc <<-LONGDESC
|
@@ -36,16 +30,12 @@ module Xapixctl
|
|
36
30
|
|
37
31
|
Examples:
|
38
32
|
\x5> $ xapixctl preview endpoint -o xapix -p some-project endpoint
|
33
|
+
\x5> $ xapixctl preview endpoint -p xapix/some-project endpoint
|
39
34
|
LONGDESC
|
40
35
|
def endpoint(endpoint)
|
41
|
-
|
42
|
-
res.on_success { |preview| puts preview }
|
43
|
-
res.on_error { |err, result| warn_api_error('could not fetch preview', err, result) }
|
44
|
-
end
|
36
|
+
puts prj_connection.endpoint_preview(endpoint, format: options[:format].to_sym)
|
45
37
|
end
|
46
38
|
|
47
|
-
option :org, aliases: "-o", desc: "Organization", required: true
|
48
|
-
option :project, aliases: "-p", desc: "Project", required: true
|
49
39
|
option :format, aliases: "-f", default: 'text', enum: ['text', 'yaml', 'json'], desc: "Output format"
|
50
40
|
desc "stream-processor ID", "Preview a stream processor"
|
51
41
|
long_desc <<-LONGDESC
|
@@ -55,12 +45,10 @@ module Xapixctl
|
|
55
45
|
|
56
46
|
Examples:
|
57
47
|
\x5> $ xapixctl preview stream-processor -o xapix -p some-project processor
|
48
|
+
\x5> $ xapixctl preview stream-processor -p xapix/some-project processor
|
58
49
|
LONGDESC
|
59
50
|
def stream_processor(stream_processor)
|
60
|
-
|
61
|
-
res.on_success { |preview| puts preview }
|
62
|
-
res.on_error { |err, result| warn_api_error('could not fetch preview', err, result) }
|
63
|
-
end
|
51
|
+
puts prj_connection.stream_processor_preview(stream_processor, format: options[:format].to_sym)
|
64
52
|
end
|
65
53
|
end
|
66
54
|
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'xapixctl/base_cli'
|
4
|
+
|
5
|
+
module Xapixctl
|
6
|
+
class Sync < BaseCli
|
7
|
+
option :org, aliases: "-o", desc: "Organization"
|
8
|
+
option :project, aliases: "-p", desc: "Project"
|
9
|
+
desc "to-dir DIRECTORY", "Syncs resources in project to directory"
|
10
|
+
long_desc <<-LONGDESC
|
11
|
+
`xapixctl sync to-dir project dir` will export all resources of a given project and remove any additional resources from the directory.
|
12
|
+
|
13
|
+
Examples:
|
14
|
+
\x5> $ xapixctl sync to-dir xapix/some-project ./project_dir
|
15
|
+
LONGDESC
|
16
|
+
def to_dir(dir)
|
17
|
+
sync_path = Pathname.new(dir)
|
18
|
+
|
19
|
+
res_details = prj_connection.project_resource
|
20
|
+
write_resource_to(res_details, sync_path, 'project')
|
21
|
+
sync_path.join('README.md').write(generate_readme(res_details))
|
22
|
+
|
23
|
+
prj_connection.resource_types_for_export.each do |type|
|
24
|
+
res_path = sync_path.join(type.underscore)
|
25
|
+
new_files = []
|
26
|
+
prj_connection.resource_ids(type).each do |res_id|
|
27
|
+
res_details = prj_connection.resource(type, res_id)
|
28
|
+
new_files << write_resource_to(res_details, res_path, res_id)
|
29
|
+
end
|
30
|
+
(res_path.glob('*.yaml') - new_files).each do |outdated_file|
|
31
|
+
outdated_file.delete
|
32
|
+
puts "removed #{outdated_file}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
option :org, aliases: "-o", desc: "Organization"
|
38
|
+
option :project, aliases: "-p", desc: "Project"
|
39
|
+
desc "from-dir DIRECTORY", "Syncs resources in project from directory"
|
40
|
+
long_desc <<-LONGDESC
|
41
|
+
`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.
|
42
|
+
|
43
|
+
Examples:
|
44
|
+
\x5> $ xapixctl sync from-dir xapix/some-project ./project_dir
|
45
|
+
LONGDESC
|
46
|
+
def from_dir(dir)
|
47
|
+
sync_path = Pathname.new(dir)
|
48
|
+
|
49
|
+
resources_from_file(sync_path.join('project.yaml'), ignore_missing: false) do |desc|
|
50
|
+
puts "applying #{desc['kind']} #{desc.dig('metadata', 'id')} to #{prj_connection.project}"
|
51
|
+
desc['metadata']['id'] = prj_connection.project
|
52
|
+
prj_connection.organization.apply(desc)
|
53
|
+
end
|
54
|
+
|
55
|
+
outdated_resources = {}
|
56
|
+
prj_connection.resource_types_for_export.each do |type|
|
57
|
+
res_path = sync_path.join(type.underscore)
|
58
|
+
updated_resource_ids = []
|
59
|
+
resources_from_file(res_path, ignore_missing: true) do |desc|
|
60
|
+
puts "applying #{desc['kind']} #{desc.dig('metadata', 'id')}"
|
61
|
+
updated_resource_ids += prj_connection.apply(desc)
|
62
|
+
end
|
63
|
+
outdated_resources[type] = prj_connection.resource_ids(type) - updated_resource_ids
|
64
|
+
end
|
65
|
+
|
66
|
+
outdated_resources.each do |type, resource_ids|
|
67
|
+
resource_ids.each do |resource_id|
|
68
|
+
puts "removing #{type} #{resource_id}"
|
69
|
+
prj_connection.delete(type, resource_id)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def write_resource_to(res_details, res_path, res_name)
|
77
|
+
res_path.mkpath
|
78
|
+
unless res_path.directory? && res_path.writable?
|
79
|
+
warn "Cannot write to #{dir}, please check directory exists and is writable"
|
80
|
+
exit 1
|
81
|
+
end
|
82
|
+
res_file = res_path.join("#{res_name}.yaml")
|
83
|
+
res_file.write(res_details.to_yaml)
|
84
|
+
puts "updated #{res_file}..."
|
85
|
+
res_file
|
86
|
+
end
|
87
|
+
|
88
|
+
def generate_readme(res_details)
|
89
|
+
<<~EOREADME
|
90
|
+
# #{res_details.dig('definition', 'name')}
|
91
|
+
#{res_details.dig('definition', 'description')}
|
92
|
+
|
93
|
+
Project exported from #{File.join(prj_connection.public_project_url)} by xapixctl v#{Xapixctl::VERSION}.
|
94
|
+
EOREADME
|
95
|
+
end
|
96
|
+
end
|
97
|
+
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"
|
@@ -24,13 +26,18 @@ Gem::Specification.new do |spec|
|
|
24
26
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
25
27
|
spec.require_paths = ["lib"]
|
26
28
|
|
29
|
+
spec.required_ruby_version = '>= 2.6'
|
30
|
+
|
27
31
|
spec.add_dependency "activesupport", ">= 5.2.3", "< 6.0.0"
|
28
32
|
spec.add_dependency "rest-client", ">= 2.1.0", "< 3.0.0"
|
29
|
-
spec.add_dependency "thor", ">= 1.0.0", "< 1.
|
33
|
+
spec.add_dependency "thor", ">= 1.0.0", "< 1.2.0"
|
30
34
|
|
31
|
-
spec.add_development_dependency "bundler", "~> 1.
|
35
|
+
spec.add_development_dependency "bundler", "~> 2.1.4"
|
32
36
|
spec.add_development_dependency "rake", "~> 13.0"
|
33
37
|
spec.add_development_dependency "relaxed-rubocop", "~> 2.5"
|
34
38
|
spec.add_development_dependency "rspec", "~> 3.0"
|
35
|
-
spec.add_development_dependency "rubocop", "~>
|
39
|
+
spec.add_development_dependency "rubocop", "~> 1.11"
|
40
|
+
spec.add_development_dependency "rubocop-rake"
|
41
|
+
spec.add_development_dependency "rubocop-rspec"
|
42
|
+
spec.add_development_dependency "webmock"
|
36
43
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xapixctl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Reinsch
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -59,7 +59,7 @@ dependencies:
|
|
59
59
|
version: 1.0.0
|
60
60
|
- - "<"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: 1.
|
62
|
+
version: 1.2.0
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -69,21 +69,21 @@ dependencies:
|
|
69
69
|
version: 1.0.0
|
70
70
|
- - "<"
|
71
71
|
- !ruby/object:Gem::Version
|
72
|
-
version: 1.
|
72
|
+
version: 1.2.0
|
73
73
|
- !ruby/object:Gem::Dependency
|
74
74
|
name: bundler
|
75
75
|
requirement: !ruby/object:Gem::Requirement
|
76
76
|
requirements:
|
77
77
|
- - "~>"
|
78
78
|
- !ruby/object:Gem::Version
|
79
|
-
version: 1.
|
79
|
+
version: 2.1.4
|
80
80
|
type: :development
|
81
81
|
prerelease: false
|
82
82
|
version_requirements: !ruby/object:Gem::Requirement
|
83
83
|
requirements:
|
84
84
|
- - "~>"
|
85
85
|
- !ruby/object:Gem::Version
|
86
|
-
version: 1.
|
86
|
+
version: 2.1.4
|
87
87
|
- !ruby/object:Gem::Dependency
|
88
88
|
name: rake
|
89
89
|
requirement: !ruby/object:Gem::Requirement
|
@@ -132,14 +132,56 @@ dependencies:
|
|
132
132
|
requirements:
|
133
133
|
- - "~>"
|
134
134
|
- !ruby/object:Gem::Version
|
135
|
-
version: '
|
135
|
+
version: '1.11'
|
136
136
|
type: :development
|
137
137
|
prerelease: false
|
138
138
|
version_requirements: !ruby/object:Gem::Requirement
|
139
139
|
requirements:
|
140
140
|
- - "~>"
|
141
141
|
- !ruby/object:Gem::Version
|
142
|
-
version: '
|
142
|
+
version: '1.11'
|
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'
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: '0'
|
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: '0'
|
164
|
+
type: :development
|
165
|
+
prerelease: false
|
166
|
+
version_requirements: !ruby/object:Gem::Requirement
|
167
|
+
requirements:
|
168
|
+
- - ">="
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
version: '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: '0'
|
178
|
+
type: :development
|
179
|
+
prerelease: false
|
180
|
+
version_requirements: !ruby/object:Gem::Requirement
|
181
|
+
requirements:
|
182
|
+
- - ">="
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: '0'
|
143
185
|
description:
|
144
186
|
email:
|
145
187
|
- michael@xapix.io
|
@@ -148,6 +190,7 @@ executables:
|
|
148
190
|
extensions: []
|
149
191
|
extra_rdoc_files: []
|
150
192
|
files:
|
193
|
+
- ".github/workflows/cd.yaml"
|
151
194
|
- ".gitignore"
|
152
195
|
- ".rspec"
|
153
196
|
- ".rubocop.yml"
|
@@ -164,7 +207,12 @@ files:
|
|
164
207
|
- lib/xapixctl/base_cli.rb
|
165
208
|
- lib/xapixctl/cli.rb
|
166
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
|
167
214
|
- lib/xapixctl/preview_cli.rb
|
215
|
+
- lib/xapixctl/sync_cli.rb
|
168
216
|
- lib/xapixctl/version.rb
|
169
217
|
- xapixctl.gemspec
|
170
218
|
homepage: https://github.com/xapix-io/xapixctl
|
@@ -181,14 +229,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
181
229
|
requirements:
|
182
230
|
- - ">="
|
183
231
|
- !ruby/object:Gem::Version
|
184
|
-
version: '
|
232
|
+
version: '2.6'
|
185
233
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
186
234
|
requirements:
|
187
235
|
- - ">="
|
188
236
|
- !ruby/object:Gem::Version
|
189
237
|
version: '0'
|
190
238
|
requirements: []
|
191
|
-
rubygems_version: 3.0.
|
239
|
+
rubygems_version: 3.0.9
|
192
240
|
signing_key:
|
193
241
|
specification_version: 4
|
194
242
|
summary: xapix client library and command line tool
|