lex-docker 0.1.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: cfc6c9e230ea3f7eae802316ed21b5188f252ad70efa3033790c57097764c7e0
4
+ data.tar.gz: 0707ac874e590ee10f6134e76cef740a5a73f100c0e419d67df5031cfb434534
5
+ SHA512:
6
+ metadata.gz: c7d3a9eb99f9a06720c51f7a72ce3ae8ac15fec6ddda5c988660d57b5ce7ec88ca55d9e17afc6e52a5669642256db309651889465e27c0e9b12e2831397265f7
7
+ data.tar.gz: 4585d38424b5083709fbcdb6faa70abde580318f46fbc02f649e61367e60c25e9a51b62c9cd0da15f566910395fabd0766e008729c518b0c4774275a4fd8cc0c
@@ -0,0 +1,16 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ branches: [main]
5
+ pull_request:
6
+
7
+ jobs:
8
+ ci:
9
+ uses: LegionIO/.github/.github/workflows/ci.yml@main
10
+
11
+ release:
12
+ needs: ci
13
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
14
+ uses: LegionIO/.github/.github/workflows/release.yml@main
15
+ secrets:
16
+ rubygems-api-key: ${{ secrets.RUBYGEMS_API_KEY }}
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,53 @@
1
+ AllCops:
2
+ TargetRubyVersion: 3.4
3
+ NewCops: enable
4
+ SuggestExtensions: false
5
+
6
+ Layout/LineLength:
7
+ Max: 160
8
+
9
+ Layout/SpaceAroundEqualsInParameterDefault:
10
+ EnforcedStyle: space
11
+
12
+ Layout/HashAlignment:
13
+ EnforcedHashRocketStyle: table
14
+ EnforcedColonStyle: table
15
+
16
+ Metrics/MethodLength:
17
+ Max: 50
18
+
19
+ Metrics/ClassLength:
20
+ Max: 1500
21
+
22
+ Metrics/ModuleLength:
23
+ Max: 1500
24
+
25
+ Metrics/BlockLength:
26
+ Max: 40
27
+ Exclude:
28
+ - 'spec/**/*'
29
+
30
+ Metrics/ParameterLists:
31
+ Max: 10
32
+
33
+ Metrics/AbcSize:
34
+ Max: 60
35
+
36
+ Metrics/CyclomaticComplexity:
37
+ Max: 15
38
+
39
+ Metrics/PerceivedComplexity:
40
+ Max: 17
41
+
42
+ Style/Documentation:
43
+ Enabled: false
44
+
45
+ Style/SymbolArray:
46
+ Enabled: true
47
+
48
+ Style/FrozenStringLiteralComment:
49
+ Enabled: true
50
+ EnforcedStyle: always
51
+
52
+ Naming/FileName:
53
+ Enabled: false
data/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ # Changelog
2
+
3
+ ## [0.1.0] - 2026-03-22
4
+
5
+ ### Added
6
+ - Initial release
7
+ - `Helpers::Client` — Docker API connection wrapper with configurable URL and timeouts
8
+ - `Runners::Containers` — list_containers, create_container, start_container, stop_container, remove_container, container_logs
9
+ - `Runners::Images` — list_images, pull_image, build_image, remove_image
10
+ - `Runners::Networks` — list_networks, create_network
11
+ - Standalone `Client` class for use outside the Legion framework
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ gem 'base64'
8
+ gem 'docker-api', '~> 2.0'
9
+ gem 'rake', '~> 12.0'
10
+ gem 'rspec', '~> 3.0'
11
+ gem 'rspec_junit_formatter'
12
+ gem 'rubocop'
13
+ gem 'rubocop-rspec'
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/legion/extensions/docker/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'lex-docker'
7
+ spec.version = Legion::Extensions::Docker::VERSION
8
+ spec.authors = ['Esity']
9
+ spec.email = ['matthewdiverson@gmail.com']
10
+
11
+ spec.summary = 'LEX::Docker'
12
+ spec.description = 'Used to connect Legion to Docker'
13
+ spec.homepage = 'https://github.com/LegionIO/lex-docker'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = '>= 3.4'
16
+
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = 'https://github.com/LegionIO/lex-docker'
19
+ spec.metadata['changelog_uri'] = 'https://github.com/LegionIO/lex-docker/blob/main/CHANGELOG.md'
20
+ spec.metadata['rubygems_mfa_required'] = 'true'
21
+
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+ spec.bindir = 'exe'
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ['lib']
28
+
29
+ spec.add_dependency 'base64'
30
+ spec.add_dependency 'docker-api', '~> 2.0'
31
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'helpers/client'
4
+ require_relative 'runners/containers'
5
+ require_relative 'runners/images'
6
+ require_relative 'runners/networks'
7
+
8
+ module Legion
9
+ module Extensions
10
+ module Docker
11
+ class Client
12
+ include Helpers::Client
13
+ include Runners::Containers
14
+ include Runners::Images
15
+ include Runners::Networks
16
+
17
+ attr_reader :opts
18
+
19
+ def initialize(**opts)
20
+ @opts = opts
21
+ end
22
+
23
+ def settings
24
+ { options: @opts }
25
+ end
26
+
27
+ def connection(**override)
28
+ super(**@opts, **override)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'docker-api'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Docker
8
+ module Helpers
9
+ module Client
10
+ module_function
11
+
12
+ def connection(**opts)
13
+ url = opts[:docker_url] || settings_value(:docker_url, 'unix:///var/run/docker.sock')
14
+ ::Docker.url = url
15
+ ::Docker.options = {
16
+ read_timeout: opts.fetch(:read_timeout, 120),
17
+ write_timeout: opts.fetch(:write_timeout, 120)
18
+ }
19
+ ::Docker
20
+ end
21
+
22
+ def settings_value(key, default)
23
+ return default unless defined?(Legion::Settings)
24
+
25
+ settings = Legion::Settings[:'lex-docker']
26
+ settings.is_a?(Hash) ? settings.fetch(key, default) : default
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Docker
6
+ module Runners
7
+ module Containers
8
+ def list_containers(**opts)
9
+ conn = opts.delete(:connection)
10
+ connection(**opts) unless conn
11
+ ::Docker::Container.all(all: opts.fetch(:all, false))&.map(&:info)
12
+ end
13
+
14
+ def create_container(**opts)
15
+ conn = opts.delete(:connection)
16
+ connection(**opts) unless conn
17
+ image = opts.fetch(:image)
18
+ name = opts[:name]
19
+ cmd = opts[:cmd]
20
+ env = opts[:env]
21
+ config = { 'Image' => image }
22
+ config['name'] = name if name
23
+ config['Cmd'] = cmd if cmd
24
+ config['Env'] = env if env
25
+ container = ::Docker::Container.create(config)
26
+ { container: container.info }
27
+ end
28
+
29
+ def start_container(**opts)
30
+ conn = opts.delete(:connection)
31
+ connection(**opts) unless conn
32
+ container_id = opts.fetch(:container_id)
33
+ container = ::Docker::Container.get(container_id)
34
+ container.start
35
+ { started: true, container_id: container_id }
36
+ end
37
+
38
+ def stop_container(**opts)
39
+ conn = opts.delete(:connection)
40
+ connection(**opts) unless conn
41
+ container_id = opts.fetch(:container_id)
42
+ timeout = opts.fetch(:timeout, 10)
43
+ container = ::Docker::Container.get(container_id)
44
+ container.stop(t: timeout)
45
+ { stopped: true, container_id: container_id }
46
+ end
47
+
48
+ def remove_container(**opts)
49
+ conn = opts.delete(:connection)
50
+ connection(**opts) unless conn
51
+ container_id = opts.fetch(:container_id)
52
+ force = opts.fetch(:force, false)
53
+ container = ::Docker::Container.get(container_id)
54
+ container.remove(force: force)
55
+ { removed: true, container_id: container_id }
56
+ end
57
+
58
+ def container_logs(**opts)
59
+ conn = opts.delete(:connection)
60
+ connection(**opts) unless conn
61
+ container_id = opts.fetch(:container_id)
62
+ tail = opts.fetch(:tail, 'all')
63
+ timestamps = opts.fetch(:timestamps, false)
64
+ container = ::Docker::Container.get(container_id)
65
+ logs = container.logs(stdout: true, stderr: true, tail: tail, timestamps: timestamps)
66
+ { logs: logs, container_id: container_id }
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Docker
6
+ module Runners
7
+ module Images
8
+ def list_images(**opts)
9
+ conn = opts.delete(:connection)
10
+ connection(**opts) unless conn
11
+ ::Docker::Image.all&.map(&:info)
12
+ end
13
+
14
+ def pull_image(**opts)
15
+ conn = opts.delete(:connection)
16
+ connection(**opts) unless conn
17
+ repo = opts.fetch(:repo)
18
+ tag = opts.fetch(:tag, 'latest')
19
+ image = ::Docker::Image.create('fromImage' => repo, 'tag' => tag)
20
+ { image: image.info }
21
+ end
22
+
23
+ def build_image(**opts)
24
+ conn = opts.delete(:connection)
25
+ connection(**opts) unless conn
26
+ dir = opts.fetch(:dir)
27
+ t = opts[:tag]
28
+ build_opts = {}
29
+ build_opts['t'] = t if t
30
+ image = ::Docker::Image.build_from_dir(dir, build_opts)
31
+ { image: image.info }
32
+ end
33
+
34
+ def remove_image(**opts)
35
+ conn = opts.delete(:connection)
36
+ connection(**opts) unless conn
37
+ image_id = opts.fetch(:image_id)
38
+ force = opts.fetch(:force, false)
39
+ image = ::Docker::Image.get(image_id)
40
+ image.remove(force: force)
41
+ { removed: true, image_id: image_id }
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Docker
6
+ module Runners
7
+ module Networks
8
+ def list_networks(**opts)
9
+ conn = opts.delete(:connection)
10
+ connection(**opts) unless conn
11
+ ::Docker::Network.all&.map(&:info)
12
+ end
13
+
14
+ def create_network(**opts)
15
+ conn = opts.delete(:connection)
16
+ connection(**opts) unless conn
17
+ name = opts.fetch(:name)
18
+ driver = opts.fetch(:driver, 'bridge')
19
+ config = { 'Name' => name, 'Driver' => driver }
20
+ network = ::Docker::Network.create(name, config)
21
+ { network: network.info }
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Docker
6
+ VERSION = '0.1.1'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/docker/version'
4
+ require 'legion/extensions/docker/helpers/client'
5
+ require 'legion/extensions/docker/runners/containers'
6
+ require 'legion/extensions/docker/runners/images'
7
+ require 'legion/extensions/docker/runners/networks'
8
+ require 'legion/extensions/docker/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Docker
13
+ extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core
14
+ end
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lex-docker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Esity
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: base64
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: docker-api
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.0'
40
+ description: Used to connect Legion to Docker
41
+ email:
42
+ - matthewdiverson@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - ".github/workflows/ci.yml"
48
+ - ".gitignore"
49
+ - ".rspec"
50
+ - ".rubocop.yml"
51
+ - CHANGELOG.md
52
+ - Gemfile
53
+ - lex-docker.gemspec
54
+ - lib/legion/extensions/docker.rb
55
+ - lib/legion/extensions/docker/client.rb
56
+ - lib/legion/extensions/docker/helpers/client.rb
57
+ - lib/legion/extensions/docker/runners/containers.rb
58
+ - lib/legion/extensions/docker/runners/images.rb
59
+ - lib/legion/extensions/docker/runners/networks.rb
60
+ - lib/legion/extensions/docker/version.rb
61
+ homepage: https://github.com/LegionIO/lex-docker
62
+ licenses:
63
+ - MIT
64
+ metadata:
65
+ homepage_uri: https://github.com/LegionIO/lex-docker
66
+ source_code_uri: https://github.com/LegionIO/lex-docker
67
+ changelog_uri: https://github.com/LegionIO/lex-docker/blob/main/CHANGELOG.md
68
+ rubygems_mfa_required: 'true'
69
+ rdoc_options: []
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '3.4'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubygems_version: 3.6.9
84
+ specification_version: 4
85
+ summary: LEX::Docker
86
+ test_files: []