frenchy 0.5.1 → 0.6.3
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|