mk_framework 0.2.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 +7 -0
- data/CHANGELOG.md +33 -0
- data/LICENSE +21 -0
- data/README.md +225 -0
- data/docs/deployment.md +115 -0
- data/docs/routing.md +160 -0
- data/docs/upgrading.md +124 -0
- data/lib/mk_framework/application.rb +147 -0
- data/lib/mk_framework/controller.rb +39 -0
- data/lib/mk_framework/errors.rb +88 -0
- data/lib/mk_framework/request.rb +102 -0
- data/lib/mk_framework/router.rb +165 -0
- data/lib/mk_framework/sequel.rb +56 -0
- data/lib/mk_framework/testing.rb +36 -0
- data/lib/mk_framework/version.rb +5 -0
- data/lib/mk_framework.rb +13 -0
- metadata +137 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'sequel'
|
|
4
|
+
require_relative '../mk_framework'
|
|
5
|
+
|
|
6
|
+
module MK
|
|
7
|
+
# Shared by automatic resource actions and explicit application transactions.
|
|
8
|
+
module Persistence
|
|
9
|
+
def persist(record)
|
|
10
|
+
record.save || raise(ValidationError.new(details: record.errors))
|
|
11
|
+
rescue Sequel::ValidationFailed => error
|
|
12
|
+
raise ValidationError.new(details: error.model.errors)
|
|
13
|
+
rescue Sequel::UniqueConstraintViolation, Sequel::ForeignKeyConstraintViolation, Sequel::HookFailed
|
|
14
|
+
raise Conflict
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def destroy(record)
|
|
18
|
+
record.destroy || raise(Conflict, 'Resource could not be deleted')
|
|
19
|
+
rescue Sequel::HookFailed, Sequel::ForeignKeyConstraintViolation
|
|
20
|
+
raise Conflict, 'Resource could not be deleted'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def paginate(dataset, request, order: :id)
|
|
24
|
+
page = request.page
|
|
25
|
+
dataset.order(order).limit(page[:limit], page[:offset]).all
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class Application
|
|
30
|
+
include Persistence
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def prepare_result(value, action:)
|
|
35
|
+
if value.is_a?(Sequel::Model)
|
|
36
|
+
case action
|
|
37
|
+
when :create, :update then persist(value)
|
|
38
|
+
when :delete then destroy(value)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
raw_result(value)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Materialize all data before the handler. Associations must be selected by
|
|
45
|
+
# the controller; inspecting a record's values never lazy-loads them.
|
|
46
|
+
def raw_result(value)
|
|
47
|
+
case value
|
|
48
|
+
when Sequel::Model then raw_result(value.values)
|
|
49
|
+
when Sequel::Dataset then raw_result(value.all)
|
|
50
|
+
when Array then value.map { |item| raw_result(item) }
|
|
51
|
+
when Hash then value.transform_values { |item| raw_result(item) }
|
|
52
|
+
else value
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'rack/test'
|
|
5
|
+
|
|
6
|
+
module MK
|
|
7
|
+
module Framework
|
|
8
|
+
module Spec
|
|
9
|
+
class StrictHash < Hash
|
|
10
|
+
def [](key) = fetch(key)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
include Rack::Test::Methods
|
|
14
|
+
|
|
15
|
+
# Parsing on demand keeps this correct for every Rack::Test request method,
|
|
16
|
+
# including custom_request and follow_redirect!, with no monkey patches.
|
|
17
|
+
def resp
|
|
18
|
+
body = last_response.body
|
|
19
|
+
body.empty? ? StrictHash.new : symbolize(JSON.parse(body))
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def symbolize(value)
|
|
25
|
+
case value
|
|
26
|
+
when Hash
|
|
27
|
+
value.each_with_object(StrictHash.new) { |(key, item), result| result[key.to_sym] = symbolize(item) }
|
|
28
|
+
when Array
|
|
29
|
+
value.map { |item| symbolize(item) }
|
|
30
|
+
else
|
|
31
|
+
value
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
data/lib/mk_framework.rb
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'roda'
|
|
4
|
+
require 'json'
|
|
5
|
+
require 'logger'
|
|
6
|
+
require 'stringio'
|
|
7
|
+
require 'securerandom'
|
|
8
|
+
require_relative 'mk_framework/version'
|
|
9
|
+
require_relative 'mk_framework/errors'
|
|
10
|
+
require_relative 'mk_framework/request'
|
|
11
|
+
require_relative 'mk_framework/controller'
|
|
12
|
+
require_relative 'mk_framework/router'
|
|
13
|
+
require_relative 'mk_framework/application'
|
metadata
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: mk_framework
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.2.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Francesco Canessa
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: roda
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '3.92'
|
|
19
|
+
- - "<"
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '4'
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
requirements:
|
|
26
|
+
- - ">="
|
|
27
|
+
- !ruby/object:Gem::Version
|
|
28
|
+
version: '3.92'
|
|
29
|
+
- - "<"
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
version: '4'
|
|
32
|
+
- !ruby/object:Gem::Dependency
|
|
33
|
+
name: rack
|
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
|
35
|
+
requirements:
|
|
36
|
+
- - ">="
|
|
37
|
+
- !ruby/object:Gem::Version
|
|
38
|
+
version: 3.2.7
|
|
39
|
+
- - "<"
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: '4'
|
|
42
|
+
type: :runtime
|
|
43
|
+
prerelease: false
|
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
45
|
+
requirements:
|
|
46
|
+
- - ">="
|
|
47
|
+
- !ruby/object:Gem::Version
|
|
48
|
+
version: 3.2.7
|
|
49
|
+
- - "<"
|
|
50
|
+
- !ruby/object:Gem::Version
|
|
51
|
+
version: '4'
|
|
52
|
+
- !ruby/object:Gem::Dependency
|
|
53
|
+
name: json
|
|
54
|
+
requirement: !ruby/object:Gem::Requirement
|
|
55
|
+
requirements:
|
|
56
|
+
- - ">="
|
|
57
|
+
- !ruby/object:Gem::Version
|
|
58
|
+
version: '2.12'
|
|
59
|
+
- - "<"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '3'
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '2.12'
|
|
69
|
+
- - "<"
|
|
70
|
+
- !ruby/object:Gem::Version
|
|
71
|
+
version: '3'
|
|
72
|
+
- !ruby/object:Gem::Dependency
|
|
73
|
+
name: logger
|
|
74
|
+
requirement: !ruby/object:Gem::Requirement
|
|
75
|
+
requirements:
|
|
76
|
+
- - ">="
|
|
77
|
+
- !ruby/object:Gem::Version
|
|
78
|
+
version: '1.6'
|
|
79
|
+
- - "<"
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '2'
|
|
82
|
+
type: :runtime
|
|
83
|
+
prerelease: false
|
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - ">="
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '1.6'
|
|
89
|
+
- - "<"
|
|
90
|
+
- !ruby/object:Gem::Version
|
|
91
|
+
version: '2'
|
|
92
|
+
description: Resource routing, controllers, and response handlers with optional Sequel
|
|
93
|
+
persistence.
|
|
94
|
+
executables: []
|
|
95
|
+
extensions: []
|
|
96
|
+
extra_rdoc_files: []
|
|
97
|
+
files:
|
|
98
|
+
- CHANGELOG.md
|
|
99
|
+
- LICENSE
|
|
100
|
+
- README.md
|
|
101
|
+
- docs/deployment.md
|
|
102
|
+
- docs/routing.md
|
|
103
|
+
- docs/upgrading.md
|
|
104
|
+
- lib/mk_framework.rb
|
|
105
|
+
- lib/mk_framework/application.rb
|
|
106
|
+
- lib/mk_framework/controller.rb
|
|
107
|
+
- lib/mk_framework/errors.rb
|
|
108
|
+
- lib/mk_framework/request.rb
|
|
109
|
+
- lib/mk_framework/router.rb
|
|
110
|
+
- lib/mk_framework/sequel.rb
|
|
111
|
+
- lib/mk_framework/testing.rb
|
|
112
|
+
- lib/mk_framework/version.rb
|
|
113
|
+
homepage: https://github.com/makevoid/mk_framework2
|
|
114
|
+
licenses:
|
|
115
|
+
- MIT
|
|
116
|
+
metadata:
|
|
117
|
+
rubygems_mfa_required: 'true'
|
|
118
|
+
source_code_uri: https://github.com/makevoid/mk_framework2
|
|
119
|
+
changelog_uri: https://github.com/makevoid/mk_framework2/blob/main/CHANGELOG.md
|
|
120
|
+
rdoc_options: []
|
|
121
|
+
require_paths:
|
|
122
|
+
- lib
|
|
123
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
124
|
+
requirements:
|
|
125
|
+
- - ">="
|
|
126
|
+
- !ruby/object:Gem::Version
|
|
127
|
+
version: '3.2'
|
|
128
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
129
|
+
requirements:
|
|
130
|
+
- - ">="
|
|
131
|
+
- !ruby/object:Gem::Version
|
|
132
|
+
version: '0'
|
|
133
|
+
requirements: []
|
|
134
|
+
rubygems_version: 4.0.8
|
|
135
|
+
specification_version: 4
|
|
136
|
+
summary: Small, explicit JSON APIs on Roda
|
|
137
|
+
test_files: []
|