lhc 6.7.2 → 7.0.0.beta1

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
  SHA1:
3
- metadata.gz: 8e6b09ef7b4e0f1b03515fa76038d15d26b20362
4
- data.tar.gz: 8963d07d786b7636b3d4366b4dec2767aa965f93
3
+ metadata.gz: dfdf5514e679a637e9e800e71d64394e922494ab
4
+ data.tar.gz: '09f38587235d31394bc9100cba4dde8e292592b8'
5
5
  SHA512:
6
- metadata.gz: b06fd0687be3c9f1664fd0b432f47f56c4ed626ef8ee7a03cd19942d441de0f33a8e3028005b53b12bf324df1a18d5b2fc18813ff8917d4a7d1b941f5e1a2f95
7
- data.tar.gz: 0b97fa787029486bb7c728013382781e011857d1b72ed9338b0000e7518678eb2d1190bd5edd24a2116a63abb6c6f63a9be6607b91edccde57e594d602849886
6
+ metadata.gz: 74a8a94d300802292148f4c590a924197f94f2e93e3909510f70537da5c740f6e5d10de3da5473b84f25b102822434f6709ec696986e46107789643cfc5fd2cf
7
+ data.tar.gz: 4dd2d4d39e7d9907366f6c132b676aca4167d219df0e2e7820f1e515a9c3bf79442016a547d16a5fe4d6fe8997234ffc50bffce821d6cbdb51c1c5999154568c
@@ -1 +1 @@
1
- ruby-2.3.3
1
+ ruby-2.4.3
data/README.md CHANGED
@@ -105,7 +105,7 @@ You can configure global endpoints, placeholders and interceptors.
105
105
  ```ruby
106
106
  LHC.configure do |c|
107
107
  c.placeholder :datastore, 'http://datastore/v2'
108
- c.endpoint :feedbacks, ':datastore/feedbacks', params: { has_reviews: true }
108
+ c.endpoint :feedbacks, '{+datastore}/feedbacks', params: { has_reviews: true }
109
109
  c.interceptors = [LHC::Caching]
110
110
  end
111
111
  ```
@@ -116,9 +116,10 @@ You can configure global endpoints, placeholders and interceptors.
116
116
 
117
117
  Instead of using concrete urls you can also use url-templates that contain placeholders.
118
118
  This is especially handy for configuring an endpoint once and generate the url from the params when doing the request.
