frenchy 0.5.1 → 0.6.3
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 +5 -5
- data/.travis.yml +5 -1
- data/frenchy.gemspec +1 -1
- data/lib/frenchy.rb +17 -0
- data/lib/frenchy/client.rb +8 -6
- data/lib/frenchy/model.rb +1 -1
- data/lib/frenchy/request.rb +1 -1
- data/lib/frenchy/resource.rb +1 -1
- data/lib/frenchy/version.rb +1 -1
- data/spec/lib/frenchy/model_spec.rb +2 -2
- data/spec/lib/frenchy/request_spec.rb +6 -0
- data/spec/lib/frenchy_spec.rb +13 -1
- metadata +10 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 90c9e971bf0cee2367ca74b3c2f2342da1a5740acf2473d266fa97a574bbcb69
|
4
|
+
data.tar.gz: 8633892fd38e341447124b068f70ca11069ad4e684092694f61d184f87981fc1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c5999ea947402f8f148bbea41536a6103826591aafa00e197e227b9dba11bc98118a3fe30cc0c0ee507b9613a2c51c926eba149f250e7748bfe9ae9e101009f
|
7
|
+
data.tar.gz: c68812567016ed5cd9feb96280cd10bcdb27c32ad279a643742557e204dd3f1936a7cf6a98304484a9a7dbc3eac59de1ced4a04361afab11532991ef1acb83ce
|
data/.travis.yml
CHANGED
data/frenchy.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_dependency "json"
|
22
22
|
|
23
|
-
spec.add_development_dependency "bundler"
|
23
|
+
spec.add_development_dependency "bundler"
|
24
24
|
spec.add_development_dependency "guard-rspec"
|
25
25
|
spec.add_development_dependency "rake"
|
26
26
|
spec.add_development_dependency "rspec"
|
data/lib/frenchy.rb
CHANGED
@@ -14,6 +14,8 @@ require "frenchy/version"
|
|
14
14
|
module Frenchy
|
15
15
|
class_eval do
|
16
16
|
@services = {}
|
17
|
+
@content_types = {}
|
18
|
+
@content_type_accept = ""
|
17
19
|
end
|
18
20
|
|
19
21
|
def self.register_service(name, options={})
|
@@ -23,4 +25,19 @@ module Frenchy
|
|
23
25
|
def self.find_service(name)
|
24
26
|
@services[name.to_s] || raise(Frenchy::Error, "No service '#{name}' registered")
|
25
27
|
end
|
28
|
+
|
29
|
+
def self.register_content_type(name, &block)
|
30
|
+
@content_types[name] = block
|
31
|
+
@content_type_accept = @content_types.keys.join(", ")
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.find_content_type_handler(name)
|
35
|
+
@content_types[name] || raise(Frenchy::Error, "No content type '#{name}' registered")
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.accept_header
|
39
|
+
@content_type_accept
|
40
|
+
end
|
26
41
|
end
|
42
|
+
|
43
|
+
Frenchy.register_content_type("application/json") {|x| JSON.parse(x) }
|
data/lib/frenchy/client.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "net/http"
|
2
2
|
require "json"
|
3
|
+
require "uri"
|
3
4
|
|
4
5
|
module Frenchy
|
5
6
|
class Client
|
@@ -46,16 +47,13 @@ module Frenchy
|
|
46
47
|
private
|
47
48
|
|
48
49
|
def perform(method, path, params)
|
49
|
-
uri = URI(@host)
|
50
|
+
uri = URI(@host + path)
|
50
51
|
body = nil
|
51
52
|
headers = {
|
52
53
|
"User-Agent" => "Frenchy/#{Frenchy::VERSION}",
|
53
|
-
"Accept" =>
|
54
|
+
"Accept" => Frenchy.accept_header,
|
54
55
|
}.merge(@headers)
|
55
56
|
|
56
|
-
# Set the URI path
|
57
|
-
uri.path = path
|
58
|
-
|
59
57
|
# Set request parameters
|
60
58
|
if params.any?
|
61
59
|
case method
|
@@ -102,7 +100,7 @@ module Frenchy
|
|
102
100
|
when 200...399
|
103
101
|
# Positive responses are expected to return JSON
|
104
102
|
begin
|
105
|
-
|
103
|
+
decode_response(resp)
|
106
104
|
rescue => ex
|
107
105
|
raise Frenchy::InvalidResponse.new(ex, reqinfo, resp)
|
108
106
|
end
|
@@ -124,5 +122,9 @@ module Frenchy
|
|
124
122
|
def perform_request(http, req)
|
125
123
|
http.request(req)
|
126
124
|
end
|
125
|
+
|
126
|
+
def decode_response(resp)
|
127
|
+
Frenchy.find_content_type_handler(resp["Content-Type"]).call(resp.body)
|
128
|
+
end
|
127
129
|
end
|
128
130
|
end
|
data/lib/frenchy/model.rb
CHANGED
@@ -145,7 +145,7 @@ module Frenchy
|
|
145
145
|
# Convert value to a Time or DateTime. Numbers are treated as unix timestamps,
|
146
146
|
# other values are parsed with DateTime.parse.
|
147
147
|
define_method("#{name}=") do |v|
|
148
|
-
if v.is_a?(
|
148
|
+
if v.is_a?(Integer)
|
149
149
|
set(name, Time.at(v).to_datetime)
|
150
150
|
elsif v.is_a?(DateTime)
|
151
151
|
set(name, v)
|
data/lib/frenchy/request.rb
CHANGED
data/lib/frenchy/resource.rb
CHANGED
@@ -7,7 +7,7 @@ module Frenchy
|
|
7
7
|
module ClassMethods
|
8
8
|
# Find record(s) using the default endpoint and flexible input
|
9
9
|
def find(params={})
|
10
|
-
params = {"id" => params.to_s} if [
|
10
|
+
params = {"id" => params.to_s} if [Integer, String].any? {|c| params.is_a? c }
|
11
11
|
find_with_endpoint("default", params)
|
12
12
|
end
|
13
13
|
|
data/lib/frenchy/version.rb
CHANGED
@@ -250,7 +250,7 @@ describe Frenchy::Model do
|
|
250
250
|
expect(v.other_priority).to eql(Box::Priority::NORMAL)
|
251
251
|
end
|
252
252
|
|
253
|
-
it "accepts
|
253
|
+
it "accepts integers" do
|
254
254
|
v = Box.new(priority: 2)
|
255
255
|
expect(v.priority).to eql(Box::Priority::EXPRESS)
|
256
256
|
expect(v.priority.to_i).to eql(2)
|
@@ -307,4 +307,4 @@ describe Frenchy::Model do
|
|
307
307
|
end
|
308
308
|
end
|
309
309
|
end
|
310
|
-
end
|
310
|
+
end
|
@@ -7,6 +7,12 @@ describe Frenchy::Request do
|
|
7
7
|
expect(request.path).to eql("/v1/users/1234/md5something")
|
8
8
|
end
|
9
9
|
|
10
|
+
it "escapes path parameters but not query params" do
|
11
|
+
request = Frenchy::Request.new("service", "get", "/v1/users/:slug/:fullname", {"slug" => "big dog 20", "fullname" => "How Big Is He?", "division" => "How Big Is He, Really?"}, {})
|
12
|
+
expect(request.path).to eql("/v1/users/big+dog+20/How+Big+Is+He%3F")
|
13
|
+
expect(request.params).to eql({"division" => "How Big Is He, Really?"})
|
14
|
+
end
|
15
|
+
|
10
16
|
it "retains remaining parameters as query parameters" do
|
11
17
|
request = Frenchy::Request.new("service", "get", "/v1/users/:id", {"id" => 1234, "token" => "md5something"}, {})
|
12
18
|
expect(request.path).to eql("/v1/users/1234")
|
data/spec/lib/frenchy_spec.rb
CHANGED
@@ -15,4 +15,16 @@ describe Frenchy do
|
|
15
15
|
expect{Frenchy.find_service("nonexistent")}.to raise_error(Frenchy::Error)
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
|
+
describe ".register_content_type" do
|
20
|
+
it "adds the content type to the accept header" do
|
21
|
+
expect(Frenchy.accept_header).to eql("application/json")
|
22
|
+
Frenchy.register_content_type("application/other") do |x|
|
23
|
+
5
|
24
|
+
end
|
25
|
+
expect(Frenchy.accept_header).to eql("application/json, application/other")
|
26
|
+
expect(Frenchy.find_content_type_handler("application/other").call(nil)).to eql(5)
|
27
|
+
expect{Frenchy.find_content_type_handler("nonexistent")}.to raise_error(Frenchy::Error)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: frenchy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Coene
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: guard-rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -165,7 +165,7 @@ homepage: https://github.com/jcoene/frenchy
|
|
165
165
|
licenses:
|
166
166
|
- MIT
|
167
167
|
metadata: {}
|
168
|
-
post_install_message:
|
168
|
+
post_install_message:
|
169
169
|
rdoc_options: []
|
170
170
|
require_paths:
|
171
171
|
- lib
|
@@ -180,9 +180,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
180
|
- !ruby/object:Gem::Version
|
181
181
|
version: '0'
|
182
182
|
requirements: []
|
183
|
-
|
184
|
-
|
185
|
-
signing_key:
|
183
|
+
rubygems_version: 3.2.3
|
184
|
+
signing_key:
|
186
185
|
specification_version: 4
|
187
186
|
summary: Opinionated JSON API modeling framework for Ruby.
|
188
187
|
test_files:
|