yake 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27610c07a200a3f10913adf3a8ce42a892383de03663587f885770b903b48c03
4
- data.tar.gz: 062e3bcfab24054137e70643435c39bfe9e61e37b6882a9fc720b0fb57ded05f
3
+ metadata.gz: d0272be54a9cf2f3b94764ac4c87db1f6047b9fd2e8b13286a8be939adde1387
4
+ data.tar.gz: 9c82744536dd4147039bdf6d3ef8d3e6b395c28ce1d2f64e8999d4a0c80a0a79
5
5
  SHA512:
6
- metadata.gz: c9dbfc3ff7244e92d1a963054ef23007fe31cfabce8a00423d0d4d926fa130017b84e1737d8ba527cb274afce62a06cc59f129c97906bdabfd7c683b99ded112
7
- data.tar.gz: 4d6e4458f0e305468499bef5e069dda1b6912969083c0d18469ffcd7e906c2f29536a670ddaf1bcd63e8734a56b72ec041abaa69898ab6963393128eee6254b7
6
+ metadata.gz: 835f4171028f915170c3a548b175e6e5ee3a1d57162b4b9d6bbb7a33537fc599e9fd535a925a7b7e3b871d507707757d508f8dadcbe4b1368b47b3000a2cfc8f
7
+ data.tar.gz: 8ecc31882ad76a1d999f7e5ad1ab3f1ecbe141041f091a12f5dcfefb728416391dfa14d0632345e9da8e3de6bf66b3372b704ea73c3fbb40365181ec1bb8c808
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:
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'logger'
3
4
 
4
5
  require 'datadog/lambda'
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'logger'
3
4
 
4
5
  require 'datadog/lambda'
data/lib/yake/datadog.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'datadog/lambda'
3
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Yake
4
- VERSION = '0.8.0'
4
+ VERSION = '1.0.0'
5
5
  end
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.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: 2022-11-24 00:00:00.000000000 Z
11
+ date: 2023-05-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -48,7 +48,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
48
48
  - !ruby/object:Gem::Version
49
49
  version: '0'
50
50
  requirements: []
51
- rubygems_version: 3.3.7
51
+ rubygems_version: 3.4.10
52
52
  signing_key:
53
53
  specification_version: 4
54
54
  summary: Rake-like DSL for declaring AWS Lambda function handlers