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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +55 -0
- data/README.md +784 -125
- data/js/cloudflare-d1-sessions.js +68 -0
- data/js/cloudflare-kv.js +47 -0
- data/js/cloudflare-ratelimit.js +31 -0
- data/js/cloudflare-test-database.js +112 -0
- data/js/cloudflare-test-runner.js +76 -0
- data/js/cloudflare.js +144 -22
- data/js/cors.js +15 -16
- data/js/fetch.js +113 -0
- data/js/headers.js +16 -0
- data/js/jspi.js +32 -0
- data/js/jwt.js +6 -40
- data/js/runtime.js +42 -5
- data/lib/edgeway/application.rb +21 -9
- data/lib/edgeway/cache/limits.rb +8 -0
- data/lib/edgeway/cache/memory_store.rb +24 -0
- data/lib/edgeway/cache/null_store.rb +13 -0
- data/lib/edgeway/cache/store.rb +189 -0
- data/lib/edgeway/cache.rb +13 -0
- data/lib/edgeway/cli/build/app_config.rb +39 -0
- data/lib/edgeway/cli/build/app_files.rb +40 -0
- data/lib/edgeway/cli/build/cache_config.rb +108 -0
- data/lib/edgeway/cli/build/database_config.rb +96 -0
- data/lib/edgeway/cli/build/js_files.rb +30 -0
- data/lib/edgeway/cli/build/view_compiler.rb +191 -0
- data/lib/edgeway/cli/build.rb +50 -18
- data/lib/edgeway/cli/cloudflare_test/wasm_test_cli.rb +35 -0
- data/lib/edgeway/cli/cloudflare_test.rb +120 -0
- data/lib/edgeway/cli/generate.rb +174 -26
- data/lib/edgeway/cli/new.rb +1 -1
- data/lib/edgeway/cli/test.rb +28 -9
- data/lib/edgeway/cli/toolchain.rb +5 -0
- data/lib/edgeway/cli.rb +7 -4
- data/lib/edgeway/controller/base.rb +32 -3
- data/lib/edgeway/controller/caching.rb +140 -0
- data/lib/edgeway/controller/callbacks.rb +5 -1
- data/lib/edgeway/controller/dispatcher.rb +11 -1
- data/lib/edgeway/controller/rate_limiting.rb +145 -0
- data/lib/edgeway/controller/rendering.rb +24 -4
- data/lib/edgeway/db/adapter.rb +38 -0
- data/lib/edgeway/db/memory.rb +9 -2
- data/lib/edgeway/db/query_stats.rb +42 -0
- data/lib/edgeway/db/sqlite.rb +73 -9
- data/lib/edgeway/errors.rb +43 -0
- data/lib/edgeway/generators/app/templates/.github/workflows/ci.yml.tt +38 -0
- data/lib/edgeway/generators/app/templates/.ruby-version.tt +1 -0
- data/lib/edgeway/generators/app/templates/README.md.tt +8 -2
- data/lib/edgeway/generators/app/templates/app/views/layouts/application.html.erb +11 -0
- data/lib/edgeway/generators/app/templates/bin/build.tt +1 -1
- data/lib/edgeway/generators/app/templates/bin/deploy.tt +1 -1
- data/lib/edgeway/generators/app/templates/bin/setup.tt +2 -3
- data/lib/edgeway/generators/app/templates/bin/test.tt +7 -0
- data/lib/edgeway/generators/app/templates/config/cache.yml +22 -0
- data/lib/edgeway/generators/app/templates/config/database.yml +25 -2
- data/lib/edgeway/generators/app/templates/mise.toml.tt +1 -1
- data/lib/edgeway/generators/app/templates/public/.assetsignore +1 -0
- data/lib/edgeway/generators/app/templates/wrangler.toml.tt +39 -0
- data/lib/edgeway/http/auth/stub.rb +1 -3
- data/lib/edgeway/http/client.rb +80 -0
- data/lib/edgeway/http/request.rb +7 -22
- data/lib/edgeway/http/stub_transport.rb +38 -0
- data/lib/edgeway/inflector.rb +19 -0
- data/lib/edgeway/logger.rb +33 -5
- data/lib/edgeway/model/attributes.rb +93 -10
- data/lib/edgeway/model/base.rb +50 -5
- data/lib/edgeway/model/connection_registry.rb +25 -0
- data/lib/edgeway/model/macros.rb +5 -1
- data/lib/edgeway/model/persistence.rb +18 -11
- data/lib/edgeway/model/relation.rb +106 -56
- data/lib/edgeway/model/validations.rb +29 -23
- data/lib/edgeway/rate_limit/limiter.rb +9 -0
- data/lib/edgeway/rate_limit/null_limiter.rb +9 -0
- data/lib/edgeway/rate_limit/stub_limiter.rb +24 -0
- data/lib/edgeway/rate_limit.rb +2 -0
- data/lib/edgeway/routing/route.rb +1 -6
- data/lib/edgeway/server.rb +13 -0
- data/lib/edgeway/service/cloudflare/d1.rb +44 -30
- data/lib/edgeway/service/cloudflare/jwt.rb +3 -15
- data/lib/edgeway/service/cloudflare/kv.rb +45 -0
- data/lib/edgeway/service/cloudflare/kv_store.rb +58 -0
- data/lib/edgeway/service/cloudflare/rate_limit.rb +27 -0
- data/lib/edgeway/service/cloudflare/rate_limiter.rb +33 -0
- data/lib/edgeway/service/cloudflare/test_databases.rb +65 -0
- data/lib/edgeway/service/fetch.rb +26 -0
- data/lib/edgeway/service/import_result.rb +24 -0
- data/lib/edgeway/test/sqlite_databases.rb +18 -0
- data/lib/edgeway/test.rb +86 -26
- data/lib/edgeway/version.rb +1 -1
- data/lib/edgeway/view.rb +24 -0
- data/lib/edgeway.rb +9 -0
- metadata +50 -4
- data/lib/edgeway/cli/app_config.rb +0 -35
- 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
|
|
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/
|
|
13
|
-
require "edgeway/
|
|
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
|
|
29
|
-
#
|
|
30
|
-
# so a test can check what was
|
|
31
|
-
# db.log for the SQL.
|
|
32
|
-
#
|
|
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
|
-
@
|
|
38
|
-
@
|
|
39
|
-
Edgeway::
|
|
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
|
-
@
|
|
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
|
-
|
|
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
|
data/lib/edgeway/version.rb
CHANGED
data/lib/edgeway/view.rb
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Edgeway
|
|
2
|
+
module View
|
|
3
|
+
ESCAPES = { "&" => "&", "<" => "<", ">" => ">", '"' => """, "'" => "'" }
|
|
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.
|
|
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.
|
|
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
|