lexicon-cli 0.1.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,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: []