edgeway 0.1.0 → 0.3.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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +55 -0
  3. data/README.md +784 -125
  4. data/js/cloudflare-d1-sessions.js +68 -0
  5. data/js/cloudflare-kv.js +47 -0
  6. data/js/cloudflare-ratelimit.js +31 -0
  7. data/js/cloudflare-test-database.js +112 -0
  8. data/js/cloudflare-test-runner.js +76 -0
  9. data/js/cloudflare.js +144 -22
  10. data/js/cors.js +15 -16
  11. data/js/fetch.js +113 -0
  12. data/js/headers.js +16 -0
  13. data/js/jspi.js +32 -0
  14. data/js/jwt.js +6 -40
  15. data/js/runtime.js +42 -5
  16. data/lib/edgeway/application.rb +21 -9
  17. data/lib/edgeway/cache/limits.rb +8 -0
  18. data/lib/edgeway/cache/memory_store.rb +24 -0
  19. data/lib/edgeway/cache/null_store.rb +13 -0
  20. data/lib/edgeway/cache/store.rb +189 -0
  21. data/lib/edgeway/cache.rb +13 -0
  22. data/lib/edgeway/cli/build/app_config.rb +39 -0
  23. data/lib/edgeway/cli/build/app_files.rb +40 -0
  24. data/lib/edgeway/cli/build/cache_config.rb +108 -0
  25. data/lib/edgeway/cli/build/database_config.rb +96 -0
  26. data/lib/edgeway/cli/build/js_files.rb +30 -0
  27. data/lib/edgeway/cli/build/view_compiler.rb +191 -0
  28. data/lib/edgeway/cli/build.rb +50 -18
  29. data/lib/edgeway/cli/cloudflare_test/wasm_test_cli.rb +35 -0
  30. data/lib/edgeway/cli/cloudflare_test.rb +120 -0
  31. data/lib/edgeway/cli/generate.rb +174 -26
  32. data/lib/edgeway/cli/new.rb +1 -1
  33. data/lib/edgeway/cli/test.rb +28 -9
  34. data/lib/edgeway/cli/toolchain.rb +5 -0
  35. data/lib/edgeway/cli.rb +7 -4
  36. data/lib/edgeway/controller/base.rb +32 -3
  37. data/lib/edgeway/controller/caching.rb +140 -0
  38. data/lib/edgeway/controller/callbacks.rb +5 -1
  39. data/lib/edgeway/controller/dispatcher.rb +11 -1
  40. data/lib/edgeway/controller/rate_limiting.rb +145 -0
  41. data/lib/edgeway/controller/rendering.rb +24 -4
  42. data/lib/edgeway/db/adapter.rb +38 -0
  43. data/lib/edgeway/db/memory.rb +9 -2
  44. data/lib/edgeway/db/query_stats.rb +42 -0
  45. data/lib/edgeway/db/sqlite.rb +73 -9
  46. data/lib/edgeway/errors.rb +43 -0
  47. data/lib/edgeway/generators/app/templates/.github/workflows/ci.yml.tt +38 -0
  48. data/lib/edgeway/generators/app/templates/.ruby-version.tt +1 -0
  49. data/lib/edgeway/generators/app/templates/README.md.tt +8 -2
  50. data/lib/edgeway/generators/app/templates/app/views/layouts/application.html.erb +11 -0
  51. data/lib/edgeway/generators/app/templates/bin/build.tt +1 -1
  52. data/lib/edgeway/generators/app/templates/bin/deploy.tt +1 -1
  53. data/lib/edgeway/generators/app/templates/bin/setup.tt +2 -3
  54. data/lib/edgeway/generators/app/templates/bin/test.tt +7 -0
  55. data/lib/edgeway/generators/app/templates/config/cache.yml +22 -0
  56. data/lib/edgeway/generators/app/templates/config/database.yml +25 -2
  57. data/lib/edgeway/generators/app/templates/mise.toml.tt +1 -1
  58. data/lib/edgeway/generators/app/templates/public/.assetsignore +1 -0
  59. data/lib/edgeway/generators/app/templates/wrangler.toml.tt +39 -0
  60. data/lib/edgeway/http/auth/stub.rb +1 -3
  61. data/lib/edgeway/http/client.rb +80 -0
  62. data/lib/edgeway/http/request.rb +7 -22
  63. data/lib/edgeway/http/stub_transport.rb +38 -0
  64. data/lib/edgeway/inflector.rb +19 -0
  65. data/lib/edgeway/logger.rb +33 -5
  66. data/lib/edgeway/model/attributes.rb +93 -10
  67. data/lib/edgeway/model/base.rb +50 -5
  68. data/lib/edgeway/model/connection_registry.rb +25 -0
  69. data/lib/edgeway/model/macros.rb +5 -1
  70. data/lib/edgeway/model/persistence.rb +18 -11
  71. data/lib/edgeway/model/relation.rb +106 -56
  72. data/lib/edgeway/model/validations.rb +29 -23
  73. data/lib/edgeway/rate_limit/limiter.rb +9 -0
  74. data/lib/edgeway/rate_limit/null_limiter.rb +9 -0
  75. data/lib/edgeway/rate_limit/stub_limiter.rb +24 -0
  76. data/lib/edgeway/rate_limit.rb +2 -0
  77. data/lib/edgeway/routing/route.rb +1 -6
  78. data/lib/edgeway/server.rb +13 -0
  79. data/lib/edgeway/service/cloudflare/d1.rb +44 -30
  80. data/lib/edgeway/service/cloudflare/jwt.rb +3 -15
  81. data/lib/edgeway/service/cloudflare/kv.rb +45 -0
  82. data/lib/edgeway/service/cloudflare/kv_store.rb +58 -0
  83. data/lib/edgeway/service/cloudflare/rate_limit.rb +27 -0
  84. data/lib/edgeway/service/cloudflare/rate_limiter.rb +33 -0
  85. data/lib/edgeway/service/cloudflare/test_databases.rb +65 -0
  86. data/lib/edgeway/service/fetch.rb +26 -0
  87. data/lib/edgeway/service/import_result.rb +24 -0
  88. data/lib/edgeway/test/sqlite_databases.rb +18 -0
  89. data/lib/edgeway/test.rb +86 -26
  90. data/lib/edgeway/version.rb +1 -1
  91. data/lib/edgeway/view.rb +24 -0
  92. data/lib/edgeway.rb +9 -0
  93. metadata +50 -4
  94. data/lib/edgeway/cli/app_config.rb +0 -35
  95. data/lib/edgeway/cli/app_files.rb +0 -37
