yake 0.8.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27610c07a200a3f10913adf3a8ce42a892383de03663587f885770b903b48c03
4
- data.tar.gz: 062e3bcfab24054137e70643435c39bfe9e61e37b6882a9fc720b0fb57ded05f
3
+ metadata.gz: fc13e0e5293f2878eedbe89a7e9aa132d72d478751a5d5f159b28ee579d97d59
4
+ data.tar.gz: 29fe7d819734aec8b28b27b30eca18340e37ba59bb24b705efcf3e036ba46479
5
5
  SHA512:
6
- metadata.gz: c9dbfc3ff7244e92d1a963054ef23007fe31cfabce8a00423d0d4d926fa130017b84e1737d8ba527cb274afce62a06cc59f129c97906bdabfd7c683b99ded112
7
- data.tar.gz: 4d6e4458f0e305468499bef5e069dda1b6912969083c0d18469ffcd7e906c2f29536a670ddaf1bcd63e8734a56b72ec041abaa69898ab6963393128eee6254b7
6
+ metadata.gz: 8608775e85da8d706e49a066f2df7df9b133f672cedbb3bb226d7854c48fedec84e45887c92b173fb7be71de5b274a6aa1737cebd7f69dfb87f29f85f9c547e6
7
+ data.tar.gz: 0b746f99b54c0428ff20feb7083aca5addb6479ce395c6fe0d26e20d20fd2973a650a5acc2ad38ab38dc2735b116f144f1e755700222335ed7cc80b7392a4b3b
data/README.md CHANGED
@@ -1,10 +1,12 @@
1
1
  # λake
2
2
 
