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 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