aurora-data-api 0.1.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.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.rake_tasks~ +10 -0
  3. data/.standard.yml +6 -0
  4. data/CHANGELOG.md +3 -0
  5. data/CODE_OF_CONDUCT.md +84 -0
  6. data/Gemfile +15 -0
  7. data/Gemfile.lock +103 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +236 -0
  10. data/Rakefile +18 -0
  11. data/Steepfile +5 -0
  12. data/aurora-data-api.gemspec +34 -0
  13. data/example/.gitignore +58 -0
  14. data/example/.ruby-version +1 -0
  15. data/example/Dockerfile +26 -0
  16. data/example/Gemfile +9 -0
  17. data/example/Gemfile.lock +48 -0
  18. data/example/README.md +45 -0
  19. data/example/Rakefile +48 -0
  20. data/example/app/depots/comment_depot.rb +6 -0
  21. data/example/app/depots/entry_depot.rb +6 -0
  22. data/example/app/depots/user_depot.rb +6 -0
  23. data/example/app/handlers/main.rb +86 -0
  24. data/example/app/models/comment.rb +10 -0
  25. data/example/app/models/entry.rb +12 -0
  26. data/example/app/models/user.rb +13 -0
  27. data/example/compose.yml +43 -0
  28. data/example/db/.gitignore +2 -0
  29. data/example/db/.keep +0 -0
  30. data/example/package-lock.json +4740 -0
  31. data/example/package.json +17 -0
  32. data/example/serverless.yml +184 -0
  33. data/exe/aurora-data-api +161 -0
  34. data/lib/aurora-data-api/data_service.rb +42 -0
  35. data/lib/aurora-data-api/depot.rb +132 -0
  36. data/lib/aurora-data-api/environment.rb +41 -0
  37. data/lib/aurora-data-api/model.rb +152 -0
  38. data/lib/aurora-data-api/version.rb +5 -0
  39. data/lib/aurora-data-api.rb +14 -0
  40. data/sig/aurora-data-api.rbs +20 -0
  41. data/sig/data_service.rbs +7 -0
  42. data/sig/depot.rbs +23 -0
  43. data/sig/environment.rbs +13 -0
  44. data/sig/model.rbs +39 -0
  45. data/sig/version.rbs +3 -0
  46. metadata +120 -0
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AuroraDataApi
4
+ class Model
5
+ SCHEMA = {}
6
+ STRUCTS = {}
7
+
8
+ def self.model_name
9
+ to_s.to_sym
10
+ end
11
+
12
+ def self.literal_id(lit)
13
+ SCHEMA[model_name] ||= {}
14
+ SCHEMA[model_name][:literal_id] = lit
15
+ end
16
+
17
+ def self.table_name
18
+ SCHEMA.dig(model_name, :table_name)
19
+ end
20
+
21
+ def self.table(name)
22
+ SCHEMA[model_name] ||= {}
23
+ SCHEMA[model_name][:table_name] = name
24
+ end
25
+
26
+ def self.schema(&block)
27
+ block.call
28
+ STRUCTS[model_name] = Struct.new(model_name.to_s, *SCHEMA[model_name][:cols].keys)
29
+ table("#{name.to_s.downcase}s".to_sym) if table_name.nil?
30
+ end
31
+
32
+ def self.col(name, type, opt = {})
33
+ SCHEMA[model_name] ||= {}
34
+ SCHEMA[model_name][:cols] ||= {}
35
+ if type.is_a? Symbol
36
+ SCHEMA[model_name][:cols]["#{name}_#{SCHEMA[model_name][:literal_id] || :id}".to_sym] = {type: Integer}
37
+ end
38
+ SCHEMA[model_name][:cols][name] = {type: type, opt: opt}
39
+ end
40
+
41
+ def self.timestamp
42
+ col :created_at, Time, null: false
43
+ col :updated_at, Time, null: false
44
+ end
45
+
46
+ def self.relationship_by(table_sym)
47
+ result = Model::SCHEMA[name&.to_sym].select { |_k, v|
48
+ v.is_a? Hash
49
+ }.select { |_k, v|
50
+ v.dig(:opt, :table) == table_sym
51
+ }
52
+ result.count > 0 ? [result.keys[0], result.values[0][:type]] : nil
53
+ end
54
+
55
+ def initialize(**params)
56
+ @struct = STRUCTS[self.class.model_name].new
57
+ @timestamp = %i[created_at updated_at].all? { |m| members.include?(m) }
58
+ params.each do |col, val|
59
+ if col == literal_id
60
+ @id = val if val.is_a?(Integer)
61
+ else
62
+ @struct[col] = val
63
+ end
64
+ end
65
+ end
66
+
67
+ attr_reader :id, :timestamp
68
+
69
+ def set_timestamp(at:)
70
+ return false unless @timestamp
71
+ self.updated_at = Time.now
72
+ self.created_at = Time.now if at == :create
73
+ true
74
+ end
75
+
76
+ def members
77
+ [literal_id] + @struct.members
78
+ end
79
+
80
+ def respond_to_missing?(symbol, include_private)
81
+ # test-unit calls :encoding in assert_equal
82
+ !(%i[encoding].include? symbol)
83
+ end
84
+
85
+ def method_missing(method_name, *args, &block)
86
+ string_name = method_name.to_s
87
+ if string_name[-1] == "="
88
+ @struct[string_name.chop] = args[0]
89
+ elsif string_name[-3, 3] == "_#{literal_id}"
90
+ @struct[string_name.sub(/_#{literal_id}\z/, "")]&.id || @struct[method_name]
91
+ elsif method_name == literal_id
92
+ @id
93
+ elsif members.include?(method_name)
94
+ if @struct[method_name].nil?
95
+ col_id = "#{method_name}_#{literal_id}".to_sym
96
+ if members.include?(col_id) && @struct[col_id]
97
+ col_model = SCHEMA[self.class.name&.to_sym][:cols].dig(method_name, :type)
98
+ return nil unless col_model
99
+ @struct[method_name] = AuroraDataApi.const_get("#{col_model}Depot".to_sym).select(
100
+ %(where "#{literal_id}" = :id), id: @struct[col_id]
101
+ )[0]
102
+ end
103
+ else
104
+ @struct[method_name]
105
+ end
106
+ else
107
+ super
108
+ end
109
+ end
110
+
111
+ def table_name
112
+ SCHEMA[self.class.name&.to_sym][:table_name]
113
+ end
114
+
115
+ def literal_id
116
+ SCHEMA[self.class.model_name][:literal_id] || :id
117
+ end
118
+
119
+ def build_params(include_id: false)
120
+ {}.tap do |hash|
121
+ members.each do |member|
122
+ next if member == literal_id && !include_id
123
+ next if SCHEMA[self.class.name&.to_sym][:cols][member][:type].is_a? Symbol
124
+ send(member).then { |v| hash[member] = v }
125
+ end
126
+ end
127
+ end
128
+
129
+ def attributes
130
+ {}.tap do |hash|
131
+ members.each do |member|
132
+ next if member.to_s.match?(/_#{literal_id}\z/)
133
+ send(member).then do |v|
134
+ hash[member] = v.is_a?(Model) ? v.attributes : v
135
+ end
136
+ end
137
+ end
138
+ end
139
+
140
+ def _set_id(id)
141
+ @id = id
142
+ end
143
+
144
+ def _destroy
145
+ @id = nil
146
+ @struct.members.each do |member|
147
+ @struct[member] = nil unless member == literal_id
148
+ end
149
+ true
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AuroraDataApi
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "aurora-data-api/version"
4
+ require_relative "aurora-data-api/model"
5
+ require_relative "aurora-data-api/depot"
6
+ require_relative "aurora-data-api/data_service"
7
+
8
+ module AuroraDataApi
9
+ class Error < StandardError; end
10
+ # Your code goes here...
11
+ end
12
+
13
+ class Date
14
+ end
@@ -0,0 +1,20 @@
1
+ module AuroraDataApi
2
+ Error: StandardError
3
+ end
4
+
5
+ class Date
6
+ end
7
+
8
+ module Aws
9
+ def self.config: -> Hash[Symbol, untyped]
10
+
11
+ class Credentials
12
+ def initialize: (String, String) -> untyped
13
+ end
14
+
15
+ module RDSDataService
16
+ class Client
17
+ def initialize: (Hash[Symbol, String]) -> void
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ module AuroraDataApi
2
+ class DataService
3
+ def initialize: () -> void
4
+ def execute: (Hash[Symbol, untyped] hash, ?bool without_database) -> untyped
5
+ def offline_config_update: () -> void
6
+ end
7
+ end
data/sig/depot.rbs ADDED
@@ -0,0 +1,23 @@
1
+ # TypeProf 0.21.2
2
+
3
+ # Classes
4
+ module AuroraDataApi
5
+ class Depot
6
+ @model: untyped
7
+ @data_service: DataService
8
+ @table_name: String
9
+ @literal_id: Symbol
10
+
11
+ def self.[]: (singleton(Model) model) -> Depot
12
+ def initialize: (singleton(Model) model, Proc block) -> void
13
+ def table_name: -> String
14
+ def literal_id: -> Symbol
15
+ def insert: (Model obj) -> untyped
16
+ def update: (Model obj) -> true
17
+ def delete: (Model obj) -> true
18
+ def count: (?String str, **untyped) -> Integer
19
+ def select: (String str, **untyped) -> untyped
20
+ def column_data: (untyped meta, untyped col) -> untyped
21
+ def query: (String str, **untyped) -> untyped
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ # TypeProf 0.21.2
2
+
3
+ # Classes
4
+ module AuroraDataApi
5
+ class Environment
6
+ def self.offline?: -> bool
7
+ def self.offline_endpoint: -> String
8
+ def self.database_name: -> String?
9
+ def self.region: -> String
10
+ def self.secret_arn: -> String?
11
+ def self.resource_arn: -> String?
12
+ end
13
+ end
data/sig/model.rbs ADDED
@@ -0,0 +1,39 @@
1
+ # TypeProf 0.21.2
2
+
3
+ # Classes
4
+ module AuroraDataApi
5
+ class Model
6
+ SCHEMA: Hash[untyped, untyped]
7
+ STRUCTS: Hash[untyped, untyped]
8
+ @struct: untyped
9
+
10
+ def self.model_name: -> Symbol
11
+ def self.literal_id: (Symbol lit) -> Symbol
12
+ def self.table: (Symbol name) -> Symbol
13
+ def self.table_name: -> Symbol
14
+ def self.schema: () { () -> void } -> void
15
+ def self.col: (Symbol name, singleton(String) | singleton(Time) | singleton(Date) | singleton(Integer) | Symbol type, ?Hash[Symbol, Symbol | bool] opt) -> void
16
+ def self.timestamp: -> void
17
+ def self.relationship_by: (Symbol table_sym) -> [untyped, untyped]?
18
+ def initialize: (**Hash[Symbol, untyped]) -> void
19
+
20
+ attr_reader id: Integer?
21
+ attr_reader timestamp: bool
22
+ attr_accessor created_at: Time
23
+ attr_accessor updated_at: Time
24
+
25
+ def set_timestamp: (at: :update | :create) -> bool
26
+ def members: -> Array[Symbol]
27
+ def respond_to_missing?: (untyped symbol, untyped include_private) -> true
28
+ def method_missing: (untyped method_name, *untyped args) -> nil
29
+ def table_name: -> Symbol
30
+ def literal_id: -> Symbol
31
+ def build_params: (?include_id: bool) -> Hash[Symbol, untyped]
32
+ def attributes: -> Hash[Symbol, untyped]
33
+ def _set_id: (Integer? id) -> void
34
+ def _destroy: -> bool
35
+ end
36
+ end
37
+
38
+ class AnonymousStruct_generated_1 < Struct[untyped]
39
+ end
data/sig/version.rbs ADDED
@@ -0,0 +1,3 @@
1
+ module AuroraDataApi
2
+ VERSION: String
3
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aurora-data-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - HASUMI Hitoshi
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-05-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk-rdsdataservice
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.35.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.35.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Assuming you are using AWS Lambda as a backend, Aurora Serverless v1
42
+ (NOT v2) as a database, and Data API as an adapter
43
+ email:
44
+ - hasumikin@gmail.com
45
+ executables:
46
+ - aurora-data-api
47
+ extensions: []
48
+ extra_rdoc_files: []
49
+ files:
50
+ - ".rake_tasks~"
51
+ - ".standard.yml"
52
+ - CHANGELOG.md
53
+ - CODE_OF_CONDUCT.md
54
+ - Gemfile
55
+ - Gemfile.lock
56
+ - LICENSE.txt
57
+ - README.md
58
+ - Rakefile
59
+ - Steepfile
60
+ - aurora-data-api.gemspec
61
+ - example/.gitignore
62
+ - example/.ruby-version
63
+ - example/Dockerfile
64
+ - example/Gemfile
65
+ - example/Gemfile.lock
66
+ - example/README.md
67
+ - example/Rakefile
68
+ - example/app/depots/comment_depot.rb
69
+ - example/app/depots/entry_depot.rb
70
+ - example/app/depots/user_depot.rb
71
+ - example/app/handlers/main.rb
72
+ - example/app/models/comment.rb
73
+ - example/app/models/entry.rb
74
+ - example/app/models/user.rb
75
+ - example/compose.yml
76
+ - example/db/.gitignore
77
+ - example/db/.keep
78
+ - example/package-lock.json
79
+ - example/package.json
80
+ - example/serverless.yml
81
+ - exe/aurora-data-api
82
+ - lib/aurora-data-api.rb
83
+ - lib/aurora-data-api/data_service.rb
84
+ - lib/aurora-data-api/depot.rb
85
+ - lib/aurora-data-api/environment.rb
86
+ - lib/aurora-data-api/model.rb
87
+ - lib/aurora-data-api/version.rb
88
+ - sig/aurora-data-api.rbs
89
+ - sig/data_service.rbs
90
+ - sig/depot.rbs
91
+ - sig/environment.rbs
92
+ - sig/model.rbs
93
+ - sig/version.rbs
94
+ homepage: https://github.com/hasumikin/aurora-data-api
95
+ licenses:
96
+ - MIT
97
+ metadata:
98
+ homepage_uri: https://github.com/hasumikin/aurora-data-api
99
+ source_code_uri: https://github.com/hasumikin/aurora-data-api
100
+ changelog_uri: https://github.com/hasumikin/aurora-data-api/blob/master/CHANGELOG.md
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 2.7.0
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubygems_version: 3.3.14
117
+ signing_key:
118
+ specification_version: 4
119
+ summary: A kind of ORM for Amazon Aurora Serverless v1
120
+ test_files: []