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.
@@ -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
@@ -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
- connection.pipeline_preview(pipeline, org: options[:org], project: options[:project], format: options[:format].to_sym) do |res|
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
- connection.endpoint_preview(endpoint, org: options[:org], project: options[:project], format: options[:format].to_sym) do |res|
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
- connection.stream_processor_preview(stream_processor, org: options[:org], project: options[:project], format: options[:format].to_sym) do |res|
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Xapixctl
4
- VERSION = "1.1.2"
4
+ VERSION = "1.2.0"
5
5
  end
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.1.0"
33
+ spec.add_dependency "thor", ">= 1.0.0", "< 1.2.0"
30
34
 
31
- spec.add_development_dependency "bundler", "~> 1.17.3"
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", "~> 0.89"
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.1.2
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: 2020-09-25 00:00:00.000000000 Z
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.1.0
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.1.0
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.17.3
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.17.3
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: '0.89'
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: '0.89'
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: '0'
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.8
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