yake 0.7.0 → 1.0.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.
- checksums.yaml +4 -4
- data/README.md +19 -4
- data/lib/yake/datadog/v1.rb +62 -0
- data/lib/yake/datadog/v2.rb +62 -0
- data/lib/yake/datadog.rb +1 -58
- data/lib/yake/dsl.rb +13 -0
- data/lib/yake/logger.rb +0 -12
- data/lib/yake/support.rb +50 -0
- data/lib/yake/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d0272be54a9cf2f3b94764ac4c87db1f6047b9fd2e8b13286a8be939adde1387
|
|
4
|
+
data.tar.gz: 9c82744536dd4147039bdf6d3ef8d3e6b395c28ce1d2f64e8999d4a0c80a0a79
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 835f4171028f915170c3a548b175e6e5ee3a1d57162b4b9d6bbb7a33537fc599e9fd535a925a7b7e3b871d507707757d508f8dadcbe4b1368b47b3000a2cfc8f
|
|
7
|
+
data.tar.gz: 8ecc31882ad76a1d999f7e5ad1ab3f1ecbe141041f091a12f5dcfefb728416391dfa14d0632345e9da8e3de6bf66b3372b704ea73c3fbb40365181ec1bb8c808
|
data/README.md
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
# λake
|
|
2
2
|
|
|
3
|
-

