estated 0.2.0 → 0.3.0

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
  SHA256:
3
- metadata.gz: e16673bb64d863d6b2c5c1cd3b23957d7fa5c47565b817e7741bfa44542987fd
4
- data.tar.gz: 97e6855b5c3cafe0981640560e59274e092fdc71f8ea4d1e0abbcd07cbea1436
3
+ metadata.gz: 2bda40363bc8b3099785ae4cbae1c0f63b430e2d8356139b665719c1e71fb72d
4
+ data.tar.gz: cff05669b537733cf977ad1a7851ef97c7137f37654e331f421a95ea1c1475df
5
5
  SHA512:
6
- metadata.gz: 8f0bfc2e476b50a0addb93ad91a5b3b07cb19709ddaedd800bc352b6753567775012dd02c8be50e7245762f74954451a694381382e5681aaab14cb1f472a0b3c
7
- data.tar.gz: 86fb6dc380bd2c084b4b72cb57623c790f007d88b68e7d58cdc95e7cf1923d6aec8be1c2b09efedf06a329e11b728cae4ffec84d51e594d1af0b1e0818d29037
6
+ metadata.gz: de9bb73bb6f5c6b73ab1ac32688723f78e789c8fa8160a7dbda8ae1f530db1e768f8becd4375029062c01cc1df6d65bbd76aad9b605305ee18a8ba9f75e5017c
7
+ data.tar.gz: fe0fe3715744ff12df6ae1723306041ecec07c6a1bb9ce7dec1189c171fb8cf17c9282433734b8d7575c0c9d448e9d6b6346b24939956405fd88e2a3a63266a6
@@ -0,0 +1 @@
1
+ ESTATED_API_KEY=
data/.gitignore CHANGED
@@ -10,6 +10,9 @@
10
10
  # Byebug
11
11
  .byebug_history
12
12
 
13
+ # Dotenv
14
+ .env
15
+
13
16
  # rspec failure tracking
14
17
  .rspec_status
15
18
 
@@ -3,16 +3,19 @@ PATH
3
3
  specs:
4
4
  estated (0.2.0)
5
5
  httparty
6
+ mongo
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
9
10
  specs:
10
11
  addressable (2.7.0)
11
12
  public_suffix (>= 2.0.2, < 5.0)
13
+ bson (4.4.2)
12
14
  byebug (11.0.1)
13
15
  crack (0.4.3)
14
16
  safe_yaml (~> 1.0.0)
15
17
  diff-lcs (1.3)
18
+ dotenv (2.7.2)
16
19
  hashdiff (0.4.0)
17
20
  httparty (0.17.0)
18
21
  mime-types (~> 3.0)
@@ -20,6 +23,8 @@ GEM
20
23
  mime-types (3.2.2)
21
24
  mime-types-data (~> 3.2015)
22
25
  mime-types-data (3.2019.0331)
26
+ mongo (2.8.0)
27
+ bson (>= 4.4.2, < 5.0.0)
23
28
  multi_xml (0.6.0)
24
29
  public_suffix (4.0.1)
25
30
  rake (12.3.3)
@@ -48,6 +53,7 @@ PLATFORMS
48
53
 
49
54
  DEPENDENCIES
50
55
  byebug
56
+ dotenv
51
57
  estated!
52
58
  rake (~> 12.0)
53
59
  rspec (~> 3.0)
data/README.md CHANGED
@@ -22,6 +22,8 @@ Or install it yourself as:
22
22
 
23
23
  ### Configuration
24
24
 
