paltrow 0.0.1 → 0.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 91e1e729ab1f4f6160a6d5b0a05184a37c3ffdf71921b8ff05c5b6afba4bb998
4
- data.tar.gz: 75a1cbf23c47f7488be4f7fe2d77f0203418bfa97ef5c42f9c2700fe29a43bc7
3
+ metadata.gz: f25368bc04b529eb7aaf13ad7484685a01c7a30097bfef3ad2bbc667cef685fc
4
+ data.tar.gz: 7f144dd79142b54e3e388e97ebf776beac65a187e0ba8c42ba44ca349a7a35df
5
5
  SHA512:
6
- metadata.gz: 50b26eec705cec8605f34f6ec0b91c470bd357b69c12fe9f75b7a770c8462871b2413bc2ce9d8461b13918b151786b4ff527e36edb767836068b50ab2ddfd454
7
- data.tar.gz: 9ec7884a27eb091b673f9050ac261bf3a631a8fe3718a3578596bcd8d430dba9defb32db7f0c57d610cf71929c2e838daf2d1795f2ac15cef96e20468898a852
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.1)
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
@@ -0,0 +1,8 @@
1
+ module Paltrow
2
+ module Navigating
3
+ class Stub
4
+ def call handler:, page:
5
+ end
6
+ end
7
+ end
8
+ end
data/lib/paltrow/page.rb CHANGED
@@ -1,31 +1,46 @@
1
1
  module Paltrow
2
2
  class Page < Dry::Struct
3
- attribute :controller, Dry.Types::String
4
- attribute :action, Dry.Types::String.enum("new", "edit", "show", "index")
5
- attribute :query?, Dry.Types::Hash.optional.default({}.freeze)
6
- attribute :resource_ids?, Dry.Types::Hash.optional.default({}.freeze)
7
- attribute :message?, Message.default { Message.new }
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
- {controller: controller, action: action}
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.notice
27
+ success? ? message : ""
17
28
  end
18
29
 
19
30
  def alert
20
- message.alert
31
+ failure? ? message : ""
21
32
  end
22
33
 
23
34
  def with_notice a_notice
24
- new(message: Message.notice(a_notice))
35
+ new(message: a_notice, success: true)
25
36
  end
26
37
 
27
38
  def with_alert an_alert
28
- new(message: Message.alert(an_alert))
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
@@ -0,0 +1,8 @@
1
+ module Paltrow
2
+ module Rendering
3
+ class Stub
4
+ def call handler:, page:
5
+ end
6
+ end
7
+ end
8
+ end
@@ -1,3 +1,3 @@
1
1
  module Paltrow
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
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.add_runtime_dependency "dry-struct", "~> 1.4"
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.1
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-04-27 00:00:00.000000000 Z
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