xapixctl 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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