lex-lambda 0.1.2

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: 3efafde56225db1020869a0664212bd2402a4bedd733c1e71e0687986234e4b9
4
+ data.tar.gz: a5bee281031a1fe0568b215cd7674ddfceac01c2facd5fea7d4000243c814432
5
+ SHA512:
6
+ metadata.gz: f03c7eb48c402f12adb8b414ac8ba93791f9f3bba014ef5370be65e50df49e99ee283d1e1fc202c4170f41b9d69a405e0c14058a0935ca38820e91b6c44543fd
7
+ data.tar.gz: 1bfe4147a02e1a4206218aba99de9b4e44a310930ed60c9797a9cff1bdc3b6954b37655801bc1f9f118f6c38e6426d153110b0fdb8cab28e48b13a88369b30e2
@@ -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/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,48 @@
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
+
28
+ Metrics/AbcSize:
29
+ Max: 60
30
+
31
+ Metrics/CyclomaticComplexity:
32
+ Max: 15
33
+
34
+ Metrics/PerceivedComplexity:
35
+ Max: 17
36
+
37
+ Style/Documentation:
38
+ Enabled: false
39
+
40
+ Style/SymbolArray:
41
+ Enabled: true
42
+
43
+ Style/FrozenStringLiteralComment:
44
+ Enabled: true
45
+ EnforcedStyle: always
46
+
47
+ Naming/FileName:
48
+ Enabled: false
data/CHANGELOG.md ADDED
@@ -0,0 +1,17 @@
1
+ # Changelog
2
+
3
+ ## [0.1.2] - 2026-03-22
4
+
5
+ ### Changed
6
+ - Add legion-cache, legion-crypt, legion-data, legion-json, legion-logging, legion-settings, legion-transport as runtime dependencies
7
+ - Update spec_helper with real sub-gem helper stubs
8
+
9
+ ## [0.1.0] - 2026-03-21
10
+
11
+ ### Added
12
+ - Initial release of lex-lambda AWS Lambda integration
13
+ - `Helpers::Client` — builds `Aws::Lambda::Client` with region and credential support
14
+ - `Runners::Functions` — `list_functions`, `get_function`, `invoke_function`, `invoke_async`
15
+ - `Runners::Management` — `create_function`, `update_function_code`, `update_function_configuration`, `delete_function`
16
+ - `Runners::Layers` — `list_layers`, `get_layer_version`, `publish_layer_version`
17
+ - Standalone `Client` class for use outside the Legion framework
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ gem 'bundler', '>= 2'
8
+ gem 'rake'
9
+ gem 'rexml'
10
+ gem 'rspec'
11
+ gem 'rubocop'
12
+ gem 'rubocop-rspec'
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # lex-lambda
2
+
3
+ Legion Extension for AWS Lambda integration. Provides function invocation, management, and layer operations.
4
+
5
+ ## Installation
6
+
7
+ Add to your Gemfile:
8
+
9
+ ```ruby
10
+ gem 'lex-lambda'
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ### Standalone client
16
+
17
+ ```ruby
18
+ require 'legion/extensions/lambda'
19
+
20
+ client = Legion::Extensions::Lambda::Client.new(
21
+ region: 'us-east-1',
22
+ access_key_id: ENV['AWS_ACCESS_KEY_ID'],
23
+ secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
24
+ )
25
+
26
+ client.list_functions
27
+ client.invoke_function(function_name: 'my-function', payload: { key: 'value' })
28
+ client.invoke_async(function_name: 'my-function')
29
+ ```
30
+
31
+ ## Runners
32
+
33
+ - `Functions`: `list_functions`, `get_function`, `invoke_function`, `invoke_async`
34
+ - `Management`: `create_function`, `update_function_code`, `update_function_configuration`, `delete_function`
35
+ - `Layers`: `list_layers`, `get_layer_version`, `publish_layer_version`
36
+
37
+ ## License
38
+
39
+ MIT
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/legion/extensions/lambda/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'lex-lambda'
7
+ spec.version = Legion::Extensions::Lambda::VERSION
8
+ spec.authors = ['Esity']
9
+ spec.email = ['matthewdiverson@gmail.com']
10
+
11
+ spec.summary = 'LEX::Lambda'
12
+ spec.description = 'Connects Legion to AWS Lambda for function invocation and management'
13
+ spec.homepage = 'https://github.com/LegionIO/lex-lambda'
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-lambda'
19
+ spec.metadata['documentation_uri'] = 'https://github.com/LegionIO/lex-lambda'
20
+ spec.metadata['changelog_uri'] = 'https://github.com/LegionIO/lex-lambda'
21
+ spec.metadata['bug_tracker_uri'] = 'https://github.com/LegionIO/lex-lambda/issues'
22
+ spec.metadata['rubygems_mfa_required'] = 'true'
23
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ end
26
+ spec.require_paths = ['lib']
27
+
28
+ spec.add_dependency 'aws-sdk-lambda', '~> 1.0'
29
+
30
+ spec.add_dependency 'legion-cache', '>= 1.3.11'
31
+ spec.add_dependency 'legion-crypt', '>= 1.4.9'
32
+ spec.add_dependency 'legion-data', '>= 1.4.17'
33
+ spec.add_dependency 'legion-json', '>= 1.2.1'
34
+ spec.add_dependency 'legion-logging', '>= 1.3.2'
35
+ spec.add_dependency 'legion-settings', '>= 1.3.14'
36
+ spec.add_dependency 'legion-transport', '>= 1.3.9'
37
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'helpers/client'
4
+ require_relative 'runners/functions'
5
+ require_relative 'runners/management'
6
+ require_relative 'runners/layers'
7
+
8
+ module Legion
9
+ module Extensions
10
+ module Lambda
11
+ class Client
12
+ include Helpers::Client
13
+ include Runners::Functions
14
+ include Runners::Management
15
+ include Runners::Layers
16
+
17
+ attr_reader :opts
18
+
19
+ def initialize(region: 'us-east-1', access_key_id: nil, secret_access_key: nil, **extra)
20
+ @opts = { region: region, access_key_id: access_key_id, secret_access_key: secret_access_key,
21
+ **extra }.compact
22
+ end
23
+
24
+ def lambda_client(**override)
25
+ super(**@opts, **override)
26
+ end
27
+
28
+ def settings
29
+ { options: @opts }
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aws-sdk-lambda'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Lambda
8
+ module Helpers
9
+ module Client
10
+ def lambda_client(region: 'us-east-1', access_key_id: nil, secret_access_key: nil, **_opts)
11
+ config = { region: region }
12
+ config[:access_key_id] = access_key_id if access_key_id
13
+ config[:secret_access_key] = secret_access_key if secret_access_key
14
+ Aws::Lambda::Client.new(**config)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Lambda
8
+ module Runners
9
+ module Functions
10
+ def list_functions(**)
11
+ resp = lambda_client(**).list_functions
12
+ { functions: resp.functions.map { |f| { name: f.function_name, runtime: f.runtime, arn: f.function_arn } } }
13
+ end
14
+
15
+ def get_function(function_name:, **)
16
+ resp = lambda_client(**).get_function(function_name: function_name)
17
+ resp.configuration.to_h
18
+ end
19
+
20
+ def invoke_function(function_name:, payload: nil, invocation_type: 'RequestResponse', **)
21
+ params = { function_name: function_name, invocation_type: invocation_type }
22
+ params[:payload] = payload.is_a?(Hash) ? ::JSON.dump(payload) : payload if payload
23
+ resp = lambda_client(**).invoke(**params)
24
+ body = resp.payload&.string
25
+ parsed = begin
26
+ ::JSON.parse(body) if body
27
+ rescue ::JSON::ParserError
28
+ body
29
+ end
30
+ { status_code: resp.status_code, payload: parsed, function_error: resp.function_error }
31
+ end
32
+
33
+ def invoke_async(function_name:, payload: nil, **)
34
+ params = { function_name: function_name, invocation_type: 'Event' }
35
+ params[:payload] = payload.is_a?(Hash) ? ::JSON.dump(payload) : payload if payload
36
+ resp = lambda_client(**).invoke(**params)
37
+ { status_code: resp.status_code, function_name: function_name, async: true }
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Lambda
6
+ module Runners
7
+ module Layers
8
+ def list_layers(**)
9
+ resp = lambda_client(**).list_layers
10
+ { layers: resp.layers.map { |l| { name: l.layer_name, arn: l.layer_arn } } }
11
+ end
12
+
13
+ def get_layer_version(layer_name:, version_number:, **)
14
+ resp = lambda_client(**).get_layer_version(layer_name: layer_name, version_number: version_number)
15
+ resp.to_h
16
+ end
17
+
18
+ def publish_layer_version(layer_name:, content:, compatible_runtimes: [], **)
19
+ params = { layer_name: layer_name, content: content }
20
+ params[:compatible_runtimes] = compatible_runtimes unless compatible_runtimes.empty?
21
+ resp = lambda_client(**).publish_layer_version(**params)
22
+ resp.to_h
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Lambda
6
+ module Runners
7
+ module Management
8
+ def create_function(function_name:, runtime:, handler:, role:, code:, **) # rubocop:disable Metrics/ParameterLists
9
+ resp = lambda_client(**).create_function(
10
+ function_name: function_name,
11
+ runtime: runtime,
12
+ handler: handler,
13
+ role: role,
14
+ code: code
15
+ )
16
+ resp.to_h
17
+ end
18
+
19
+ def update_function_code(function_name:, zip_file: nil, s3_bucket: nil, s3_key: nil, **)
20
+ params = { function_name: function_name }
21
+ params[:zip_file] = zip_file if zip_file
22
+ params[:s3_bucket] = s3_bucket if s3_bucket
23
+ params[:s3_key] = s3_key if s3_key
24
+ resp = lambda_client(**).update_function_code(**params)
25
+ resp.to_h
26
+ end
27
+
28
+ def update_function_configuration(function_name:, **opts)
29
+ conn_opts = opts.slice(:region, :access_key_id, :secret_access_key)
30
+ config_opts = opts.except(:region, :access_key_id, :secret_access_key)
31
+ resp = lambda_client(**conn_opts).update_function_configuration(
32
+ function_name: function_name,
33
+ **config_opts
34
+ )
35
+ resp.to_h
36
+ end
37
+
38
+ def delete_function(function_name:, **)
39
+ lambda_client(**).delete_function(function_name: function_name)
40
+ { deleted: true, function_name: function_name }
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Lambda
6
+ VERSION = '0.1.2'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/lambda/version'
4
+ require 'legion/extensions/lambda/helpers/client'
5
+ require 'legion/extensions/lambda/runners/functions'
6
+ require 'legion/extensions/lambda/runners/management'
7
+ require 'legion/extensions/lambda/runners/layers'
8
+ require 'legion/extensions/lambda/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Lambda
13
+ extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core
14
+ end
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lex-lambda
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Esity
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: aws-sdk-lambda
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: legion-cache
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.3.11
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 1.3.11
40
+ - !ruby/object:Gem::Dependency
41
+ name: legion-crypt
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.4.9
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 1.4.9
54
+ - !ruby/object:Gem::Dependency
55
+ name: legion-data
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 1.4.17
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 1.4.17
68
+ - !ruby/object:Gem::Dependency
69
+ name: legion-json
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 1.2.1
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 1.2.1
82
+ - !ruby/object:Gem::Dependency
83
+ name: legion-logging
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 1.3.2
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: 1.3.2
96
+ - !ruby/object:Gem::Dependency
97
+ name: legion-settings
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 1.3.14
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 1.3.14
110
+ - !ruby/object:Gem::Dependency
111
+ name: legion-transport
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 1.3.9
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: 1.3.9
124
+ description: Connects Legion to AWS Lambda for function invocation and management
125
+ email:
126
+ - matthewdiverson@gmail.com
127
+ executables: []
128
+ extensions: []
129
+ extra_rdoc_files: []
130
+ files:
131
+ - ".github/workflows/ci.yml"
132
+ - ".rspec"
133
+ - ".rubocop.yml"
134
+ - CHANGELOG.md
135
+ - Gemfile
136
+ - README.md
137
+ - lex-lambda.gemspec
138
+ - lib/legion/extensions/lambda.rb
139
+ - lib/legion/extensions/lambda/client.rb
140
+ - lib/legion/extensions/lambda/helpers/client.rb
141
+ - lib/legion/extensions/lambda/runners/functions.rb
142
+ - lib/legion/extensions/lambda/runners/layers.rb
143
+ - lib/legion/extensions/lambda/runners/management.rb
144
+ - lib/legion/extensions/lambda/version.rb
145
+ homepage: https://github.com/LegionIO/lex-lambda
146
+ licenses:
147
+ - MIT
148
+ metadata:
149
+ homepage_uri: https://github.com/LegionIO/lex-lambda
150
+ source_code_uri: https://github.com/LegionIO/lex-lambda
151
+ documentation_uri: https://github.com/LegionIO/lex-lambda
152
+ changelog_uri: https://github.com/LegionIO/lex-lambda
153
+ bug_tracker_uri: https://github.com/LegionIO/lex-lambda/issues
154
+ rubygems_mfa_required: 'true'
155
+ rdoc_options: []
156
+ require_paths:
157
+ - lib
158
+ required_ruby_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '3.4'
163
+ required_rubygems_version: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ requirements: []
169
+ rubygems_version: 3.6.9
170
+ specification_version: 4
171
+ summary: LEX::Lambda
172
+ test_files: []