rack-transform 0.1.0 → 0.1.1

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
  SHA1:
3
- metadata.gz: 159e21b98524f2d792e7d5cc802adb86687fd4bd
4
- data.tar.gz: a98e77d6fe21712cfc4fbb3366386b51a1d72a47
3
+ metadata.gz: 3977529e8deed2f7bea78f754015c3e7a7a85123
4
+ data.tar.gz: 1613ce73e0c4f8a9eb65869ebc4b24eb33ee0f1d
5
5
  SHA512:
6
- metadata.gz: 418a12346b5624c6b3103201dfca8c33dd488a1716205f0630e9fe1762ef84fa3e0f9ec055362a1c43226f7df3811b20edb83a104b121e4420af822227c81d09
7
- data.tar.gz: 33face941575973e25352b5d32dbf1bfed76d992769ef61aaf785f992517d7cce8ee9961db2fc1fae8e43a7653894e9f151575c733059c8872a093d4bbe1e5e9
6
+ metadata.gz: e64821e2cee834db71f45e3b0dede2b8cefbd25680ca9e18bd087f1e13d0c4a0ed5dca032b62dbbd213b7a7fca4d4db8f6b4aa7b599df60353ec83f5fb8f3e00
7
+ data.tar.gz: 6f338b5c299e876d305ca9040ce3cb52816cce6446589a3ad2d402e8866f7c128a92af67fecba1a3ae0d6afe40658865d8c84ba0b5d5c338869501da4075dc55
data/README.md CHANGED
@@ -7,6 +7,9 @@ The need arouse when migrating an API from PHP to Ruby, where the URLs were
7
7
  different and the response body used to have more metadata that was moved to
8
8
  headers.
9
9
 
10
+ [![Build Status](https://travis-ci.org/kitop/rack-transform.svg)](https://travis-ci.org/kitop/rack-transform)
11
+ [![Code Climate](https://codeclimate.com/github/kitop/rack-transform/badges/gpa.svg)](https://codeclimate.com/github/kitop/rack-transform)
12
+
10
13
  ---
11
14
 
12
15
  ## Usage
@@ -51,10 +54,15 @@ Transformer.new do |transformer|
51
54
  end
52
55
  ```
53
56
 
54
- `resquest` and `response` methods should receinve and object that responds to
55
- `call`, it can be a proc # or and object. And they will receive an `env`
56
- object and `status`, `header`, # `body` tuple accordingly. Should return the
57
- same modified as needed.
57
+ `request` and `response` methods should receive an object that responds to
58
+ `call`, it can be a proc or and object. And they will receive an `env` object
59
+ and `status`, `header`, `body` tuple accordingly. Should return the same
60
+ modified as needed. You can use the base transformers if you prefer to use
61
+ actual classes instead of `proc`s.
62
+
63
+ ## Base Transformer
64
+
65
+ To help with boilerplate code, base transformer request and response classes were added. [More info](./lib/rack/transform/transformers/base.rb).
58
66
 
59
67
  ## Contributing
60
68
 
@@ -0,0 +1,98 @@
1
+ module Rack
2
+ class Transform
3
+ module Transformers
4
+ module Base
5
+ class Request
6
+ CONTENT_TYPE = "CONTENT_TYPE".freeze
7
+ CONTENT_LENGTH = "CONTENT_LENGTH".freeze
8
+ POST_BODY = "rack.input".freeze
9
+ JSON_TYPE = "application/json".freeze
10
+
11
+ def self.call(env)
12
+ new(env).process
13
+ end
14
+
15
+ attr_reader :env
16
+
17
+ def initialize(env)
18
+ @env = env
19
+ end
20
+
21
+ def process
22
+ raise NotImplementedError
23
+ end
24
+
25
+ private
26
+
27
+ def req
28
+ @req ||= Rack::Request.new(env)
29
+ end
30
+
31
+ def params
32
+ req.params
33
+ end
34
+
35
+ def update_env(path:, query:, method:, body:)
36
+ body = body.is_a?(String) ? body : dump_json(body)
37
+ env.update(
38
+ Rack::PATH_INFO => path,
39
+ Rack::QUERY_STRING => query,
40
+ Rack::REQUEST_METHOD => method,
41
+ CONTENT_TYPE => JSON_TYPE,
42
+ CONTENT_LENGTH => body.bytesize,
43
+ POST_BODY => StringIO.new(body)
44
+ )
45
+ end
46
+
47
+ def dump_json(data)
48
+ JSON.dump(data)
49
+ end
50
+ end
51
+
52
+ class Response
53
+ CONTENT_LENGTH = "Content-Length".freeze
54
+ CONTENT_TYPE = "Content-Type".freeze
55
+ JSON_TYPE = "application/json".freeze
56
+
57
+ def self.call(status, header, body)
58
+ new(status, header, body).process
59
+ end
60
+
61
+ attr_reader :status, :header, :body
62
+
63
+ def initialize(status, header, body)
64
+ @status = status
65
+ @header = header.merge CONTENT_TYPE => JSON_TYPE
66
+ @body = body
67
+ end
68
+
69
+ def process
70
+ raise NotImplementedError
71
+ end
72
+
73
+ private
74
+
75
+ def respond_with(body, status: 200, header: @header)
76
+ formatted_body = body.is_a?(String) ? body : dump_json(body)
77
+
78
+ header[CONTENT_LENGTH] = formatted_body.bytesize.to_s
79
+
80
+ [status, header, [formatted_body]]
81
+ end
82
+
83
+ def parsed_body
84
+ @parsed_body ||= body.empty? ? [] : load_json(body.first)
85
+ end
86
+
87
+ def dump_json(data)
88
+ JSON.dump(data)
89
+ end
90
+
91
+ def load_json(data)
92
+ JSON.load(data)
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class Transform
3
- VERSION = "0.1.0".freeze
3
+ VERSION = "0.1.1".freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-transform
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esteban Pastorino
@@ -30,6 +30,20 @@ dependencies:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 1.5.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
33
47
  - !ruby/object:Gem::Dependency
34
48
  name: rspec
35
49
  requirement: !ruby/object:Gem::Requirement
@@ -62,6 +76,7 @@ files:
62
76
  - README.md
63
77
  - lib/rack/transform.rb
64
78
  - lib/rack/transform/transformer.rb
79
+ - lib/rack/transform/transformers/base.rb
65
80
  - lib/rack/transform/version.rb
66
81
  - spec/helper.rb
67
82
  - spec/rack/transform/transformer_spec.rb