119
+ Since version `7.0` url templates follow the [RFC 6750](https://tools.ietf.org/html/rfc6570).
119
120
 
120
121
  ```ruby
121
- url = 'http://datastore/v2/feedbacks/:id'
122
+ url = 'http://datastore/v2/feedbacks/{id}'
122
123
  LHC.config.endpoint(:find_feedback, url, options)
123
124
  LHC.get(:find_feedback, params:{ id: 123 })
124
125
  # GET http://datastore/v2/feedbacks/123
@@ -127,7 +128,7 @@ This is especially handy for configuring an endpoint once and generate the url f
127
128
  This also works in place without configuring an endpoint.
128
129
 
129
130
  ```ruby
130
- LHC.get('http://datastore/v2/feedbacks/:id', params:{ id: 123 })
131
+ LHC.get('http://datastore/v2/feedbacks/{id}', params:{ id: 123 })
131
132
  # GET http://datastore/v2/feedbacks/123
132
133
  ```
133
134
 
@@ -155,7 +156,7 @@ response.data.name # 'unknown'
155
156
 
156
157
  ### Ignore certain errors
157
158
 
158
- As it's discouraged to rescue errors and then don't handle them (ruby styleguide),
159
+ As it's discouraged to rescue errors and then don't handle them (ruby styleguide)[https://github.com/bbatsov/ruby-style-guide#dont-hide-exceptions],
159
160
  but you often want to continue working with `nil`, LHC provides the `ignored_errors` option.
160
161
 
161
162
  Errors listed in this option will not be raised and will leave the `response.body` and `response.data` to stay `nil`.
@@ -1,17 +1,17 @@
1
1
  Configuration
2
2
  ===
3
3
 
4
- ## Configure LHC on initialisation
4
+ ## Configure LHC on initialization
5
5
 
6
- If you want to configure LHC on initialisation (like in a Rails initializer, environment.rb or application.rb), you could run into the problem that certain configurations can only be set once.
7
- You can use `LHC.configure` to prevent the initialisation problem.
6
+ If you want to configure LHC on initialization (like in a Rails initializer, `environment.rb` or `application.rb`), you could run into the problem that certain configurations can only be set once.
7
+ You can use `LHC.configure` to prevent the initialization problem.
8
8
  Take care that you only use `LHC.configure` once, because it is actually reseting previously made configurations and applies the new once.
9
9
 
10
10
  ```ruby
11
11
 
12
12
  LHC.configure do |c|
13
13
  c.placeholder :datastore, 'http://datastore/v2'
14
- c.endpoint :feedbacks, ':datastore/feedbacks'
14
+ c.endpoint :feedbacks, '{+datastore}/feedbacks'
15
15
  c.interceptors = [CachingInterceptor, MonitorInterceptor, TrackingIdInterceptor]
16
16
  end
17
17
 
@@ -41,7 +41,7 @@ You can configure global placeholders, that are used when generating urls from u
41
41
  ```ruby
42
42
  LHC.config.placeholder(:datastore, 'http://datastore/v2')
43
43
  options = { params: { has_reviews: true } }
44
- LHC.config.endpoint(:feedbacks, url, options)
44
+ LHC.config.endpoint(:feedbacks, '{+datastore}/feedbacks', options)
45
45
  LHC.get(:feedbacks)
46
46
  ```
47
47
 
@@ -26,7 +26,7 @@ rescue => e
26
26
  ```
27
27
 
28
28
  All errors that are raise by LHC inherit from `LHC::Error`.
29
- They are divided into `LHC::ClientError`, `LHC::ServerError`, `LHC::Timeout` and `LHC::UnkownError` and mapped arcording to the following status code.
29
+ They are divided into `LHC::ClientError`, `LHC::ServerError`, `LHC::Timeout` and `LHC::UnkownError` and mapped according to the following status code.
30
30
 
31
31
  ```ruby
32
32
  400 => LHC::BadRequest
@@ -64,7 +64,7 @@ You can override the global default interceptors on request level:
64
64
  ## Provide Response
65
65
 
66
66
  Inside an interceptor, you are able to provide a response, rather then doing a real request.
67
- This is usefull for implementing an interceptor for caching.
67
+ This is useful for implementing an interceptor for caching.
68
68
 
69
69
  ```ruby
70
70
  class LHC::Cache < LHC::Interceptor
@@ -24,7 +24,7 @@ You can also enable caching when configuring an endpoint in LHS.
24
24
 
25
25
  ```ruby
26
26
  class Feedbacks < LHS::Service
27
- endpoint ':datastore/v2/feedbacks', cache: true
27
+ endpoint '{+datastore}/v2/feedbacks', cache: true
28
28
  end
29
29
  ```
30
30
 
@@ -13,6 +13,6 @@ Logs basic request/response information to prometheus.
13
13
  LHC.get('http://local.ch')
14
14
  ```
15
15
 
16
- - Creates a promethues counter that receives additional meta information for: `:code`, `:success` and `:timeout`.
16
+ - Creates a prometheus counter that receives additional meta information for: `:code`, `:success` and `:timeout`.
17
17
 
18
- - Creates a promethues histogram for response times in milliseconds.
18
+ - Creates a prometheus histogram for response times in milliseconds.
@@ -1,6 +1,6 @@
1
1
  # Retry Interceptor
2
2
 
3
- If you enable the retry interceptor, you can have lhc retry requests for you:
3
+ If you enable the retry interceptor, you can have LHC retry requests for you:
4
4
 
5
5
  ```ruby
6
6
  LHC.config.interceptors = [LHC::Retry]
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
 
23
23
  s.add_dependency 'typhoeus'
24
24
  s.add_dependency 'activesupport', '>= 4.2'
25
+ s.add_dependency 'addressable'
25
26
 
26
27
  s.add_development_dependency 'rspec-rails', '>= 3.0.0'
27
28
  s.add_development_dependency 'rails', '~> 4.2'
@@ -1,13 +1,8 @@
1
- require 'uri'
2
- # frozen_string_literal: true
1
+ require 'addressable/template'
2
+
3
3
  # An endpoint is an url that leads to a backend resource.
4
- # The url can also be an url-template.
4
+ # The url can also be an url-template (https://tools.ietf.org/html/rfc6570).
5
5
  class LHC::Endpoint
6
-
7
- PLACEHOLDER ||= %r{:[^\/\.:;\d\&@]+}
8
- ANYTHING_BUT_SINGLE_SLASH_AND_DOT ||= '([^\/\.]|\/\/)+'.freeze
9
- URL_PARAMETERS ||= '(\\?.*)*'
10
-
11
6
  attr_accessor :url, :options
12
7
 
13
8
  def initialize(url, options = nil)
@@ -16,41 +11,19 @@ class LHC::Endpoint
16
11
  end
17
12
 
18
13
  def uri
19
- @uri ||= parse_url_gracefully(url)
20
- end
21
-
22
- def parse_url_gracefully(url)
23
- URI.parse(url)
24
- rescue URI::InvalidURIError
25
- url
14
+ @uri ||= Addressable::Template.new(url)
26
15
  end
27
16
 
28
17
  def compile(params)
29
- add_basic_auth(
30
- without_basic_auth(url).gsub(PLACEHOLDER) do |match|
31
- replacement =
32
- if params.is_a? Proc
33
- params.call(match)
34
- else
35
- find_value(match, params)
36
- end
37
- replacement || fail("Compilation incomplete. Unable to find value for #{match.gsub(':', '')}.")
38
- end
39
- )
40
- end
41
-
42
- def add_basic_auth(url)
43
- return url if !uri || !uri.is_a?(URI) || (uri.user.blank? && uri.password.blank?)
44
- new_uri = parse_url_gracefully(url)
45
- new_uri.user = uri.user
46
- new_uri.password = uri.password
47
- new_uri.to_s
48
- end
18
+ context = LHC.config.placeholders.deep_dup
19
+ context.merge!(params) if params.is_a?(Hash)
20
+ expanded = uri.partial_expand(context)
49
21
 
50
- # Strips basic auth from the url
51
- def without_basic_auth(url)
52
- return url if !uri || !uri.is_a?(URI) || (uri.user.blank? && uri.password.blank?)
53
- url.gsub("#{uri.user}:#{uri.password}@", '')
22
+ if expanded.variables.empty?
23
+ expanded.pattern
24
+ else
25
+ fail("Compilation incomplete. Unable to find value for #{expanded.variables.join(', ')}.")
26
+ end
54
27
  end
55
28
 
56
29
  # Endpoint options are immutable
@@ -62,62 +35,79 @@ class LHC::Endpoint
62
35
  # when they are used for interpolation.
63
36
  def remove_interpolated_params!(params)
64
37
  params ||= {}
65
- removed = {}
66
- url.scan(PLACEHOLDER) do |match|
67
- match = match.gsub(/^\:/, '')
68
- value = find_value(match, params)
69
- if value
70
- removed[match.to_sym] = value
71
- params.delete(match.to_sym)
72
- end
73
- end
38
+ removed = params.slice(*placeholders)
39
+ params.except!(*placeholders)
40
+
74
41
  removed
75
42
  end
76
43
 
77
44
  # Returns all placeholders found in the url-template.
78
45
  # They are alphabetically sorted.
79
46
  def placeholders
80
- LHC::Endpoint.placeholders(url)
47
+ uri.variables.sort.map(&:to_sym)
81
48
  end
82
49
 
83
- # Find a value for a placeholder either in the configuration
84
- # or in the provided params.
85
- def find_value(match, params)
86
- params ||= {}
87
- match = match.gsub(/^\:/, '').to_sym
88
- params[match] || LHC.config.placeholders[match]
50
+ # Compares a concrete url with a template
51
+ # Returns true if concrete url is covered by the template
52
+ # Example: {+datastore}/contracts/{id} == http://local.ch/contracts/1
53
+ def match?(url)
54
+ return true if url == uri.pattern
55
+ match_data = match_data(url)
56
+ return false if match_data.nil?
57
+
58
+ match_data.values.all? { |value| valid_value?(value) }
59
+ end
60
+
61
+ # Extracts the values from url and
62
+ # creates params according to template
63
+ def values_as_params(url)
64
+ match_data = match_data(url)
65
+ return if match_data.nil?
66
+ Hash[match_data.variables.map(&:to_sym).zip(match_data.values)]
67
+ end
68
+
69
+ # Checks if the name has a match in the current context
70
+ def find_value(name, mapping)
71
+ context = LHC.config.placeholders.deep_dup
72
+ context.merge!(mapping)
73
+
74
+ context[name]
89
75
  end
90
76
 
91
77
  # Compares a concrete url with a template
92
78
  # Returns true if concrete url is covered by the template
93
- # Example: :datastore/contracts/:id == http://local.ch/contracts/1
79
+ # Example: {+datastore}/contracts/{id} == http://local.ch/contracts/1
94
80
  def self.match?(url, template)
95
- regexp = template.gsub PLACEHOLDER, ANYTHING_BUT_SINGLE_SLASH_AND_DOT
96
- regexp += URL_PARAMETERS
97
- url.match "#{regexp}$"
81
+ new(template).match?(url)
98
82
  end
99
83
 
100
84
  # Returns all placeholders found in the url-template.
101
85
  # They are alphabetically sorted.
102
86
  def self.placeholders(template)
103
- template.scan(PLACEHOLDER).sort
87
+ new(template).placeholders
104
88
  end
105
89
 
106
90
  # Extracts the values from url and
107
91
  # creates params according to template
108
92
  def self.values_as_params(template, url)
109
- params = {}
110
- regexp = template
111
- LHC::Endpoint.placeholders(template).each do |placeholder|
112
- name = placeholder.gsub(":", '')
113
- regexp = regexp.gsub(placeholder, "(?<#{name}>.*)")
114
- end
115
- regexp += URL_PARAMETERS
116
- matchdata = url.match(Regexp.new("^#{regexp}$"))
117
- LHC::Endpoint.placeholders(template).each do |placeholder|
118
- name = placeholder.gsub(':', '')
119
- params[name.to_sym] = matchdata[name]
120
- end
121
- params
93
+ fail("#{url} does not match the template: #{template}") if !match?(url, template)
94
+ new(template).values_as_params(url)
95
+ end
96
+
97
+ private
98
+
99
+ # Ensure there are no false positives in the template matching
100
+ def valid_value?(value)
101
+ value.match(%{https?:/$}).nil? &&
102
+ value.match(/.*\.json/).nil?
103
+ end
104
+
105
+ def match_data(url)
106
+ parsed = URI.parse(url)
107
+ parsed.query = parsed.fragment = nil
108
+
109
+ uri.match(parsed)
110
+ rescue URI::InvalidURIError
111
+ nil
122
112
  end
123
113
  end
@@ -1,3 +1,3 @@
1
1
  module LHC
2
- VERSION ||= '6.7.2'
2
+ VERSION ||= '7.0.0.beta1'
3
3
  end
@@ -16,7 +16,7 @@ describe LHC do
16
16
  end
17
17
 
18
18
  it 'does a get request when providing the name of a configured endpoint' do
19
- url = 'http://:datastore/v2/feedbacks'
19
+ url = 'http://{+datastore}/v2/feedbacks'
20
20
  options = { params: { datastore: 'datastore' } }
21
21
  LHC.configure { |c| c.endpoint(:feedbacks, url, options) }
22
22
  LHC.get(:feedbacks, params: parameters)
@@ -21,7 +21,7 @@ describe LHC do
21
21
  end
22
22
 
23
23
  it 'does a post request when providing the name of a configured endpoint' do
24
- url = 'http://:datastore/v2/feedbacks'
24
+ url = 'http://{+datastore}/v2/feedbacks'
25
25
  options = { params: { datastore: 'datastore' } }
26
26
  LHC.configure { |c| c.endpoint(:feedbacks, url, options) }
27
27
  LHC.post(:feedbacks, body: feedback.to_json)
@@ -27,7 +27,7 @@ describe LHC do
27
27
  end
28
28
 
29
29
  it 'does a post request when providing the name of a configured endpoint' do
30
- url = 'http://:datastore/v2/feedbacks'
30
+ url = 'http://{+datastore}/v2/feedbacks'
31
31
  options = { params: { datastore: 'datastore' } }
32
32
  LHC.configure { |c| c.endpoint(:feedbacks, url, options) }
33
33
  LHC.put(:feedbacks, body: change.to_json)
@@ -2,7 +2,7 @@ require 'rails_helper'
2
2
 
3
3
  describe LHC do
4
4
  context 'configured endpoints' do
5
- let(:url) { 'http://analytics/track/:entity_id/w/:type' }
5
+ let(:url) { 'http://analytics/track/{entity_id}/w/{type}' }
6
6
 
7
7
  let(:options) do
8
8
  {
@@ -5,13 +5,13 @@ describe LHC do
5
5
  it 'uses values for placeholders defined globally' do
6
6
  LHC.configure { |c| c.placeholder(:datastore, 'http://datastore/v2') }
7
7
  stub_request(:get, "http://datastore/v2/feedbacks")
8
- LHC.get(':datastore/feedbacks')
8
+ LHC.get('{+datastore}/feedbacks')
9
9
  end
10
10
 
11
11
  it 'uses explicit values first' do
12
12
  LHC.configure { |c| c.placeholder(:campaign_id, '123') }
13
13
  stub_request(:get, 'http://datastore/v2/campaign/456/feedbacks')
14
- url = 'http://datastore/v2/campaign/:campaign_id/feedbacks'
14
+ url = 'http://datastore/v2/campaign/{campaign_id}/feedbacks'
15
15
  LHC.get(url, params: { campaign_id: '456' })
16
16
  end
17
17
 
@@ -3,39 +3,28 @@ require 'rails_helper'
3
3
  describe LHC::Endpoint do
4
4
  context 'compile' do
5
5
  it 'uses parameters for interpolation' do
6
- endpoint = LHC::Endpoint.new(':datastore/v2/:campaign_id/feedbacks')
6
+ endpoint = LHC::Endpoint.new('{+datastore}/v2/{campaign_id}/feedbacks')
7
7
  expect(
8
8
  endpoint.compile(datastore: 'http://datastore', campaign_id: 'abc')
9
9
  ).to eq "http://datastore/v2/abc/feedbacks"
10
10
  end
11
11
 
12
- it 'uses provided proc to find values' do
13
- endpoint = LHC::Endpoint.new(':datastore/v2')
14
- config = { datastore: 'http://datastore' }
15
- find_value = lambda { |match|
16
- config[match.gsub(':', '').to_sym]
17
- }
18
- expect(
19
- endpoint.compile(find_value)
20
- ).to eq "http://datastore/v2"
21
- end
22
-
23
12
  it 'compiles when templates contain dots' do
24
- endpoint = LHC::Endpoint.new(':datastore/entries/:id.json')
13
+ endpoint = LHC::Endpoint.new('{+datastore}/entries/{id}.json')
25
14
  expect(
26
15
  endpoint.compile(datastore: 'http://datastore', id: 123)
27
16
  ).to eq "http://datastore/entries/123.json"
28
17
  end
29
18
 
30
19
  it 'compiles complex urls containing all sort of characters' do
31
- endpoint = LHC::Endpoint.new(':ads/?adrawdata/3.0/1108.1/2844859/0/0/header=yes;cookie=no;adct=204;alias=:region_id:lang:product_type:product;key=cat=:category_id')
20
+ endpoint = LHC::Endpoint.new('{+ads}/?adrawdata/3.0/1108.1/2844859/0/0/header=yes;cookie=no;adct=204;alias={region_id}{lang}{product_type}{product};key=cat={category_id}')
32
21
  expect(
33
22
  endpoint.compile(ads: 'http://ads', region_id: 291, lang: 'de', product_type: 'ABC', product: 'xyz', category_id: 312)
34
23
  ).to eq 'http://ads/?adrawdata/3.0/1108.1/2844859/0/0/header=yes;cookie=no;adct=204;alias=291deABCxyz;key=cat=312'
35
24
  end
36
25
 
37
26
  it 'compiles complex urls containing &' do
38
- endpoint = LHC::Endpoint.new('http://:weather_search_host/forecast?format=json&period=hour&limit=:limit&areas=:zipcodes&when=:when')
27
+ endpoint = LHC::Endpoint.new('http://{+weather_search_host}/forecast?format=json&period=hour&limit={limit}&areas={+zipcodes}&when={when}')
39
28
  expect(
40
29
  endpoint.compile(weather_search_host: 'weather', limit: 5, zipcodes: [8005, 8004].join(','), when: 'today')
41
30
  ).to eq 'http://weather/forecast?format=json&period=hour&limit=5&areas=8005,8004&when=today'
@@ -3,35 +3,33 @@ require 'rails_helper'
3
3
  describe LHC::Endpoint do
4
4
  context 'match' do
5
5
  context 'matching' do
6
- it 'checks if a url matches a template' do
7
- {
8
- ':datastore/v2/places' => 'http://local.ch:8082/v2/places',
9
- ':datastore/v2/places/:id' => 'http://local.ch:8082/v2/places/ZW9OJyrbt4OZE9ueu80w-A',
10
- ':datastore/v2/places/:namespace/:id' => 'http://local.ch:8082/v2/places/switzerland/ZW9OJyrbt',
11
- ':datastore/addresses/:id' => 'http://local.ch/addresses/123',
12
- 'http://local.ch/addresses/:id' => 'http://local.ch/addresses/123',
13
- ':datastore/customers/:id/addresses' => 'http://local.ch:80/server/rest/v1/customers/123/addresses',
14
- ':datastore/entries/:id.json' => 'http://local.ch/entries/123.json',
15
- ':datastore/places/:place_id/feedbacks' => 'http://local.ch/places/1/feedbacks?limit=10&offset=0'
16
- }.each do |template, url|
17
- expect(
18
- LHC::Endpoint.match?(url, template)
19
- ).to be, "#{url} should match #{template}!"
6
+ {
7
+ '{+datastore}/v2/places' => 'http://local.ch:8082/v2/places',
8
+ '{+datastore}/v2/places/{id}' => 'http://local.ch:8082/v2/places/ZW9OJyrbt4OZE9ueu80w-A',
9
+ '{+datastore}/v2/places/{namespace}/{id}' => 'http://local.ch:8082/v2/places/switzerland/ZW9OJyrbt',
10
+ '{+datastore}/addresses/{id}' => 'http://local.ch/addresses/123',
11
+ 'http://local.ch/addresses/{id}' => 'http://local.ch/addresses/123',
12
+ '{+datastore}/customers/{id}/addresses' => 'http://local.ch:80/server/rest/v1/customers/123/addresses',
13
+ '{+datastore}/entries/{id}.json' => 'http://local.ch/entries/123.json',
14
+ '{+datastore}/places/{place_id}/feedbacks' => 'http://local.ch/places/1/feedbacks?limit=10&offset=0'
15
+ }.each do |template, url|
16
+ it "#{url} matches #{template}" do
17
+ expect(LHC::Endpoint.match?(url, template)).to be
20
18
  end
21
19
  end
22
20
  end
23
21
 
24
22
  context 'not matching' do
25
- it 'checks if a url matches a template' do
26
- {
27
- ':datastore/v2/places' => 'http://local.ch:8082/v2/places/ZW9OJyrbt4OZE9ueu80w-A',
28
- ':datastore/:campaign_id/feedbacks' => 'http://datastore.local.ch/feedbacks',
29
- ':datastore/customers/:id' => 'http://local.ch:80/server/rest/v1/customers/123/addresses',
30
- ':datastore/entries/:id' => 'http://local.ch/entries/123.json'
31
- }.each do |template, url|
23
+ {
24
+ '{+datastore}/v2/places' => 'http://local.ch:8082/v2/places/ZW9OJyrbt4OZE9ueu80w-A',
25
+ '{+datastore}/{campaign_id}/feedbacks' => 'http://datastore.local.ch/feedbacks',
26
+ '{+datastore}/customers/{id}' => 'http://local.ch:80/server/rest/v1/customers/123/addresses',
27
+ '{+datastore}/entries/{id}' => 'http://local.ch/entries/123.json'
28
+ }.each do |template, url|
29
+ it "#{url} should not match #{template}" do
32
30
  expect(
33
31
  LHC::Endpoint.match?(url, template)
34
- ).not_to be, "#{url} should not match #{template}!"
32
+ ).not_to be
35
33
  end
36
34
  end
37
35
  end
@@ -3,10 +3,10 @@ require 'rails_helper'
3
3
  describe LHC::Endpoint do
4
4
  context 'placeholders' do
5
5
  it 'returns all placeholders alphabetically sorted' do
6
- endpoint = LHC::Endpoint.new(':datastore/v2/:campaign_id/feedbacks')
6
+ endpoint = LHC::Endpoint.new('{+datastore}/v2/{campaign_id}/feedbacks')
7
7
  expect(
8
8
  endpoint.placeholders
9
- ).to eq [':campaign_id', ':datastore']
9
+ ).to eq [:campaign_id, :datastore]
10
10
  end
11
11
 
12
12
  it 'allows basic auth token in url, like used on github' do
@@ -7,7 +7,7 @@ describe LHC::Endpoint do
7
7
  campaign_id: 'abc',
8
8
  has_reviews: true
9
9
  }
10
- endpoint = LHC::Endpoint.new(':datastore/v2/:campaign_id/feedbacks')
10
+ endpoint = LHC::Endpoint.new('{+datastore}/v2/{campaign_id}/feedbacks')
11
11
  removed = endpoint.remove_interpolated_params!(params)
12
12
  expect(params).to eq(has_reviews: true)
13
13
  expect(removed).to eq(datastore: 'http://datastore', campaign_id: 'abc')
@@ -2,23 +2,27 @@ require 'rails_helper'
2
2
 
3
3
  describe LHC::Endpoint do
4
4
  context 'values_as_params' do
5
- it 'provides params extracting values from a provided url and template' do
6
- [
7
- [':datastore/v2/places', 'http://local.ch:8082/v2/places', {
8
- datastore: 'http://local.ch:8082'
9
- }],
10
- [':datastore/v2/places/:id', 'http://local.ch:8082/v2/places/ZW9OJyrbt4OZE9ueu80w-A', {
11
- datastore: 'http://local.ch:8082',
12
- id: 'ZW9OJyrbt4OZE9ueu80w-A'
13
- }],
14
- [':datastore/v2/places/:namespace/:id', 'http://local.ch:8082/v2/places/switzerland/ZW9OJyrbt', {
15
- datastore: 'http://local.ch:8082',
16
- namespace: 'switzerland',
17
- id: 'ZW9OJyrbt'
18
- }]
19
- ].each do |example|
20
- params = LHC::Endpoint.values_as_params(example[0], example[1])
21
- expect(params).to eq example[2]
5
+ [
6
+ ['{+datastore}/v2/places', 'http://local.ch:8082/v2/places', {
7
+ datastore: 'http://local.ch:8082'
8
+ }],
9
+ ['{+datastore}/v2/places/{id}', 'http://local.ch:8082/v2/places/ZW9OJyrbt4OZE9ueu80w-A', {
10
+ datastore: 'http://local.ch:8082',
11
+ id: 'ZW9OJyrbt4OZE9ueu80w-A'
12
+ }],
13
+ ['{+datastore}/v2/places/{namespace}/{id}', 'http://local.ch:8082/v2/places/switzerland/ZW9OJyrbt', {
14
+ datastore: 'http://local.ch:8082',
15
+ namespace: 'switzerland',
16
+ id: 'ZW9OJyrbt'
17
+ }]
18
+ ].each do |example|
19
+ template = example[0]
20
+ url = example[1]
21
+ params = example[2]
22
+
23
+ it "for the template #{template} it extracts #{params.keys.join(', ')} from the url" do
24
+ extracted = LHC::Endpoint.values_as_params(template, url)
25
+ expect(extracted).to eq(params)
22
26
  end
23
27
  end
24
28
  end
@@ -2,7 +2,7 @@ require 'rails_helper'
2
2
 
3
3
  describe LHC::Request do
4
4
  it 'does not alter the options that where passed' do
5
- LHC.configure { |c| c.endpoint(:kpi_tracker, 'http://analytics/track/:entity_id/w', params: { env: 'PROD' }) }
5
+ LHC.configure { |c| c.endpoint(:kpi_tracker, 'http://analytics/track/{entity_id}/w', params: { env: 'PROD' }) }
6
6
  options = { params: { entity_id: '123' } }
7
7
  stub_request(:get, "http://analytics/track/123/w?env=PROD")
8
8
  LHC.get(:kpi_tracker, options)
@@ -5,7 +5,7 @@ describe LHC::Request do
5
5
  options = { params: {
6
6
  has_reviews: true
7
7
  } }
8
- url = 'http://datastore/v2/campaign/:campaign_id/feedbacks'
8
+ url = 'http://datastore/v2/campaign/{campaign_id}/feedbacks'
9
9
  LHC.configure { |c| c.endpoint(:feedbacks, url, options) }
10
10
  stub_request(:get, 'http://datastore/v2/campaign/123/feedbacks?has_reviews=true')
11
11
  LHC.get(:feedbacks, params: { campaign_id: 123 })
@@ -13,11 +13,11 @@ describe LHC::Request do
13
13
 
14
14
  it 'compiles url when doing a request' do
15
15
  stub_request(:get, 'http://datastore:8080/v2/feedbacks/123')
16
- LHC.get('http://datastore:8080/v2/feedbacks/:id', params: { id: 123 })
16
+ LHC.get('http://datastore:8080/v2/feedbacks/{id}', params: { id: 123 })
17
17
  end
18
18
 
19
19
  it 'considers body when compiling urls' do
20
20
  stub_request(:post, "http://datastore:8080/v2/places/123")
21
- LHC.json.post('http://datastore:8080/v2/places/:id', body: { id: 123 }.to_json)
21
+ LHC.json.post('http://datastore:8080/v2/places/{id}', body: { id: 123 }.to_json)
22
22
  end
23
23
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lhc
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.7.2
4
+ version: 7.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - https://github.com/local-ch/lhc/contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-12 00:00:00.000000000 Z
11
+ date: 2018-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: typhoeus
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '4.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: addressable
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec-rails
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -339,13 +353,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
339
353
  version: 2.0.0
340
354
  required_rubygems_version: !ruby/object:Gem::Requirement
341
355
  requirements:
342
- - - ">="
356
+ - - ">"
343
357
  - !ruby/object:Gem::Version
344
- version: '0'
358
+ version: 1.3.1
345
359
  requirements:
346
360
  - Ruby >= 2.0.0
347
361
  rubyforge_project:
348
- rubygems_version: 2.6.12
362
+ rubygems_version: 2.6.14
349
363
  signing_key:
350
364
  specification_version: 4
351
365
  summary: LocalHttpClient