paltrow 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +21 -1
- data/lib/paltrow.rb +6 -2
- data/lib/paltrow/navigating/rails/redirect.rb +18 -0
- data/lib/paltrow/navigating/stub.rb +8 -0
- data/lib/paltrow/page.rb +25 -10
- data/lib/paltrow/rendering/rails/json.rb +14 -0
- data/lib/paltrow/rendering/rails/stream.rb +70 -0
- data/lib/paltrow/rendering/rails/template.rb +16 -0
- data/lib/paltrow/rendering/stub.rb +8 -0
- data/lib/paltrow/version.rb +1 -1
- data/paltrow.gemspec +4 -1
- metadata +50 -3
- data/lib/paltrow/view.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f25368bc04b529eb7aaf13ad7484685a01c7a30097bfef3ad2bbc667cef685fc
|
4
|
+
data.tar.gz: 7f144dd79142b54e3e388e97ebf776beac65a187e0ba8c42ba44ca349a7a35df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f0956fe55b13297e4973fed1422cfeadc8ad4f5898abe832a77ba4a230ec731a1ce1deaf8bfccfa4c1b746e23f30324234e29e1298c426bc291c5af497985f6
|
7
|
+
data.tar.gz: 4610a22b4798033dd394b3a35e90fc0bc5802a7d13678a4bb781be3b66dccc6af0a924bde36976624699a23d5a1b82e082fa49897961182701650f6bea6a3e10
|
data/Gemfile.lock
CHANGED
@@ -1,12 +1,20 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
paltrow (0.0.
|
4
|
+
paltrow (0.0.2)
|
5
|
+
activesupport (~> 6.1.3)
|
6
|
+
dry-monads (~> 1.3)
|
5
7
|
dry-struct (~> 1.4)
|
6
8
|
|
7
9
|
GEM
|
8
10
|
remote: https://rubygems.org/
|
9
11
|
specs:
|
12
|
+
activesupport (6.1.3.2)
|
13
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
14
|
+
i18n (>= 1.6, < 2)
|
15
|
+
minitest (>= 5.1)
|
16
|
+
tzinfo (~> 2.0)
|
17
|
+
zeitwerk (~> 2.3)
|
10
18
|
ast (2.4.2)
|
11
19
|
concurrent-ruby (1.1.8)
|
12
20
|
diff-lcs (1.4.4)
|
@@ -18,10 +26,15 @@ GEM
|
|
18
26
|
dry-configurable (~> 0.1, >= 0.1.3)
|
19
27
|
dry-core (0.5.0)
|
20
28
|
concurrent-ruby (~> 1.0)
|
29
|
+
dry-equalizer (0.3.0)
|
21
30
|
dry-inflector (0.2.0)
|
22
31
|
dry-logic (1.2.0)
|
23
32
|
concurrent-ruby (~> 1.0)
|
24
33
|
dry-core (~> 0.5, >= 0.5)
|
34
|
+
dry-monads (1.3.5)
|
35
|
+
concurrent-ruby (~> 1.0)
|
36
|
+
dry-core (~> 0.4, >= 0.4.4)
|
37
|
+
dry-equalizer
|
25
38
|
dry-struct (1.4.0)
|
26
39
|
dry-core (~> 0.5, >= 0.5)
|
27
40
|
dry-types (~> 1.5)
|
@@ -32,6 +45,8 @@ GEM
|
|
32
45
|
dry-core (~> 0.5, >= 0.5)
|
33
46
|
dry-inflector (~> 0.1, >= 0.1.2)
|
34
47
|
dry-logic (~> 1.0, >= 1.0.2)
|
48
|
+
i18n (1.8.10)
|
49
|
+
concurrent-ruby (~> 1.0)
|
35
50
|
ice_nine (0.11.2)
|
36
51
|
minitest (5.14.4)
|
37
52
|
parallel (1.20.1)
|
@@ -63,7 +78,11 @@ GEM
|
|
63
78
|
standard (1.0.5)
|
64
79
|
rubocop (= 1.12.1)
|
65
80
|
rubocop-performance (= 1.10.1)
|
81
|
+
timecop (0.9.4)
|
82
|
+
tzinfo (2.0.4)
|
83
|
+
concurrent-ruby (~> 1.0)
|
66
84
|
unicode-display_width (2.0.0)
|
85
|
+
zeitwerk (2.4.2)
|
67
86
|
|
68
87
|
PLATFORMS
|
69
88
|
ruby
|
@@ -74,6 +93,7 @@ DEPENDENCIES
|
|
74
93
|
rake (~> 12.0)
|
75
94
|
rspec-mocks (= 3.10)
|
76
95
|
standard (~> 1.0)
|
96
|
+
timecop (= 0.9.4)
|
77
97
|
|
78
98
|
BUNDLED WITH
|
79
99
|
2.1.4
|
data/lib/paltrow.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
require "dry-struct"
|
2
|
+
require "dry-monads"
|
3
|
+
require "dry/monads/result"
|
2
4
|
require "paltrow/version"
|
3
|
-
require "paltrow/message"
|
4
|
-
require "paltrow/view"
|
5
5
|
require "paltrow/page"
|
6
|
+
require "paltrow/rendering/rails/json"
|
7
|
+
require "paltrow/rendering/rails/template"
|
8
|
+
require "paltrow/rendering/rails/stream"
|
9
|
+
require "paltrow/navigating/rails/redirect"
|
6
10
|
|
7
11
|
module Paltrow
|
8
12
|
class Error < StandardError; end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Paltrow
|
2
|
+
module Navigating
|
3
|
+
module Rails
|
4
|
+
class Redirect
|
5
|
+
def call handler:, page:
|
6
|
+
handler.flash[:notice] = page.notice unless page.notice.empty?
|
7
|
+
handler.flash[:alert] = page.alert unless page.alert.empty?
|
8
|
+
|
9
|
+
page
|
10
|
+
.to_params
|
11
|
+
.merge(_recall: {})
|
12
|
+
.transform_keys { |key| key.to_s.gsub("resource", "controller").to_sym }
|
13
|
+
.then { |params| handler.redirect_to(params) }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/paltrow/page.rb
CHANGED
@@ -1,31 +1,46 @@
|
|
1
1
|
module Paltrow
|
2
2
|
class Page < Dry::Struct
|
3
|
-
attribute :
|
4
|
-
attribute :action, Dry.Types::String.enum("new", "edit", "show", "index")
|
5
|
-
attribute :
|
6
|
-
attribute :
|
7
|
-
|
3
|
+
attribute :resource, Dry.Types::Strict::String
|
4
|
+
attribute :action, Dry.Types::Strict::String.enum("new", "edit", "show", "index")
|
5
|
+
attribute :message, Dry.Types::Strict::String.default("".freeze)
|
6
|
+
attribute :success, Dry.Types::Bool.default(true)
|
7
|
+
|
8
|
+
attribute :locals, Dry.Types::Strict::Hash.default({}.freeze)
|
9
|
+
attribute :query, Dry.Types::Strict::Hash.default({}.freeze)
|
10
|
+
attribute :resource_ids, Dry.Types::Strict::Hash.default({}.freeze)
|
8
11
|
|
9
12
|
def to_params
|
10
|
-
{
|
13
|
+
{resource: resource, action: action}
|
11
14
|
.merge(query)
|
12
15
|
.merge(resource_ids)
|
13
16
|
end
|
14
17
|
|
18
|
+
def success?
|
19
|
+
success
|
20
|
+
end
|
21
|
+
|
22
|
+
def failure?
|
23
|
+
!success?
|
24
|
+
end
|
25
|
+
|
15
26
|
def notice
|
16
|
-
message
|
27
|
+
success? ? message : ""
|
17
28
|
end
|
18
29
|
|
19
30
|
def alert
|
20
|
-
message
|
31
|
+
failure? ? message : ""
|
21
32
|
end
|
22
33
|
|
23
34
|
def with_notice a_notice
|
24
|
-
new(message:
|
35
|
+
new(message: a_notice, success: true)
|
25
36
|
end
|
26
37
|
|
27
38
|
def with_alert an_alert
|
28
|
-
new(message:
|
39
|
+
new(message: an_alert, success: false)
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_monad
|
43
|
+
success? ? Dry::Monads::Success(self) : Dry::Monads::Failure(self)
|
29
44
|
end
|
30
45
|
end
|
31
46
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Paltrow
|
2
|
+
module Rendering
|
3
|
+
module Rails
|
4
|
+
class JSON
|
5
|
+
def call handler:, page:
|
6
|
+
page
|
7
|
+
.to_monad
|
8
|
+
.fmap { |page| handler.render(json: page.locals) }
|
9
|
+
.or { |page| handler.render(json: {error: page.message}, status: :unprocessable_entity) }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require "active_support/inflector/transliterate"
|
2
|
+
|
3
|
+
module Paltrow
|
4
|
+
module Rendering
|
5
|
+
module Rails
|
6
|
+
class ContentDisposition # :nodoc:
|
7
|
+
def self.format disposition:, filename:
|
8
|
+
new(disposition: disposition, filename: filename).to_s
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :disposition, :filename
|
12
|
+
|
13
|
+
def initialize disposition:, filename:
|
14
|
+
@disposition = disposition
|
15
|
+
@filename = filename
|
16
|
+
end
|
17
|
+
|
18
|
+
TRADITIONAL_ESCAPED_CHAR = /[^ A-Za-z0-9!\#$+.^_`|~-]/
|
19
|
+
|
20
|
+
def ascii_filename
|
21
|
+
'filename="' + percent_escape(I18n.transliterate(filename), TRADITIONAL_ESCAPED_CHAR) + '"'
|
22
|
+
end
|
23
|
+
|
24
|
+
RFC_5987_ESCAPED_CHAR = /[^A-Za-z0-9!\#$&+.^_`|~-]/
|
25
|
+
|
26
|
+
def utf8_filename
|
27
|
+
"filename*=UTF-8''" + percent_escape(filename, RFC_5987_ESCAPED_CHAR)
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_s
|
31
|
+
if filename
|
32
|
+
"#{disposition}; #{ascii_filename}; #{utf8_filename}"
|
33
|
+
else
|
34
|
+
disposition.to_s
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def percent_escape string, pattern
|
41
|
+
string.gsub(pattern) do |char|
|
42
|
+
char.bytes.map { |byte| "%%%02X" % byte }.join
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class Stream
|
48
|
+
def call handler:, page:
|
49
|
+
handler.response.headers["Content-Disposition"] = ContentDisposition.format(
|
50
|
+
disposition: "attachment",
|
51
|
+
filename: page.locals.fetch(:filename)
|
52
|
+
)
|
53
|
+
handler.response.delete_header "Content-Length"
|
54
|
+
handler.response.headers["Cache-Control"] = "no-cache"
|
55
|
+
handler.response.headers["Last-Modified"] = Time.now.httpdate.to_s
|
56
|
+
handler.response.headers["X-Accel-Buffering"] = "no"
|
57
|
+
|
58
|
+
begin
|
59
|
+
page
|
60
|
+
.locals
|
61
|
+
.fetch(:content_stream)
|
62
|
+
.each_chunk { |chunk| handler.response.stream.write(chunk.value!) if chunk.success? }
|
63
|
+
ensure
|
64
|
+
handler.response.stream.close
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Paltrow
|
2
|
+
module Rendering
|
3
|
+
module Rails
|
4
|
+
class Template
|
5
|
+
def call handler:, page:
|
6
|
+
handler.flash.now[:notice] = page.notice unless page.notice.empty?
|
7
|
+
handler.flash.now[:alert] = page.alert unless page.alert.empty?
|
8
|
+
handler.render(
|
9
|
+
template: "#{page.resource}/#{page.action}",
|
10
|
+
locals: page.locals
|
11
|
+
)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/paltrow/version.rb
CHANGED
data/paltrow.gemspec
CHANGED
@@ -24,7 +24,10 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
25
25
|
spec.require_paths = ["lib"]
|
26
26
|
|
27
|
-
spec.
|
27
|
+
spec.add_dependency "activesupport", "~> 6.1.3"
|
28
|
+
spec.add_dependency "dry-struct", "~> 1.4"
|
29
|
+
spec.add_dependency "dry-monads", "~> 1.3"
|
28
30
|
spec.add_development_dependency "standard", "~> 1.0"
|
29
31
|
spec.add_development_dependency "rspec-mocks", "= 3.10"
|
32
|
+
spec.add_development_dependency "timecop", "= 0.9.4"
|
30
33
|
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paltrow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Gallagher
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 6.1.3
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 6.1.3
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: dry-struct
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -24,6 +38,20 @@ dependencies:
|
|
24
38
|
- - "~>"
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '1.4'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: dry-monads
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.3'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.3'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: standard
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +80,20 @@ dependencies:
|
|
52
80
|
- - '='
|
53
81
|
- !ruby/object:Gem::Version
|
54
82
|
version: '3.10'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: timecop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.9.4
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.9.4
|
55
97
|
description: Write your web app in plain old Ruby then plug into any web framework
|
56
98
|
email:
|
57
99
|
- john@synapticmishap.co.uk
|
@@ -70,9 +112,14 @@ files:
|
|
70
112
|
- bin/setup
|
71
113
|
- lib/paltrow.rb
|
72
114
|
- lib/paltrow/message.rb
|
115
|
+
- lib/paltrow/navigating/rails/redirect.rb
|
116
|
+
- lib/paltrow/navigating/stub.rb
|
73
117
|
- lib/paltrow/page.rb
|
118
|
+
- lib/paltrow/rendering/rails/json.rb
|
119
|
+
- lib/paltrow/rendering/rails/stream.rb
|
120
|
+
- lib/paltrow/rendering/rails/template.rb
|
121
|
+
- lib/paltrow/rendering/stub.rb
|
74
122
|
- lib/paltrow/version.rb
|
75
|
-
- lib/paltrow/view.rb
|
76
123
|
- paltrow.gemspec
|
77
124
|
homepage: https://github.com/johngallagher/paltrow
|
78
125
|
licenses: []
|
data/lib/paltrow/view.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
module Paltrow
|
2
|
-
class View < Dry::Struct
|
3
|
-
attribute :controller, Dry.Types::String
|
4
|
-
attribute :action, Dry.Types::String.enum("new", "edit", "show", "index")
|
5
|
-
attribute :locals?, Dry.Types::Hash.optional.default({}.freeze)
|
6
|
-
attribute :message?, Message.default { Message.new }
|
7
|
-
|
8
|
-
def notice
|
9
|
-
message.notice
|
10
|
-
end
|
11
|
-
|
12
|
-
def alert
|
13
|
-
message.alert
|
14
|
-
end
|
15
|
-
|
16
|
-
def with_notice a_notice
|
17
|
-
new(message: Message.notice(a_notice))
|
18
|
-
end
|
19
|
-
|
20
|
-
def with_alert an_alert
|
21
|
-
new(message: Message.alert(an_alert))
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|