@@ -0,0 +1,24 @@
1
+ module Edgeway
2
+ module ImportResult
3
+ ffi_source <<~C
4
+ #include <stdlib.h>
5
+
6
+ typedef struct {
7
+ char *text;
8
+ int capacity;
9
+ } ImportResultBuffer;
10
+
11
+ static const char *take_import_result(ImportResultBuffer *buffer, int length, void (*take)(char *)) {
12
+ if (length + 1 > buffer->capacity) {
13
+ char *grown = realloc(buffer->text, length + 1);
14
+ if (!grown) abort();
15
+ buffer->text = grown;
16
+ buffer->capacity = length + 1;
17
+ }
18
+ take(buffer->text);
19
+ buffer->text[length] = 0;
20
+ return buffer->text;
21
+ }
22
+ C
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ module Edgeway
2
+ module TestDatabases
3
+ # Called before each test.
4
+ def self.reset
5
+ end
6
+
7
+ def self.open(name)
8
+ migrations = name == Edgeway::Model::PRIMARY ? "db/migrations" : "db/#{name}/migrations"
9
+ directory = File.join(Edgeway::TEST_APP_ROOT, migrations)
10
+ if name != Edgeway::Model::PRIMARY && !File.directory?(directory)
11
+ raise Edgeway::ConfigurationError, "database #{name} (config/database.yml) has no #{migrations} directory"
12
+ end
13
+ database = Edgeway::DB::SQLiteAdapter.new(":memory:")
14
+ database.apply_migrations(directory)
15
+ database
16
+ end
17
+ end
18
+ end
data/lib/edgeway/test.rb CHANGED
@@ -3,14 +3,15 @@
3
3
  # and tmp/test_app.rb, which `edgeway test` rewrites on every run (and which
4
4
  # is git-ignored): Spinel resolves require
5
5
  # at compile time, so the app's files are listed there (in Build's order)