|
|
4
|
-
[](https://rubygems.org/gems/yake)
|
|
4
|
+
[](https://github.com/amancevice/yake/actions/workflows/rspec.yml)
|
|
5
5
|
[](https://codeclimate.com/github/amancevice/yake/test_coverage)
|
|
6
6
|
[](https://codeclimate.com/github/amancevice/yake/maintainability)
|
|
7
7
|
|
|
8
|
+
[](https://ko-fi.com/smallweirdnumber)
|
|
9
|
+
|
|
8
10
|
Write your AWS Lambda function handlers using a Rake-like declarative syntax:
|
|
9
11
|
|
|
10
12
|
```ruby
|
|
@@ -77,7 +79,7 @@ INFO RequestId: 149c500f-028a-4b57-8977-0ef568cf8caf EVENT { … }
|
|
|
77
79
|
…
|
|
78
80
|
INFO RequestId: 149c500f-028a-4b57-8977-0ef568cf8caf RETURN { … }
|
|
79
81
|
END RequestId: 149c500f-028a-4b57-8977-0ef568cf8caf
|
|
80
|
-
REPORT RequestId: 149c500f-028a-4b57-8977-0ef568cf8caf
|
|
82
|
+
REPORT RequestId: 149c500f-028a-4b57-8977-0ef568cf8caf Duration: 43.97 ms Billed Duration: 44 ms Memory Size: 128 MB Max Memory Used: 77 MB
|
|
81
83
|
```
|
|
82
84
|
|
|
83
85
|
Logging the request ID in this way makes gathering logs lines for a particular execution in CloudWatch much easier.
|
|
@@ -208,6 +210,11 @@ MyObject.new.try(:some_method)
|
|
|
208
210
|
{ a: { b: 'c', d: 'e' }, f: 'g' }.deep_keys
|
|
209
211
|
# => [:a, :b, :d, :f]
|
|
210
212
|
|
|
213
|
+
left = { a: 'b', c: { d: %w[e] } }
|
|
214
|
+
right = { a: 'a', c: { d: %w[d] } }
|
|
215
|
+
left.deep_merge(right)
|
|
216
|
+
# => { :a => "a", :c => { :d => ["e", "d"] } }
|
|
217
|
+
|
|
211
218
|
{ a: { b: 'c', d: 'e' }, f: 'g' }.deep_transform_keys(&:to_s)
|
|
212
219
|
# => { "a" => { "b" => "c", "d" => "e" }, "f" => "g" }
|
|
213
220
|
|
|
@@ -244,6 +251,12 @@ hash.deep_transform_keys!(&:to_s)
|
|
|
244
251
|
|
|
245
252
|
{ f: 'g', a: { d: 'e', b: 'c' } }.to_deep_struct
|
|
246
253
|
# => #<OpenStruct f="g", a=#<OpenStruct d="e", b="c">>
|
|
254
|
+
|
|
255
|
+
{ a: { b: 'c', d: 'e' }, f: 'g' }.to_dynamodb
|
|
256
|
+
# => { :a => { :M => { :b => { :S => "c" }, :d => { :S => "e" } } }, :f => { :S => "g" } }
|
|
257
|
+
|
|
258
|
+
{ a: { M: { b: { S: 'c' }, d: { S: 'e' } } }, f: { S: 'g' } }.to_h_from_dynamodb
|
|
259
|
+
# => { :a => { :b => "c", :d => "e" }, :f => "g" }
|
|
247
260
|
```
|
|
248
261
|
|
|
249
262
|
`Integer` helpers:
|
|
@@ -331,6 +344,8 @@ UTC.now
|
|
|
331
344
|
|
|
332
345
|
As of `~> 0.4`, `yake` comes with a helper for writing Lambdas that integrate with Datadog's `datadog-ruby` gem.
|
|
333
346
|
|
|
347
|
+
As of `~> 0.8`, `yake` uses the v2 Datadog Lambda gem.
|
|
348
|
+
|
|
334
349
|
Creating a Lambda handler that wraps the Datadog tooling is easy:
|
|
335
350
|
|
|
336
351
|
```ruby
|
|
@@ -338,7 +353,7 @@ require 'aws-sdk-someservice'
|
|
|
338
353
|
require 'yake/datadog'
|
|
339
354
|
|
|
340
355
|
# Configure Datadog to use AWS tracing
|
|
341
|
-
Datadog::Lambda.configure_apm { |
|
|
356
|
+
Datadog::Lambda.configure_apm { |c| c.tracing.instrument :aws }
|
|
342
357
|
|
|
343
358
|
datadog :handler do |event|
|
|
344
359
|
# …
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'logger'
|
|
4
|
+
|
|
5
|
+
require 'datadog/lambda'
|
|
6
|
+
require 'yake'
|
|
7
|
+
|
|
8
|
+
module Yake
|
|
9
|
+
module Datadog
|
|
10
|
+
class Formatter < ::Logger::Formatter
|
|
11
|
+
Format = "[%s] %s %s %s %s\n"
|
|
12
|
+
|
|
13
|
+
def call(severity, time, progname, msg)
|
|
14
|
+
Format % [
|
|
15
|
+
severity,
|
|
16
|
+
time.utc.strftime('%Y-%m-%dT%H:%M:%S.%LZ'),
|
|
17
|
+
progname.nil? ? '-' : progname.split.last,
|
|
18
|
+
::Datadog.tracer.active_correlation,
|
|
19
|
+
msg2str(msg).strip,
|
|
20
|
+
]
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class MockContext < Struct.new(
|
|
25
|
+
:clock_diff,
|
|
26
|
+
:deadline_ms,
|
|
27
|
+
:aws_request_id,
|
|
28
|
+
:invoked_function_arn,
|
|
29
|
+
:log_group_name,
|
|
30
|
+
:log_stream_name,
|
|
31
|
+
:function_name,
|
|
32
|
+
:memory_limit_in_mb,
|
|
33
|
+
:function_version)
|
|
34
|
+
|
|
35
|
+
def invoked_function_arn
|
|
36
|
+
@invoked_function_arn ||= begin
|
|
37
|
+
region = ENV['AWS_REGION'] || ENV['AWS_DEFAULT_REGION'] || 'us-east-1'
|
|
38
|
+
"arn:aws:lambda:#{region}:123456789012:function-name"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
module DSL
|
|
44
|
+
include Yake::DSL
|
|
45
|
+
|
|
46
|
+
##
|
|
47
|
+
# Datadog handler wrapper
|
|
48
|
+
def datadog(name, &block)
|
|
49
|
+
define_method(name) do |event:nil, context:nil|
|
|
50
|
+
context ||= MockContext.new
|
|
51
|
+
::Datadog::Lambda.wrap(event, context) do
|
|
52
|
+
Yake.wrap(event, context, &block)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
logger.formatter = Datadog::Formatter.new
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
extend Yake::Datadog::DSL
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'logger'
|
|
4
|
+
|
|
5
|
+
require 'datadog/lambda'
|
|
6
|
+
require 'yake'
|
|
7
|
+
|
|
8
|
+
module Yake
|
|
9
|
+
module Datadog
|
|
10
|
+
class Formatter < ::Logger::Formatter
|
|
11
|
+
Format = "[%s] %s %s %s %s\n"
|
|
12
|
+
|
|
13
|
+
def call(severity, time, progname, msg)
|
|
14
|
+
Format % [
|
|
15
|
+
severity,
|
|
16
|
+
time.utc.strftime('%Y-%m-%dT%H:%M:%S.%LZ'),
|
|
17
|
+
progname.nil? ? '-' : progname.split.last,
|
|
18
|
+
::Datadog::Tracing.log_correlation,
|
|
19
|
+
msg2str(msg).strip,
|
|
20
|
+
]
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class MockContext < Struct.new(
|
|
25
|
+
:clock_diff,
|
|
26
|
+
:deadline_ms,
|
|
27
|
+
:aws_request_id,
|
|
28
|
+
:invoked_function_arn,
|
|
29
|
+
:log_group_name,
|
|
30
|
+
:log_stream_name,
|
|
31
|
+
:function_name,
|
|
32
|
+
:memory_limit_in_mb,
|
|
33
|
+
:function_version)
|
|
34
|
+
|
|
35
|
+
def invoked_function_arn
|
|
36
|
+
@invoked_function_arn ||= begin
|
|
37
|
+
region = ENV['AWS_REGION'] || ENV['AWS_DEFAULT_REGION'] || 'us-east-1'
|
|
38
|
+
"arn:aws:lambda:#{region}:123456789012:function-name"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
module DSL
|
|
44
|
+
include Yake::DSL
|
|
45
|
+
|
|
46
|
+
##
|
|
47
|
+
# Datadog handler wrapper
|
|
48
|
+
def datadog(name, &block)
|
|
49
|
+
define_method(name) do |event:nil, context:nil|
|
|
50
|
+
context ||= MockContext.new
|
|
51
|
+
::Datadog::Lambda.wrap(event, context) do
|
|
52
|
+
Yake.wrap(event, context, &block)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
logger.formatter = Datadog::Formatter.new
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
extend Yake::Datadog::DSL
|
data/lib/yake/datadog.rb
CHANGED
|
@@ -1,61 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
require 'logger'
|
|
3
2
|
|
|
4
3
|
require 'datadog/lambda'
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
module Yake
|
|
8
|
-
module Datadog
|
|
9
|
-
class Formatter < ::Logger::Formatter
|
|
10
|
-
Format = "[%s] %s %s %s %s\n"
|
|
11
|
-
|
|
12
|
-
def call(severity, time, progname, msg)
|
|
13
|
-
Format % [
|
|
14
|
-
severity,
|
|
15
|
-
time.utc.strftime('%Y-%m-%dT%H:%M:%S.%LZ'),
|
|
16
|
-
progname.nil? ? '-' : progname.split.last,
|
|
17
|
-
::Datadog.tracer.active_correlation,
|
|
18
|
-
msg2str(msg).strip,
|
|
19
|
-
]
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
class MockContext < Struct.new(
|
|
24
|
-
:clock_diff,
|
|
25
|
-
:deadline_ms,
|
|
26
|
-
:aws_request_id,
|
|
27
|
-
:invoked_function_arn,
|
|
28
|
-
:log_group_name,
|
|
29
|
-
:log_stream_name,
|
|
30
|
-
:function_name,
|
|
31
|
-
:memory_limit_in_mb,
|
|
32
|
-
:function_version)
|
|
33
|
-
|
|
34
|
-
def invoked_function_arn
|
|
35
|
-
@invoked_function_arn ||= begin
|
|
36
|
-
region = ENV['AWS_REGION'] || ENV['AWS_DEFAULT_REGION'] || 'us-east-1'
|
|
37
|
-
"arn:aws:lambda:#{region}:123456789012:function-name"
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
module DSL
|
|
43
|
-
include Yake::DSL
|
|
44
|
-
|
|
45
|
-
##
|
|
46
|
-
# Datadog handler wrapper
|
|
47
|
-
def datadog(name, &block)
|
|
48
|
-
define_method(name) do |event:nil, context:nil|
|
|
49
|
-
context ||= MockContext.new
|
|
50
|
-
::Datadog::Lambda.wrap(event, context) do
|
|
51
|
-
Yake.wrap(event, context, &block)
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
logger.formatter = Datadog::Formatter.new
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
extend Yake::Datadog::DSL
|
|
4
|
+
require_relative "datadog/v#{Datadog::Lambda::VERSION::MAJOR}"
|
data/lib/yake/dsl.rb
CHANGED
|
@@ -33,6 +33,19 @@ module Yake
|
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
|
+
|
|
37
|
+
class << self
|
|
38
|
+
def wrap(event = nil, context = nil, &block)
|
|
39
|
+
original_progname = logger.progname
|
|
40
|
+
logger.progname = context&.aws_request_id
|
|
41
|
+
jsonify = -> (obj) { pretty? ? JSON.pretty_generate(obj) : obj.to_json }
|
|
42
|
+
log_return = -> (res) { logger.info("RETURN #{ jsonify === res }") }
|
|
43
|
+
logger.info("EVENT #{ jsonify === event }")
|
|
44
|
+
(yield(event, context) if block_given?).tap(&log_return)
|
|
45
|
+
ensure
|
|
46
|
+
logger.progname = original_progname
|
|
47
|
+
end
|
|
48
|
+
end
|
|
36
49
|
end
|
|
37
50
|
|
|
38
51
|
extend Yake::DSL
|
data/lib/yake/logger.rb
CHANGED
|
@@ -36,17 +36,5 @@ module Yake
|
|
|
36
36
|
def pretty?
|
|
37
37
|
@pretty == true
|
|
38
38
|
end
|
|
39
|
-
|
|
40
|
-
def wrap(event = nil, context = nil, &block)
|
|
41
|
-
original_progname = logger.progname
|
|
42
|
-
logger.progname = context&.aws_request_id
|
|
43
|
-
jsonify = -> (obj) { pretty? ? JSON.pretty_generate(obj) : obj.to_json }
|
|
44
|
-
logger.info("EVENT #{ jsonify === event }")
|
|
45
|
-
yield(event, context).tap do |res|
|
|
46
|
-
logger.info("RETURN #{ jsonify === res }")
|
|
47
|
-
end
|
|
48
|
-
ensure
|
|
49
|
-
logger.progname = original_progname
|
|
50
|
-
end
|
|
51
39
|
end
|
|
52
40
|
end
|
data/lib/yake/support.rb
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'base64'
|
|
2
4
|
require 'digest'
|
|
3
5
|
require 'json'
|
|
4
6
|
require 'time'
|
|
5
7
|
|
|
8
|
+
class Array
|
|
9
|
+
def to_dynamodb() { L: map(&:to_dynamodb) } end
|
|
10
|
+
end
|
|
11
|
+
|
|
6
12
|
class Hash
|
|
7
13
|
def deep_keys() map { |k,v| v.respond_to?(:deep_keys) ? [k] + v.deep_keys : k }.flatten end
|
|
8
14
|
def deep_sort() sort.map { |k,v| [ k, v.try(:deep_sort) { |x| x } ] }.to_h end
|
|
@@ -17,6 +23,23 @@ class Hash
|
|
|
17
23
|
def to_json_sorted() deep_sort.to_json end
|
|
18
24
|
def to_struct() OpenStruct.new(self) end
|
|
19
25
|
|
|
26
|
+
##
|
|
27
|
+
# Adapted from ActiveSupport Hash#deep_merge
|
|
28
|
+
# https://github.com/rails/rails/blob/f95c0b7e96eb36bc3efc0c5beffbb9e84ea664e4/activesupport/lib/active_support/core_ext/hash/deep_merge.rb
|
|
29
|
+
def deep_merge(other, &block)
|
|
30
|
+
merge(other) do |key, a, b|
|
|
31
|
+
if a.is_a?(Hash) && b.is_a?(Hash)
|
|
32
|
+
a.deep_merge(b, &block)
|
|
33
|
+
elsif a.is_a?(Array) && b.is_a?(Array)
|
|
34
|
+
a + b
|
|
35
|
+
elsif block_given?
|
|
36
|
+
yield key, a, b
|
|
37
|
+
else
|
|
38
|
+
b
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
20
43
|
def deep_transform_keys(&block)
|
|
21
44
|
deep_transform(:transform_keys, &block)
|
|
22
45
|
end
|
|
@@ -41,6 +64,27 @@ class Hash
|
|
|
41
64
|
end
|
|
42
65
|
end
|
|
43
66
|
|
|
67
|
+
def to_dynamodb
|
|
68
|
+
map do |key, val|
|
|
69
|
+
{ key => val.is_a?(Hash) ? { M: val.to_dynamodb } : val.to_dynamodb }
|
|
70
|
+
end.reduce(&:merge)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def to_h_from_dynamodb
|
|
74
|
+
decode = -> (i) do
|
|
75
|
+
type, val = i.first
|
|
76
|
+
case type.to_sym
|
|
77
|
+
when :S then val
|
|
78
|
+
when :N then val =~ /^[0-9]+$/ ? val.to_i : val.to_f
|
|
79
|
+
when :L then val.map(&decode)
|
|
80
|
+
when :M then val.transform_values(&decode)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
map do |key, val|
|
|
84
|
+
{ key => decode === val }
|
|
85
|
+
end.reduce(&:merge)
|
|
86
|
+
end
|
|
87
|
+
|
|
44
88
|
private def deep_transform(method, &block)
|
|
45
89
|
f = -> (x) { x.respond_to?(:"deep_#{method}") ? x.send(:"deep_#{method}", &block) : x }
|
|
46
90
|
block_given? ? send(method, &block).map do |key, val|
|
|
@@ -49,6 +93,10 @@ class Hash
|
|
|
49
93
|
end
|
|
50
94
|
end
|
|
51
95
|
|
|
96
|
+
class Numeric
|
|
97
|
+
def to_dynamodb() { N: to_s } end
|
|
98
|
+
end
|
|
99
|
+
|
|
52
100
|
class Integer
|
|
53
101
|
def weeks() days * 7 end
|
|
54
102
|
def days() hours * 24 end
|
|
@@ -82,6 +130,7 @@ class String
|
|
|
82
130
|
def snake_case() gsub(/([a-z])([A-Z])/, '\1_\2').downcase end
|
|
83
131
|
def strict_decode64() Base64.strict_decode64(self) end
|
|
84
132
|
def strict_encode64() Base64.strict_encode64(self) end
|
|
133
|
+
def to_dynamodb() { S: self } end
|
|
85
134
|
def to_h_from_json(**params) JSON.parse(self, **params) end
|
|
86
135
|
def to_h_from_form() URI.decode_www_form(self).to_h end
|
|
87
136
|
def utc() UTC.parse(self) end
|
|
@@ -90,6 +139,7 @@ end
|
|
|
90
139
|
class Symbol
|
|
91
140
|
def camel_case() to_s.camel_case.to_sym end
|
|
92
141
|
def snake_case() to_s.snake_case.to_sym end
|
|
142
|
+
def to_dynamodb() { S: to_s } end
|
|
93
143
|
end
|
|
94
144
|
|
|
95
145
|
class UTC < Time
|
data/lib/yake/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: yake
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Alexander Mancevice
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2023-05-25 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description:
|
|
14
14
|
email:
|
|
@@ -22,6 +22,8 @@ files:
|
|
|
22
22
|
- lib/yake.rb
|
|
23
23
|
- lib/yake/api.rb
|
|
24
24
|
- lib/yake/datadog.rb
|
|
25
|
+
- lib/yake/datadog/v1.rb
|
|
26
|
+
- lib/yake/datadog/v2.rb
|
|
25
27
|
- lib/yake/dsl.rb
|
|
26
28
|
- lib/yake/errors.rb
|
|
27
29
|
- lib/yake/logger.rb
|
|
@@ -46,7 +48,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
46
48
|
- !ruby/object:Gem::Version
|
|
47
49
|
version: '0'
|
|
48
50
|
requirements: []
|
|
49
|
-
rubygems_version: 3.
|
|
51
|
+
rubygems_version: 3.4.10
|
|
50
52
|
signing_key:
|
|
51
53
|
specification_version: 4
|
|
52
54
|
summary: Rake-like DSL for declaring AWS Lambda function handlers
|