kis_http 0.1.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,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 90cf8804c9b8fab2d42e58567bc05f304344fac286b6874240a20e3e832b8852
4
+ data.tar.gz: a0eb1a0095d20ba88ffbffc95accc6a08e95e6081811dccb87002b8ae1cb1f80
5
+ SHA512:
6
+ metadata.gz: 9f72fcfc774f7167b69d1affa960f9cee2bfa75f63efe2e6da743f92348f6a96b8474f9f05b537e7107f924bd95328468c9fe26c4f7b37d1e543a0e287bdc10c
7
+ data.tar.gz: 29f28c1523dc105a1360dd80daee941f61fd9de9b9fb890460c488b22b2a188e31a680a76b57e55c02b33137718f5e9742942db5c20eab00edcdf50ac3b54f05
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kis_http/version'
4
+ require 'net/http'
5
+
6
+ # All the HTTP things
7
+ module KisHttp
8
+ class Error < StandardError; end
9
+
10
+ class << self
11
+ def get(url, **kwargs)
12
+ request(url, **kwargs) do |uri|
13
+ Net::HTTP::Get.new(uri)
14
+ end
15
+ end
16
+
17
+ def post(url, **kwargs)
18
+ request(url, **kwargs) do |uri|
19
+ Net::HTTP::Post.new(uri)
20
+ end
21
+ end
22
+
23
+ def put(url, **kwargs)
24
+ request(url, **kwargs) do |uri|
25
+ Net::HTTP::Put.new(uri)
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def request(url, body: nil, headers: nil, options: nil)
32
+ options = Rest.Options(options) if options
33
+
34
+ uri = URI("#{url}#{options}")
35
+
36
+ request = yield uri.request_uri
37
+
38
+ Rest.Headers(headers).assign_each_to(request) if headers
39
+
40
+ request.body = body ? JSON.generate(body) : ''
41
+
42
+ http = Net::HTTP.new(uri.host, uri.port)
43
+ http.use_ssl = (uri.scheme == 'https')
44
+
45
+ http.request(request)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+
5
+ # TLD
6
+ module KisHttp
7
+ # A header builder class for outgoing requests
8
+ class Headers
9
+ extend Forwardable
10
+ # @!macro [attach] def_delegators
11
+ # @!method each_pair
12
+ # Forwards to $1.
13
+ # @see Hash#each_pair
14
+ # @!method fetch
15
+ # Forwards to $1.
16
+ # @see Hash#fetch
17
+ def_delegators :@heads, :each_pair, :fetch
18
+
19
+ def initialize(args = {})
20
+ build(args)
21
+ end
22
+
23
+ # Add or update the request headers
24
+ #
25
+ # @return [Headers] self
26
+ def build(args = {})
27
+ @heads ||= {}
28
+
29
+ args.to_h.each do |(key, value)|
30
+ @heads[key] = value
31
+ end
32
+
33
+ self
34
+ end
35
+
36
+ # Assign each header to object via :[]
37
+ def assign_each_to(obj)
38
+ each_pair do |header, value|
39
+ obj[header] = value
40
+ end
41
+
42
+ obj
43
+ end
44
+
45
+ # Remove key/value from headers via key
46
+ #
47
+ # @param key [Symbol, String] key to look up
48
+ # @return [String, Symbol, nil] returns value if key found, `nil` otherwise.
49
+ def remove(key)
50
+ @heads.delete(key)
51
+ end
52
+
53
+ # Add the values of one `Headers` into another
54
+ #
55
+ # @param other [Headers] instance of `Headers`
56
+ # @return [Headers]
57
+ def +(other)
58
+ raise TypeError, "Headers type expected, #{other.class} given" \
59
+ unless other.is_a? Headers
60
+
61
+ @heads.merge(other.instance_variable_get(:@heads))
62
+
63
+ self
64
+ end
65
+
66
+ # @return [Hash] hash of the `Headers`
67
+ def to_h
68
+ @heads
69
+ end
70
+ end
71
+
72
+ def self.Headers(obj)
73
+ if obj.is_a? Rest::Headers
74
+ obj
75
+ elsif obj.is_a? Hash
76
+ Rest::Headers.new(**obj)
77
+ elsif obj.is_a? Array
78
+ Rest::Headers.new(**obj.to_h)
79
+ else
80
+ raise 'Invalid object type for Headers!'
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ # TLD
4
+ module KisHttp
5
+ # A url options builder class for outgoing requests.
6
+ class Options
7
+ def initialize(args = {})
8
+ build(args)
9
+ end
10
+
11
+ # url safe rendering of options for the url
12
+ #
13
+ # @return [String] url options
14
+ def opts
15
+ if @opts.empty?
16
+ ''
17
+ else
18
+ "?#{@opts.join('&')}"
19
+ end
20
+ end
21
+
22
+ # Add or update url options
23
+ #
24
+ # @return [Options] self
25
+ def build(args = {})
26
+ @opts ||= []
27
+
28
+ args.to_h.each do |(key, value)|
29
+ remove(key)
30
+ @opts.push("#{key}=#{value}")
31
+ end
32
+
33
+ self
34
+ end
35
+
36
+ # Fetch the `key=value`
37
+ #
38
+ # @param [Symbol, String] key of the key/value pair to fetch
39
+ # @return [String]
40
+ def fetch(key)
41
+ @opts.each do |item|
42
+ return item if key.to_s == split.call(item).first
43
+ end
44
+
45
+ raise KeyError, "key not found #{key}" unless block_given?
46
+
47
+ yield
48
+ end
49
+
50
+ # Fetch and remove `key=value`. Modifies `Options`.
51
+ #
52
+ # @param [Symbol, String] key of the key/value pair to fetch
53
+ # @return [String]
54
+ def fetch!(key, &block)
55
+ result = fetch(key, &block)
56
+ remove(key)
57
+ result
58
+ end
59
+
60
+ # Execute a block of code and restore original `Options` state afterwards
61
+ # @yield [Options]
62
+ def immutable
63
+ old = @opts
64
+ result = yield self
65
+ @opts = old
66
+ result
67
+ end
68
+
69
+ # Remove key/value from options via key
70
+ #
71
+ # @param key [Symbol, String] key to look up
72
+ # @return [String, nil] returns a `String` if key found, `nil` otherwise.
73
+ def remove(key)
74
+ return_value = nil
75
+
76
+ @opts = @opts.delete_if do |item|
77
+ head, tail = split.call item
78
+
79
+ return_value = tail if head == key.to_s
80
+ end
81
+
82
+ return_value
83
+ end
84
+
85
+ # this purges all options
86
+ #
87
+ # @return [Options] self
88
+ def reset!
89
+ @opts = []
90
+
91
+ self
92
+ end
93
+
94
+ # Add the values of one `Options` into another
95
+ #
96
+ # @param other [Options] instance of `Options`
97
+ # @return [Options]
98
+ def +(other)
99
+ unless other.is_a? Options
100
+ raise TypeError, "Options type expected, #{other.class} given"
101
+ end
102
+
103
+ update other.instance_variable_get(:@opts)
104
+
105
+ self
106
+ end
107
+
108
+ # (see #opts)
109
+ def to_s
110
+ opts
111
+ end
112
+
113
+ # @return [Hash] hash of the `Options`
114
+ def to_h
115
+ @opts.map(&split).to_h
116
+ end
117
+
118
+ private # @private
119
+
120
+ def split
121
+ ->(entry) { entry.split('=') }
122
+ end
123
+
124
+ def parse(other)
125
+ return other.split('&').map(&split).to_h if other.is_a? String
126
+
127
+ other.map(&split).to_h
128
+ end
129
+
130
+ def update(other)
131
+ return self unless other
132
+
133
+ build(parse(other))
134
+ end
135
+ end
136
+
137
+ def self.Options(obj)
138
+ if obj.is_a? Rest::Options
139
+ obj
140
+ elsif obj.is_a? Hash
141
+ Rest::Options.new(**obj)
142
+ elsif obj.is_a? Array
143
+ Rest::Options.new(**obj.to_h)
144
+ else
145
+ raise 'Invalid object type for Options!'
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,3 @@
1
+ module KisHttp
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,47 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kis_http
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Daniel P. Clark
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-12-15 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: DRY for Net::HTTP
14
+ email:
15
+ - 6ftdan@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/kis_http.rb
21
+ - lib/kis_http/headers.rb
22
+ - lib/kis_http/options.rb
23
+ - lib/kis_http/version.rb
24
+ homepage: https://github.com/danielpclark/kist_http
25
+ licenses:
26
+ - MIT
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 2.3.0
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubygems_version: 3.1.4
44
+ signing_key:
45
+ specification_version: 4
46
+ summary: Keep it Simple for Net::HTTP
47
+ test_files: []