lexicon-cli 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lexicon
4
+ module Cli
5
+ module Command
6
+ class RemoteCommand < ContainerAwareCommand
7
+ desc 'upload VERSION', 'Uploads the version to the configured S3 storage'
8
+
9
+ def upload(version)
10
+ # @type [Package::PackageUploader] uploader
11
+ uploader = get(Lexicon::Common::Remote::PackageUploader)
12
+ # @type [Package::DirectoryPackageLoader]
13
+ loader = get(Lexicon::Common::Package::DirectoryPackageLoader)
14
+
15
+ semver = Semantic::Version.new(version) rescue nil
16
+
17
+ if semver.nil?
18
+ puts "[ NOK ] #{version} is not a valid version.".red
19
+ elsif (package = loader.load_package(semver.to_s)).nil?
20
+ puts "[ NOK ] No package found for version #{semver}.".red
21
+ elsif uploader.upload(package)
22
+ puts "[ OK ] Version #{semver} uploaded.".green
23
+ else
24
+ puts '[ NOK ] Error while uploading.'.red
25
+ end
26
+ end
27
+
28
+ desc 'delete VERSION', 'Deletes a version from the S3 storage'
29
+
30
+ def delete(version)
31
+ # @type [Aws::S3::Client] s3
32
+ s3 = get(Lexicon::Common::Remote::S3Client)
33
+
34
+ semver = Semantic::Version.new(version) rescue nil
35
+
36
+ if semver.nil?
37
+ puts "[ NOK ] #{version} is not a valid version.".red
38
+ else
39
+ bucket = semver.to_s
40
+
41
+ if s3.bucket_exist?(bucket)
42
+ s3.ls(bucket)
43
+ .each { |content| s3.raw.delete_object(bucket: bucket, key: content.fetch(:key)) }
44
+ s3.raw.delete_bucket(bucket: bucket)
45
+
46
+ puts "[ OK ] The version #{semver} has been deleted from the server".green
47
+ else
48
+ puts "[ NOK ] The version #{semver} does not exist on the server".red
49
+ end
50
+ end
51
+ end
52
+
53
+ desc 'download VERSION', 'Download the given version from the server'
54
+
55
+ def download(version)
56
+ # @type [Package::PackageDownloader] uploader
57
+ downloader = get(Lexicon::Common::Remote::PackageDownloader)
58
+ # @type [Package::DirectoryPackageLoader]
59
+ loader = get(Lexicon::Common::Package::DirectoryPackageLoader)
60
+
61
+ semver = Semantic::Version.new(version) rescue nil
62
+
63
+ if semver.nil?
64
+ puts "[ NOK ] #{version} is not a valid version.".red
65
+ elsif !loader.load_package(semver.to_s).nil?
66
+ puts "[ NOK ] You already have the version #{semver} locally.".red
67
+ elsif downloader.download(semver)
68
+ puts "[ OK ] The version #{semver} has been downloaded."
69
+ else
70
+ puts '[ NOK ] Error while downloading.'.red
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ using Corindon::DependencyInjection::Injectable
4
+
5
+ module Lexicon
6
+ module Cli
7
+ module Extension
8
+ class CommonExtension < ExtensionBase
9
+ LOGGER_LEVEL = make_parameter('logger_level')
10
+ PACKAGE_DIR = make_parameter('package_dir')
11
+ PACKAGE_SCHEMA_PATH = make_parameter('package_schema')
12
+
13
+ SCHEMA_VALIDATOR = make_definition('schema_validator', factory(Lexicon::Common::Schema::ValidatorFactory, :build))
14
+
15
+ def initialize(data_root:)
16
+ @data_root = data_root
17
+ end
18
+
19
+ # @param [Corindon::DependencyInjection::Container] container
20
+ def boot(container)
21
+ register_parameters(
22
+ container,
23
+ {
24
+ PACKAGE_SCHEMA_PATH => package_schema_file,
25
+ PACKAGE_DIR => data_root.join('out'),
26
+ LOGGER_LEVEL => Logger::ERROR,
27
+ }
28
+ )
29
+
30
+ container.add_definition(Lexicon::Common::Database::Factory)
31
+ container.add_definition(Lexicon::Common::Package::DirectoryPackageLoader) do
32
+ args(CommonExtension::PACKAGE_DIR, schema_validator: CommonExtension::SCHEMA_VALIDATOR)
33
+ end
34
+ container.add_definition(Lexicon::Common::Package::PackageIntegrityValidator) { args(shell: Lexicon::Common::ShellExecutor) }
35
+ container.add_definition(Lexicon::Common::Schema::ValidatorFactory) { args(CommonExtension::PACKAGE_SCHEMA_PATH) }
36
+ container.add_definition(Lexicon::Common::ShellExecutor)
37
+ container.add_definition(Logger) { args(value(STDOUT), level: LOGGER_LEVEL) }
38
+ container.add_definition(SCHEMA_VALIDATOR)
39
+
40
+ container.on_service_built(->(service, container) {
41
+ if service.is_a?(Lexicon::Common::Mixin::ContainerAware)
42
+ service.container = container
43
+ end
44
+ })
45
+
46
+ container.on_service_built(->(service, container) {
47
+ if service.is_a?(Lexicon::Common::Mixin::LoggerAware)
48
+ service.logger = container.get(Logger)
49
+ end
50
+ })
51
+ end
52
+
53
+ def commands
54
+ proc do
55
+ desc 'console', 'Start a console'
56
+ subcommand 'console', Command::ConsoleCommand
57
+ end
58
+ end
59
+
60
+ private
61
+
62
+ # @return [Pathname]
63
+ attr_reader :data_root
64
+
65
+ # @return [Pathname]
66
+ def package_schema_file
67
+ Pathname.new(Gem::Specification.find_by_name('lexicon-common').gem_dir).join(Lexicon::Common::LEXICON_SCHEMA_RELATIVE_PATH)
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lexicon
4
+ module Cli
5
+ module Extension
6
+ class ExtensionBase
7
+ # @param [Corindon::DependencyInjection::Container] container
8
+ def boot(container) end
9
+
10
+ def commands; end
11
+
12
+ private
13
+
14
+ # @param [Corindon::DependencyInjection::Container] container,
15
+ # @param [Hash<String=>Object>] parameters
16
+ def register_parameters(container, parameters = {})
17
+ parameters.each do |k, v|
18
+ key = if k.is_a?(Corindon::DependencyInjection::Token::ParameterToken)
19
+ k.key
20
+ else
21
+ k
22
+ end
23
+
24
+ container.set_parameter(key, v)
25
+ end
26
+ end
27
+
28
+ # @param [Corindon::DependencyInjection::Container] container
29
+ # @param [Array<Class>] services
30
+ def register_all(*services, container:)
31
+ services.each { |s| container.add_definition(s) }
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ using Corindon::DependencyInjection::Injectable
4
+
5
+ module Lexicon
6
+ module Cli
7
+ module Extension
8
+ class ProductionExtension < ExtensionBase
9
+ DATABASE_URL = make_parameter('database_url')
10
+
11
+ DATABASE = make_definition('database', factory(Lexicon::Common::Database::Factory, :new_instance), url: DATABASE_URL)
12
+
13
+ def boot(container)
14
+ register_parameters(
15
+ container,
16
+ {
17
+ DATABASE_URL => database_url
18
+ }
19
+ )
20
+
21
+ container.add_definition(Lexicon::Common::Production::FileLoader) do
22
+ args(shell: Lexicon::Common::ShellExecutor, database_url: ProductionExtension::DATABASE_URL)
23
+ end
24
+ container.add_definition(Lexicon::Common::Production::DatasourceLoader) do
25
+ args(
26
+ shell: Lexicon::Common::ShellExecutor,
27
+ database_factory: Lexicon::Common::Database::Factory,
28
+ file_loader: Lexicon::Common::Production::FileLoader,
29
+ database_url: ProductionExtension::DATABASE_URL
30
+ )
31
+ end
32
+ container.add_definition(DATABASE)
33
+ end
34
+
35
+ def commands
36
+ proc do
37
+ desc 'production', 'Production related commands'
38
+ subcommand 'production', Command::ProductionCommand
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def database_url
45
+ user = ENV.fetch('PRODUCTION_DATABASE_USER', 'postgres')
46
+ password = ENV.fetch('PRODUCTION_DATABASE_PASSWORD', nil)
47
+ host = ENV.fetch('PRODUCTION_DATABASE_HOST', '127.0.0.1')
48
+ port = ENV.fetch('PRODUCTION_DATABASE_PORT', '5432')
49
+ name = ENV.fetch('PRODUCTION_DATABASE_NAME', 'lexicon')
50
+
51
+ credentials = if password.nil?
52
+ user
53
+ else
54
+ "#{user}:#{password}"
55
+ end
56
+
57
+ "postgres://#{credentials}@#{host}:#{port}/#{name}"
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lexicon
4
+ module Cli
5
+ module Extension
6
+ class RemoteExtension < ExtensionBase
7
+ # @param [Corindon::DependencyInjection::Container] container
8
+ def boot(container)
9
+ register_parameters(
10
+ container,
11
+ {
12
+ 'lexicon.common.remote.endpoint' => ENV.fetch('MINIO_HOST', 'https://io.ekylibre.dev'),
13
+ 'lexicon.common.remote.access_key_id' => ENV.fetch('MINIO_ACCESS_KEY', nil),
14
+ 'lexicon.common.remote.secret_access_key' => ENV.fetch('MINIO_SECRET_KEY', nil),
15
+ 'lexicon.common.remote.force_path_style' => true,
16
+ 'lexicon.common.remote.region' => 'us-east-1',
17
+ }
18
+ )
19
+
20
+ container.add_definition(Lexicon::Common::Remote::PackageDownloader) do
21
+ args(
22
+ s3: Lexicon::Common::Remote::S3Client,
23
+ out_dir: CommonExtension::PACKAGE_DIR,
24
+ package_loader: Lexicon::Common::Package::DirectoryPackageLoader
25
+ )
26
+ end
27
+ container.add_definition(Lexicon::Common::Remote::PackageUploader) { args(s3: Lexicon::Common::Remote::S3Client) }
28
+ container.add_definition(Lexicon::Common::Remote::S3Client) { args(raw: Aws::S3::Client) }
29
+ container.add_definition(Aws::S3::Client) do
30
+ args(
31
+ endpoint: param('lexicon.common.remote.endpoint'),
32
+ access_key_id: param('lexicon.common.remote.access_key_id'),
33
+ secret_access_key: param('lexicon.common.remote.secret_access_key'),
34
+ force_path_style: param('lexicon.common.remote.force_path_style'),
35
+ region: param('lexicon.common.remote.region'),
36
+ )
37
+ end
38
+ end
39
+
40
+ def commands
41
+ proc do
42
+ desc 'remote', 'Minio related commands'
43
+ subcommand 'remote', Command::RemoteCommand
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lexicon
4
+ module Cli
5
+ VERSION = '0.1.0'
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,191 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lexicon-cli
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ekylibre developers
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-03-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: corindon
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.7.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.7.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: dotenv
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.7'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: lexicon-common
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.1.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.1.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: zeitwerk
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.4'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.4'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: minitest
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '5.14'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '5.14'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '13.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '13.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 1.3.1
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 1.3.1
139
+ description:
140
+ email:
141
+ - dev@ekylibre.com
142
+ executables:
143
+ - lexicon
144
+ extensions: []
145
+ extra_rdoc_files: []
146
+ files:
147
+ - Gemfile
148
+ - LICENSE.md
149
+ - README.md
150
+ - Rakefile
151
+ - bin/console
152
+ - bin/lexicon
153
+ - bin/rubocop
154
+ - bin/setup
155
+ - lexicon-cli.gemspec
156
+ - lib/lexicon-cli.rb
157
+ - lib/lexicon/cli/application.rb
158
+ - lib/lexicon/cli/cli_base.rb
159
+ - lib/lexicon/cli/command/console_command.rb
160
+ - lib/lexicon/cli/command/container_aware_command.rb
161
+ - lib/lexicon/cli/command/production_command.rb
162
+ - lib/lexicon/cli/command/remote_command.rb
163
+ - lib/lexicon/cli/extension/common_extension.rb
164
+ - lib/lexicon/cli/extension/extension_base.rb
165
+ - lib/lexicon/cli/extension/production_extension.rb
166
+ - lib/lexicon/cli/extension/remote_extension.rb
167
+ - lib/lexicon/cli/version.rb
168
+ homepage: https://www.ekylibre.com
169
+ licenses:
170
+ - AGPL-3.0-only
171
+ metadata: {}
172
+ post_install_message:
173
+ rdoc_options: []
174
+ require_paths:
175
+ - lib
176
+ required_ruby_version: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: 2.6.0
181
+ required_rubygems_version: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ requirements: []
187
+ rubygems_version: 3.0.3
188
+ signing_key:
189
+ specification_version: 4
190
+ summary: Basic Cli for the Lexicon
191
+ test_files: []