3
3
  [![gem](https://img.shields.io/gem/v/yake?color=crimson&logo=rubygems&logoColor=eee&style=flat-square)](https://rubygems.org/gems/yake)
4
- [![rspec](https://img.shields.io/github/workflow/status/amancevice/yake/RSpec?logo=github&style=flat-square)](https://github.com/amancevice/yake/actions)
4
+ [![rspec](https://img.shields.io/github/actions/workflow/status/amancevice/yake/rspec.yml?logo=github&style=flat-square)](https://github.com/amancevice/yake/actions/workflows/rspec.yml)
5
5
  [![coverage](https://img.shields.io/codeclimate/coverage/amancevice/yake?logo=code-climate&style=flat-square)](https://codeclimate.com/github/amancevice/yake/test_coverage)
6
6
  [![maintainability](https://img.shields.io/codeclimate/maintainability/amancevice/yake?logo=code-climate&style=flat-square)](https://codeclimate.com/github/amancevice/yake/maintainability)
7
7
 
8
+ [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](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 Duration: 43.97 ms Billed Duration: 44 ms Memory Size: 128 MB Max Memory Used: 77 MB
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:
@@ -329,7 +342,7 @@ UTC.now
329
342
 
330
343
  ## Datadog Integration
331
344
 
332
- As of `~> 0.4`, `yake` comes with a helper for writing Lambdas that integrate with Datadog's `datadog-ruby` gem.
345
+ As of `v1.0`, `yake` comes with a helper for writing Lambdas that integrate with Datadog's `datadog-lambda` gem.
333
346
 
334
347
  As of `~> 0.8`, `yake` uses the v2 Datadog Lambda gem.
335
348
 
@@ -361,7 +374,7 @@ After checking out the repo, run `bundle` to install dependencies. Then, run `ra
361
374
 
362
375
  ## Contributing
363
376
 
364
- Bug reports and pull requests are welcome on GitHub at https://github.com/amancevice/yake.
377
+ Bug reports and pull requests are welcome on GitHub at [amancevice/yake](https://github.com/amancevice/yake).
365
378
 
366
379
  ## License
367
380
 
data/lib/yake/api.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'base64'
4
3
  require 'json'
5
4
 
6
5
  require 'yake'
@@ -21,7 +20,7 @@ module Yake
21
20
 
22
21
  # Decode body if Base64-encoded
23
22
  if event['isBase64Encoded']
24
- body = Base64.strict_decode64(event['body'])
23
+ body = event['body'].unpack1('m0')
25
24
  event.update('body' => body, 'isBase64Encoded' => false)
26
25
  end
27
26
 
data/lib/yake/datadog.rb CHANGED
@@ -1,3 +1,62 @@
1
1
  # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+
2
5
  require 'datadog/lambda'
3
- require_relative "datadog/v#{Datadog::Lambda::VERSION::MAJOR}"
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/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,28 +1,44 @@
1
- require 'base64'
1
+ # frozen_string_literal: true
2
+
2
3
  require 'digest'
3
4
  require 'json'
4
5
  require 'time'
5
6
 
7
+ class Array
8
+ def to_dynamodb = { L: map(&:to_dynamodb) }
9
+ end
10
+
6
11
  class Hash
7
- def deep_keys() map { |k,v| v.respond_to?(:deep_keys) ? [k] + v.deep_keys : k }.flatten end
8
- def deep_sort() sort.map { |k,v| [ k, v.try(:deep_sort) { |x| x } ] }.to_h end
9
- def encode64() to_json.encode64 end
10
- def except(*keys) reject { |key,_| keys.include? key } end
11
- def strict_encode64() to_json.strict_encode64 end
12
- def stringify_names() deep_transform_keys(&:to_s) end
13
- def stringify_names!() deep_transform_keys!(&:to_s) end
14
- def symbolize_names() deep_transform_keys(&:to_sym) end
15
- def symbolize_names!() deep_transform_keys!(&:to_sym) end
16
- def to_form() URI.encode_www_form(self) end
17
- def to_json_sorted() deep_sort.to_json end
18
- def to_struct() OpenStruct.new(self) end
19
-
20
- def deep_transform_keys(&block)
21
- deep_transform(:transform_keys, &block)
22
- end
12
+ def deep_keys = map { |k,v| v.respond_to?(:deep_keys) ? [k] + v.deep_keys : k }.flatten
13
+ def deep_sort = sort.map { |k,v| [ k, v.try(:deep_sort) { |x| x } ] }.to_h
14
+ def deep_transform_keys(&block) = deep_transform(:transform_keys, &block)
15
+ def deep_transform_keys!(&block) = deep_transform(:transform_keys!, &block)
16
+ def encode64 = to_json.encode64
17
+ def except(*keys) = reject { |key,_| keys.include? key }
18
+ def strict_encode64 = to_json.strict_encode64
19
+ def stringify_names = deep_transform_keys(&:to_s)
20
+ def stringify_names! = deep_transform_keys!(&:to_s)
21
+ def symbolize_names = deep_transform_keys(&:to_sym)
22
+ def symbolize_names! = deep_transform_keys!(&:to_sym)
23
+ def to_form = URI.encode_www_form(self)
24
+ def to_json_sorted = deep_sort.to_json
25
+ def to_struct = OpenStruct.new(self)
23
26
 
24
- def deep_transform_keys!(&block)
25
- deep_transform(:transform_keys!, &block)
27
+ ##
28
+ # Adapted from ActiveSupport Hash#deep_merge
29
+ # https://github.com/rails/rails/blob/f95c0b7e96eb36bc3efc0c5beffbb9e84ea664e4/activesupport/lib/active_support/core_ext/hash/deep_merge.rb
30
+ def deep_merge(other, &block)
31
+ merge(other) do |key, a, b|
32
+ if a.is_a?(Hash) && b.is_a?(Hash)
33
+ a.deep_merge(b, &block)
34
+ elsif a.is_a?(Array) && b.is_a?(Array)
35
+ a + b
36
+ elsif block_given?
37
+ yield key, a, b
38
+ else
39
+ b
40
+ end
41
+ end
26
42
  end
27
43
 
28
44
  def to_deep_struct
@@ -41,7 +57,30 @@ class Hash
41
57
  end
42
58
  end
43
59
 
44
- private def deep_transform(method, &block)
60
+ def to_dynamodb
61
+ map do |key, val|
62
+ { key => val.is_a?(Hash) ? { M: val.to_dynamodb } : val.to_dynamodb }
63
+ end.reduce(&:merge)
64
+ end
65
+
66
+ def to_h_from_dynamodb
67
+ decode = -> (i) do
68
+ type, val = i.first
69
+ case type.to_sym
70
+ when :S then val
71
+ when :N then val =~ /^[0-9]+$/ ? val.to_i : val.to_f
72
+ when :L then val.map(&decode)
73
+ when :M then val.transform_values(&decode)
74
+ end
75
+ end
76
+ map do |key, val|
77
+ { key => decode === val }
78
+ end.reduce(&:merge)
79
+ end
80
+
81
+ private
82
+
83
+ def deep_transform(method, &block)
45
84
  f = -> (x) { x.respond_to?(:"deep_#{method}") ? x.send(:"deep_#{method}", &block) : x }
46
85
  block_given? ? send(method, &block).map do |key, val|
47
86
  [key, val.is_a?(Array) ? val.map(&f) : val.then(&f)]
@@ -49,13 +88,17 @@ class Hash
49
88
  end
50
89
  end
51
90
 
91
+ class Numeric
92
+ def to_dynamodb = { N: to_s }
93
+ end
94
+
52
95
  class Integer
53
- def weeks() days * 7 end
54
- def days() hours * 24 end
55
- def hours() minutes * 60 end
56
- def minutes() seconds * 60 end
57
- def seconds() self end
58
- def utc() UTC.at(self) end
96
+ def weeks = days * 7
97
+ def days = hours * 24
98
+ def hours = minutes * 60
99
+ def minutes = seconds * 60
100
+ def seconds = self
101
+ def utc = UTC.at(self)
59
102
 
60
103
  alias :second :seconds
61
104
  alias :minute :minutes
@@ -73,27 +116,29 @@ class Object
73
116
  end
74
117
 
75
118
  class String
76
- def /(path) File.join(self, path.to_s) end
77
- def camel_case() split(/_/).map(&:capitalize).join end
78
- def decode64() Base64.decode64(self) end
79
- def encode64() Base64.encode64(self) end
80
- def md5sum() Digest::MD5.hexdigest(self) end
81
- def sha1sum() Digest::SHA1.hexdigest(self) end
82
- def snake_case() gsub(/([a-z])([A-Z])/, '\1_\2').downcase end
83
- def strict_decode64() Base64.strict_decode64(self) end
84
- def strict_encode64() Base64.strict_encode64(self) end
85
- def to_h_from_json(**params) JSON.parse(self, **params) end
86
- def to_h_from_form() URI.decode_www_form(self).to_h end
87
- def utc() UTC.parse(self) end
119
+ def /(path) = File.join(self, path.to_s)
120
+ def camel_case = split(/_/).map(&:capitalize).join
121
+ def decode64 = self.unpack1('m')
122
+ def encode64 = [self].pack('m')
123
+ def md5sum = Digest::MD5.hexdigest(self)
124
+ def sha1sum = Digest::SHA1.hexdigest(self)
125
+ def snake_case = gsub(/([a-z])([A-Z])/, '\1_\2').downcase
126
+ def strict_decode64 = self.unpack1('m0')
127
+ def strict_encode64 = [self].pack('m0')
128
+ def to_dynamodb = { S: self }
129
+ def to_h_from_json(...) = JSON.parse(self, ...)
130
+ def to_h_from_form = URI.decode_www_form(self).to_h
131
+ def utc = UTC.parse(self)
88
132
  end
89
133
 
90
134
  class Symbol
91
- def camel_case() to_s.camel_case.to_sym end
92
- def snake_case() to_s.snake_case.to_sym end
135
+ def camel_case = to_s.camel_case.to_sym
136
+ def snake_case = to_s.snake_case.to_sym
137
+ def to_dynamodb = { S: to_s }
93
138
  end
94
139
 
95
140
  class UTC < Time
96
- def initialize(...) super.utc end
97
- def self.at(...) super.utc end
98
- def self.now() super.utc end
141
+ def initialize(...) = super.utc
142
+ def self.at(...) = super.utc
143
+ def self.now = super.utc
99
144
  end
data/lib/yake/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Yake
4
- VERSION = '0.8.0'
4
+ VERSION = '1.1.0'
5
5
  end
data/lib/yake.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "yake/version"
4
- require_relative "yake/logger"
5
- require_relative "yake/errors"
6
- require_relative "yake/dsl"
3
+ require_relative 'yake/version'
4
+ require_relative 'yake/logger'
5
+ require_relative 'yake/errors'
6
+ require_relative 'yake/dsl'
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.8.0
4
+ version: 1.1.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: 2022-11-24 00:00:00.000000000 Z
11
+ date: 2024-01-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -22,8 +22,6 @@ 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
27
25
  - lib/yake/dsl.rb
28
26
  - lib/yake/errors.rb
29
27
  - lib/yake/logger.rb
@@ -41,14 +39,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
41
39
  requirements:
42
40
  - - ">="
43
41
  - !ruby/object:Gem::Version
44
- version: 2.7.5
42
+ version: 3.2.0
45
43
  required_rubygems_version: !ruby/object:Gem::Requirement
46
44
  requirements:
47
45
  - - ">="
48
46
  - !ruby/object:Gem::Version
49
47
  version: '0'
50
48
  requirements: []
51
- rubygems_version: 3.3.7
49
+ rubygems_version: 3.5.3
52
50
  signing_key:
53
51
  specification_version: 4
54
52
  summary: Rake-like DSL for declaring AWS Lambda function handlers
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'logger'
3
-
4
- require 'datadog/lambda'
5
- require 'yake'
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
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'logger'
3
-
4
- require 'datadog/lambda'
5
- require 'yake'
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::Tracing.log_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