estated 0.2.0 → 0.3.0

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