lhc 6.7.2 → 7.0.0.beta1

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: 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