6
- # rather than found at run time. Unlike build/main.rb it never calls
6
+ # rather than found at run time, and so is the database the tests use
7
+ # (Edgeway::TestDatabases). Unlike build/main.rb it never calls
7
8
  # Edgeway::Server.run. Run the tests with `edgeway test`, not spinel_test-unit
8
9
  # directly: a missing or stale tmp/test_app.rb only shows up as Spinel's own
9
10
  # "cannot find tmp/test_app" (the message cannot be customised at compile time).
10
11
  require "spinel_test/unit"
11
12
  require "edgeway"
12
- require "edgeway/db/memory"
13
- require "edgeway/db/sqlite"
13
+ require "edgeway/http/stub_transport"
14
+ require "edgeway/rate_limit/stub_limiter"
14
15
  require "tmp/test_app"
15
16
 
16
17
  module Edgeway
@@ -25,22 +26,61 @@ module Edgeway
25
26
  end
26
27
  end
27
28
 
28
- # What a model test needs: a fresh in-memory SQLite database per test
29
- # (SQLiteAdapter), with the app's db/migrations applied in file name order,
30
- # so a test can check what was stored (Todo.find, db.select_all) and read
31
- # db.log for the SQL. Edgeway's own tests use MemoryAdapter instead, which
32
- # stores nothing.
29
+ # What a model test needs: a fresh database per test (Edgeway::TestDatabases,
30
+ # chosen by `edgeway test` from config/database.yml), with the app's
31
+ # db/migrations applied in file name order, so a test can check what was
32
+ # stored (Todo.find, db.select_all) and read db.log for the SQL. A database
33
+ # under databases: in config/database.yml gets its own, with
34
+ # db/NAME/migrations, read with db(:name). Edgeway's own tests use
35
+ # MemoryAdapter instead, which stores nothing. Edgeway.cache is a NullStore in
36
+ # every test, whatever config/cache.yml says; a test that checks caching sets
37
+ # `Edgeway.cache = Edgeway::Cache::MemoryStore.new` itself. The rate limiter
38
+ # allows every request and records the checks (stub_rate_limit,
39
+ # rate_limit_checks).
33
40
  class UnitTest < SpinelTest::Unit::TestCase
34
- attr_reader :db
35
-
36
41
  def setup
37
- @db = Edgeway::DB::SQLiteAdapter.new(":memory:")
38
- @db.apply_migrations(File.join(Edgeway::TEST_APP_ROOT, "db/migrations"))
39
- Edgeway::Model.connection = @db
42
+ @databases = {}
43
+ @http = Edgeway::HTTP::StubTransport.new
44
+ Edgeway::HTTP.client = @http
45
+ Edgeway.cache = Edgeway::Cache::NullStore.new
46
+ @rate_limiter = Edgeway::RateLimit::StubLimiter.new
47
+ Edgeway::Controller.rate_limiter = @rate_limiter
48
+ Edgeway::TestDatabases.reset
49
+ open_database(Edgeway::Model::PRIMARY)
50
+ Edgeway::TEST_DATABASES.each { |name| open_database(name) }
40
51
  end
41
52
 
42
53
  def teardown
43
- @db.close
54
+ @databases.each do |name, database|
55
+ database.close
56
+ Edgeway::Model.disconnect(name)
57
+ end
58
+ end
59
+
60
+ def db(name = Edgeway::Model::PRIMARY) = @databases.fetch(name.to_s)
61
+
62
+ def stub_http(verb, url, status: 200, body: "", headers: {})
63
+ @http.stub(verb, url, status, body, headers)
64
+ end
65
+
66
+ def stub_http_error(verb, url, message = "connection failed", timeout: false)
67
+ @http.stub_error(verb, url, message, timeout)
68
+ end
69
+
70
+ def http_requests = @http.requests
71
+
72
+ def stub_rate_limit(binding_name, exceeded: true)
73
+ @rate_limiter.stub(binding_name, exceeded)
74
+ end
75
+
76
+ def rate_limit_checks = @rate_limiter.checks
77
+
78
+ private
79
+
80
+ def open_database(name)
81
+ database = Edgeway::TestDatabases.open(name)
82
+ Edgeway::Model.connect(name, database)
83
+ @databases[name] = database
44
84
  end
45
85
  end
46
86
 
@@ -55,11 +95,11 @@ module Edgeway
55
95
  @json = nil
56
96
  end
57
97
 
58
- def get(path, json: nil, headers: {}) = request("GET", path, json, headers)
59
- def delete(path, json: nil, headers: {}) = request("DELETE", path, json, headers)
60
- def post(path, json: nil, headers: {}) = request("POST", path, json, headers)
61
- def put(path, json: nil, headers: {}) = request("PUT", path, json, headers)
62
- def patch(path, json: nil, headers: {}) = request("PATCH", path, json, headers)
98
+ def get(path, json: nil, headers: {}, remote_addr: "") = request("GET", path, json, headers, remote_addr)
99
+ def delete(path, json: nil, headers: {}, remote_addr: "") = request("DELETE", path, json, headers, remote_addr)
100
+ def post(path, json: nil, headers: {}, remote_addr: "") = request("POST", path, json, headers, remote_addr)
101
+ def put(path, json: nil, headers: {}, remote_addr: "") = request("PUT", path, json, headers, remote_addr)
102
+ def patch(path, json: nil, headers: {}, remote_addr: "") = request("PATCH", path, json, headers, remote_addr)
63
103
 
64
104
  # The body parsed as JSON.
65
105
  def json
@@ -73,7 +113,7 @@ module Edgeway
73
113
 
74
114
  private
75
115
 
76
- def request(verb, target, json, headers)
116
+ def request(verb, target, json, headers, remote_addr)
77
117
  path = target
78
118
  query = ""
79
119
  q = target.index("?")
@@ -83,15 +123,35 @@ module Edgeway
83
123
  end
84
124
  body = json.nil? ? "" : JSON.generate(json)
85
125
  content_type = json.nil? ? "" : "application/json"
86
- headers.each { |k, v| ENV["HTTP_" + k.upcase.gsub("-", "_")] = v }
87
- begin
88
- res = Edgeway.application.call(Edgeway::HTTP::Request.new(verb, path, query, content_type, body))
89
- ensure
90
- headers.each { |k, _v| ENV.delete("HTTP_" + k.upcase.gsub("-", "_")) }
91
- end
126
+ res = call_application(Edgeway::HTTP::Request.new(verb, path, query, content_type, body), headers, remote_addr)
92
127
  @json = nil
93
128
  @response = Edgeway::TestResponse.new(res.status, res.body, res.headers)
94
129
  @response
95
130
  end
131
+
132
+ def call_application(http_request, headers, remote_addr)
133
+ variables = { "REMOTE_ADDR" => remote_addr }
134
+ headers.each { |name, value| variables["HTTP_" + name.upcase.gsub("-", "_")] = value }
135
+ with_environment(variables) { Edgeway.application.call(http_request) }
136
+ end
137
+
138
+ def with_environment(variables)
139
+ previous = {}
140
+ variables.each_key { |name| previous[name] = ENV[name].to_s unless ENV[name].nil? }
141
+ begin
142
+ variables.each { |name, value| ENV[name] = value }
143
+ yield
144
+ ensure
145
+ variables.each_key { |name| restore_variable(name, previous) }
146
+ end
147
+ end
148
+
149
+ def restore_variable(name, previous)
150
+ if previous.key?(name)
151
+ ENV[name] = previous[name]
152
+ else
153
+ ENV.delete(name)
154
+ end
155
+ end
96
156
  end
97
157
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Edgeway
4
- VERSION = "0.1.0"
4
+ VERSION = "0.3.0"
5
5
  end