25
+ #### API key
26
+
25
27
  ```ruby
26
28
  Estated.configure do |config|
27
29
  config.api_key = 'YOUR_API_KEY'
@@ -32,6 +34,19 @@ The API key can also be set through the `ESTATED_API_KEY` environment variable.
32
34
 
33
35
  In case the API key is set in the environment variable _and_ in the configuration block, the configuration will take precedence.
34
36
 
37
+ #### Request cache
38
+
39
+ <!-- TODO -->
40
+ ```ruby
41
+ Estated.configure do |config|
42
+ config.mongo_client = ...
43
+ config.mongo_collection = ...
44
+ config.cache_ttl = ... # in seconds
45
+ end
46
+
47
+ Estated::RequestCache.setup
48
+ ```
49
+
35
50
  ### Usage
36
51
 
37
52
  For documentation on parameters, please check the [Estated API docs](https://estated.com/developers/docs/v4/property/overview) on how to retrieve properties.
@@ -27,8 +27,10 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ["lib"]
28
28
 
29
29
  spec.add_dependency "httparty"
30
+ spec.add_dependency "mongo"
30
31
 
31
32
  spec.add_development_dependency "byebug"
33
+ spec.add_development_dependency "dotenv"
32
34
  spec.add_development_dependency "vcr"
33
35
  spec.add_development_dependency "webmock"
34
36
  end
@@ -1,5 +1,6 @@
1
1
  require 'estated/client'
2
2
  require 'estated/config'
3
+ require 'estated/request_cache'
3
4
  require 'estated/version'
4
5
 
5
6
  module Estated
@@ -14,4 +15,8 @@ module Estated
14
15
  def self.configure
15
16
  yield(config)
16
17
  end
18
+
19
+ def self.root
20
+ File.expand_path('../..', __FILE__)
21
+ end
17
22
  end
@@ -6,9 +6,35 @@ module Estated
6
6
 
7
7
  base_uri 'https://apis.estated.com/v4'
8
8
 
9
- def self.get_property(params)
10
- query = params.merge(token: Estated.config.api_key)
11
- self.get('/property', query: query).parsed_response
9
+ def self.get_property(params, skip_cache: false)
10
+ with_cache('/property', params, skip_cache: skip_cache) do
11
+ query = params.merge(token: Estated.config.api_key)
12
+ response = self.get('/property', query: query)
13
+
14
+ if response.parsed_response.is_a?(Hash)
15
+ json = response.parsed_response
16
+
17
+ # Don't cache if there's no data
18
+ [json, !!json['data']]
19
+ else
20
+ [{ 'response' => response }, false]
21
+ end
22
+ end
23
+ end
24
+
25
+ def self.with_cache(path, params, skip_cache:)
26
+ if !skip_cache && Estated.config.cache_enabled?
27
+ json = RequestCache.read(path, params)
28
+ return json if json
29
+ end
30
+
31
+ result, result_is_cacheable = yield
32
+
33
+ if Estated.config.cache_enabled? && result_is_cacheable
34
+ RequestCache.write(path, params, result)
35
+ end
36
+
37
+ result
12
38
  end
13
39
  end
14
40
  end
@@ -1,9 +1,18 @@
1
1
  module Estated
2
2
  class Config
3
- attr_writer :api_key
3
+ attr_writer :api_key, :cache_ttl
4
+ attr_accessor :mongo_client, :mongo_collection
5
+
6
+ def cache_ttl
7
+ @cache_ttl ||= 30 * 24 * 3600 # 30 days
8
+ end
4
9
 
5
10
  def api_key
6
11
  @api_key ||= ENV['ESTATED_API_KEY']
7
12
  end
13
+
14
+ def cache_enabled?
15
+ !!mongo_client
16
+ end
8
17
  end
9
18
  end
@@ -0,0 +1,53 @@
1
+ require 'mongo'
2
+
3
+ module Estated
4
+ class RequestCache
5
+ class << self
6
+ def read(path, params)
7
+ document = cache_store.
8
+ find(cache_key: cache_key(path, params)).
9
+ limit(1).
10
+ first
11
+
12
+ document['payload'] if document
13
+ end
14
+
15
+ def write(path, params, payload)
16
+ cache_store.update_one(
17
+ {
18
+ cache_key: cache_key(path, params)
19
+ },
20
+ {
21
+ cache_key: cache_key(path, params),
22
+ payload: payload,
23
+ created_at: Time.now
24
+ },
25
+ upsert: true
26
+ )
27
+ true
28
+ end
29
+
30
+ def setup
31
+ cache_store.indexes.create_one({ cache_key: 1 }, unique: true)
32
+ cache_store.indexes.create_one(
33
+ { created_at: 1 },
34
+ expire_after_seconds: Estated.config.cache_ttl)
35
+ end
36
+
37
+ private
38
+
39
+ def cache_store
40
+ Estated.config.mongo_client[Estated.config.mongo_collection]
41
+ end
42
+
43
+ def cache_key(path, params)
44
+ query = params.
45
+ sort_by { |k, _| k }.
46
+ map {|k, v| "#{k}=#{v}"}.
47
+ join('|')
48
+
49
+ "path=#{path}|" + query
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,3 +1,3 @@
1
1
  module Estated
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: estated
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex VKO
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2020-03-04 00:00:00.000000000 Z
13
+ date: 2020-03-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -26,6 +26,20 @@ dependencies:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
28
  version: '0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: mongo
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
29
43
  - !ruby/object:Gem::Dependency
30
44
  name: byebug
31
45
  requirement: !ruby/object:Gem::Requirement
@@ -40,6 +54,20 @@ dependencies:
40
54
  - - ">="
41
55
  - !ruby/object:Gem::Version
42
56
  version: '0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: dotenv
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
43
71
  - !ruby/object:Gem::Dependency
44
72
  name: vcr
45
73
  requirement: !ruby/object:Gem::Requirement
@@ -75,6 +103,7 @@ executables: []
75
103
  extensions: []
76
104
  extra_rdoc_files: []
77
105
  files:
106
+ - ".env.sample"
78
107
  - ".gitignore"
79
108
  - ".rspec"
80
109
  - ".travis.yml"
@@ -89,6 +118,7 @@ files:
89
118
  - lib/estated.rb
90
119
  - lib/estated/client.rb
91
120
  - lib/estated/config.rb
121
+ - lib/estated/request_cache.rb
92
122
  - lib/estated/version.rb
93
123
  homepage: https://github.com/navut/estated-ruby-client
94
124
  licenses: