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.
@@ -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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MK
4
+ VERSION = '0.2.0'
5
+ end
@@ -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: []