@@ -0,0 +1,24 @@
1
+ module Edgeway
2
+ module View
3
+ ESCAPES = { "&" => "&amp;", "<" => "&lt;", ">" => "&gt;", '"' => "&quot;", "'" => "&#39;" }
4
+
5
+ class SafeHTML
6
+ def initialize(text)
7
+ @text = text.to_s.dup
8
+ end
9
+
10
+ def to_s = @text
11
+ end
12
+
13
+ def self.escape(obj)
14
+ return "" if obj.nil?
15
+ return obj.to_s if obj.is_a?(SafeHTML)
16
+ s = obj.to_s
17
+ s.gsub(/[&<>"']/, ESCAPES)
18
+ end
19
+ end
20
+ end
21
+
22
+ class String
23
+ def html_safe = Edgeway::View::SafeHTML.new(self)
24
+ end
data/lib/edgeway.rb CHANGED
@@ -1,29 +1,38 @@
1
+ require "digest"
1
2
  require "json"
2
3
  require "time"
4
+ require "uri"
3
5
  require_relative "edgeway/version"
4
6
  require_relative "edgeway/errors"
5
7
  require_relative "edgeway/inflector"
8
+ require_relative "edgeway/view"
6
9
  require_relative "edgeway/config"
7
10
  require_relative "edgeway/logger"
8
11
  require_relative "edgeway/http/response"
9
12
  require_relative "edgeway/http/parameters"
10
13
  require_relative "edgeway/http/json_body"
11
14
  require_relative "edgeway/http/request"
15
+ require_relative "edgeway/http/client"
12
16
  require_relative "edgeway/routing/route"
13
17
  require_relative "edgeway/routing/route_set"
14
18
  require_relative "edgeway/routing/mapper"
15
19
  require_relative "edgeway/db/adapter"
20
+ require_relative "edgeway/model/connection_registry"
16
21
  require_relative "edgeway/model/attributes"
17
22
  require_relative "edgeway/model/validations"
18
23
  require_relative "edgeway/model/macros"
19
24
  require_relative "edgeway/model/relation"
20
25
  require_relative "edgeway/model/persistence"
21
26
  require_relative "edgeway/model/base"
27
+ require_relative "edgeway/cache"
28
+ require_relative "edgeway/rate_limit"
22
29
  require_relative "edgeway/http/auth/jwt"
23
30
  require_relative "edgeway/controller/callbacks"
24
31
  require_relative "edgeway/controller/rescuable"
25
32
  require_relative "edgeway/controller/rendering"
26
33
  require_relative "edgeway/controller/authentication"
34
+ require_relative "edgeway/controller/caching"
35
+ require_relative "edgeway/controller/rate_limiting"
27
36
  require_relative "edgeway/controller/base"
28
37
  require_relative "edgeway/controller/dispatcher"
29
38
  require_relative "edgeway/application"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: edgeway
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuji Yaginuma
@@ -16,21 +16,41 @@ executables:
16
16
  extensions: []
17
17
  extra_rdoc_files: []
18
18
  files:
19
+ - CHANGELOG.md
19
20
  - LICENSE.txt
20
21
  - README.md
21
22
  - exe/edgeway
22
23
  - js/cgi.js
24
+ - js/cloudflare-d1-sessions.js
25
+ - js/cloudflare-kv.js
26
+ - js/cloudflare-ratelimit.js
27
+ - js/cloudflare-test-database.js
28
+ - js/cloudflare-test-runner.js
23
29
  - js/cloudflare.js
24
30
  - js/cors.js
31
+ - js/fetch.js
32
+ - js/headers.js
33
+ - js/jspi.js
25
34
  - js/jwt.js
26
35
  - js/runtime.js
27
36
  - js/wasi-shim.js
28
37
  - lib/edgeway.rb
29
38
  - lib/edgeway/application.rb
39
+ - lib/edgeway/cache.rb
40
+ - lib/edgeway/cache/limits.rb
41
+ - lib/edgeway/cache/memory_store.rb
42
+ - lib/edgeway/cache/null_store.rb
43
+ - lib/edgeway/cache/store.rb
30
44
  - lib/edgeway/cli.rb
31
- - lib/edgeway/cli/app_config.rb
32
- - lib/edgeway/cli/app_files.rb
33
45
  - lib/edgeway/cli/build.rb
46
+ - lib/edgeway/cli/build/app_config.rb
47
+ - lib/edgeway/cli/build/app_files.rb
48
+ - lib/edgeway/cli/build/cache_config.rb
49
+ - lib/edgeway/cli/build/database_config.rb
50
+ - lib/edgeway/cli/build/js_files.rb
51
+ - lib/edgeway/cli/build/view_compiler.rb
52
+ - lib/edgeway/cli/cloudflare_test.rb
53
+ - lib/edgeway/cli/cloudflare_test/wasm_test_cli.rb
34
54
  - lib/edgeway/cli/generate.rb
35
55
  - lib/edgeway/cli/new.rb
36
56
  - lib/edgeway/cli/package_manager.rb
@@ -41,59 +61,85 @@ files:
41
61
  - lib/edgeway/config.rb
42
62
  - lib/edgeway/controller/authentication.rb
43
63
  - lib/edgeway/controller/base.rb
64
+ - lib/edgeway/controller/caching.rb
44
65
  - lib/edgeway/controller/callbacks.rb
45
66
  - lib/edgeway/controller/dispatcher.rb
67
+ - lib/edgeway/controller/rate_limiting.rb
46
68
  - lib/edgeway/controller/rendering.rb
47
69
  - lib/edgeway/controller/rescuable.rb
48
70
  - lib/edgeway/db/adapter.rb
49
71
  - lib/edgeway/db/memory.rb
72
+ - lib/edgeway/db/query_stats.rb
50
73
  - lib/edgeway/db/sqlite.rb
51
74
  - lib/edgeway/errors.rb
75
+ - lib/edgeway/generators/app/templates/.github/workflows/ci.yml.tt
52
76
  - lib/edgeway/generators/app/templates/.gitignore
77
+ - lib/edgeway/generators/app/templates/.ruby-version.tt
53
78
  - lib/edgeway/generators/app/templates/Gemfile.tt
54
79
  - lib/edgeway/generators/app/templates/README.md.tt
55
80
  - lib/edgeway/generators/app/templates/app/controllers/application_controller.rb
56
81
  - lib/edgeway/generators/app/templates/app/controllers/health_controller.rb
57
82
  - lib/edgeway/generators/app/templates/app/models/application_model.rb
83
+ - lib/edgeway/generators/app/templates/app/views/layouts/application.html.erb
58
84
  - lib/edgeway/generators/app/templates/bin/build.tt
59
85
  - lib/edgeway/generators/app/templates/bin/deploy.tt
60
86
  - lib/edgeway/generators/app/templates/bin/setup.tt
87
+ - lib/edgeway/generators/app/templates/bin/test.tt
88
+ - lib/edgeway/generators/app/templates/config/cache.yml
61
89
  - lib/edgeway/generators/app/templates/config/database.yml
62
90
  - lib/edgeway/generators/app/templates/config/routes.rb
63
91
  - lib/edgeway/generators/app/templates/db/migrations/.keep
64
92
  - lib/edgeway/generators/app/templates/mise.toml.tt
65
93
  - lib/edgeway/generators/app/templates/package.json.tt
94
+ - lib/edgeway/generators/app/templates/public/.assetsignore
66
95
  - lib/edgeway/generators/app/templates/src/worker.js
67
96
  - lib/edgeway/generators/app/templates/test/controllers/health_test.rb
68
97
  - lib/edgeway/generators/app/templates/test/test_helper.rb
69
98
  - lib/edgeway/generators/app/templates/wrangler.toml.tt
70
99
  - lib/edgeway/http/auth/jwt.rb
71
100
  - lib/edgeway/http/auth/stub.rb
101
+ - lib/edgeway/http/client.rb
72
102
  - lib/edgeway/http/json_body.rb
73
103
  - lib/edgeway/http/parameters.rb
74
104
  - lib/edgeway/http/request.rb
75
105
  - lib/edgeway/http/response.rb
106
+ - lib/edgeway/http/stub_transport.rb
76
107
  - lib/edgeway/inflector.rb
77
108
  - lib/edgeway/logger.rb
78
109
  - lib/edgeway/model/attributes.rb
79
110
  - lib/edgeway/model/base.rb
111
+ - lib/edgeway/model/connection_registry.rb
80
112
  - lib/edgeway/model/macros.rb
81
113
  - lib/edgeway/model/persistence.rb
82
114
  - lib/edgeway/model/relation.rb
83
115
  - lib/edgeway/model/validations.rb
116
+ - lib/edgeway/rate_limit.rb
117
+ - lib/edgeway/rate_limit/limiter.rb
118
+ - lib/edgeway/rate_limit/null_limiter.rb
119
+ - lib/edgeway/rate_limit/stub_limiter.rb
84
120
  - lib/edgeway/routing/mapper.rb
85
121
  - lib/edgeway/routing/route.rb
86
122
  - lib/edgeway/routing/route_set.rb
87
123
  - lib/edgeway/server.rb
88
124
  - lib/edgeway/service/cloudflare/d1.rb
89
125
  - lib/edgeway/service/cloudflare/jwt.rb
126
+ - lib/edgeway/service/cloudflare/kv.rb
127
+ - lib/edgeway/service/cloudflare/kv_store.rb
128
+ - lib/edgeway/service/cloudflare/rate_limit.rb
129
+ - lib/edgeway/service/cloudflare/rate_limiter.rb
130
+ - lib/edgeway/service/cloudflare/test_databases.rb
131
+ - lib/edgeway/service/fetch.rb
132
+ - lib/edgeway/service/import_result.rb
90
133
  - lib/edgeway/test.rb
134
+ - lib/edgeway/test/sqlite_databases.rb
91
135
  - lib/edgeway/version.rb
136
+ - lib/edgeway/view.rb
92
137
  homepage: https://github.com/y-yagi/edgeway
93
138
  licenses:
94
139
  - MIT
95
140
  metadata:
96
141
  source_code_uri: https://github.com/y-yagi/edgeway
142
+ changelog_uri: https://github.com/y-yagi/edgeway/blob/main/CHANGELOG.md
97
143
  rubygems_mfa_required: 'true'
98
144
  rdoc_options: []
99
145
  require_paths:
@@ -109,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
155
  - !ruby/object:Gem::Version
110
156
  version: '0'
111
157
  requirements: []
112
- rubygems_version: 4.0.17
158
+ rubygems_version: 4.0.16
113
159
  specification_version: 4
114
160
  summary: A library for Ruby compiled by Spinel to wasm on edge workers.
115
161
  test_files: []
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Edgeway
4
- module CLI
5
- class AppConfig
6
- # adapter: => the file build/main.rb requires for it.
7
- ADAPTERS = {
8
- "d1" => "edgeway/service/cloudflare/d1",
9
- "memory" => "edgeway/db/memory"
10
- }.freeze
11
-
12
- attr_reader :env, :adapter, :binding_name
13
-
14
- def self.load(root, env)
15
- path = File.join(root, "config", "database.yml")
16
- raise Error, "no config/database.yml in #{root} (is this an Edgeway app?)" unless File.exist?(path)
17
-
18
- section = (YAML.safe_load_file(path) || {})[env]
19
- raise Error, "config/database.yml has no #{env} section" unless section.is_a?(Hash)
20
-
21
- new(env, section["adapter"].to_s, (section["binding"] || "DB").to_s)
22
- end
23
-
24
- def initialize(env, adapter, binding_name)
25
- raise Error, "unknown database adapter #{adapter.inspect} (one of #{ADAPTERS.keys.join(", ")})" unless ADAPTERS.key?(adapter)
26
-
27
- @env = env
28
- @adapter = adapter
29
- @binding_name = binding_name
30
- end
31
-
32
- def adapter_file = ADAPTERS.fetch(@adapter)
33
- end
34
- end
35
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Edgeway
4
- module CLI
5
- class AppFiles
6
- def initialize(root)
7
- @root = root
8
- end
9
-
10
- def require_lines
11
- lines = []
12
- app = File.join(@root, "app")
13
- dirs = Dir.exist?(app) ? Dir.children(app).sort.select { |d| File.directory?(File.join(app, d)) } : []
14
- dirs.each do |d|
15
- next if %w[models controllers].include?(d)
16
-
17
- lines.concat(requires("app/#{d}"))
18
- end
19
- lines.concat(requires("app/models"))
20
- lines.concat(requires("app/controllers"))
21
- lines << 'require_relative "../config/routes"'
22
- lines
23
- end
24
-
25
- # require_relative lines for the .rb files under dir, application_*.rb first.
26
- def requires(dir)
27
- full = File.join(@root, dir)
28
- return [] unless Dir.exist?(full)
29
-
30
- files = Dir.glob("**/*.rb", base: full).map { |f| File.join(dir, f) }
31
- first, rest = files.partition { |f| File.basename(f).start_with?("application_") }
32
- # String#dump quotes a path with spaces, quotes or "#{" safely.
33
- (first.sort + rest.sort).map { |f| "require_relative #{"../#{f.delete_suffix(".rb")}".dump}" }
34
- end
35
- end
36
- end
37
- end