remote_record 0.1.1 → 0.5.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: 0a0631c2b3e0edcedb6cbe8b8c82898fcf9fd2c7ccb79f3ed81e636d22c1d7e2
4
- data.tar.gz: 903e0ee0541c3f7165f117d5589977b45e6f99c2964541fcd130ebcc602913f2
3
+ metadata.gz: 4bf471bd03525a3f6dfdfedc1d88e2681264c85e98447607259fec7a94d56ddd
4
+ data.tar.gz: 076113352a325ee80c09cca58a00cdd8e703a584392319f008393fdae90ddbc2
5
5
  SHA512:
6
- metadata.gz: '0487c9c421d736e9bb4b3e65d105a7963339c3a05ceb30bf31ebe1fcda345e96aac094f8ed91deeacf3825534e1dbe3079f4a6c5abd40c3ca3c076a73dfa5f1a'
7
- data.tar.gz: dfb4cbeca331e5a3ff84465046d055aefb36f52662060b98ab221a385c395c06162e38062be007539594b6643d53e771a179882067377f94339117f256f5c84f
6
+ metadata.gz: 3dc11719e885adf6220ef9b351b1605943ce25220c3e95ee0ee8820175685783777ed7f1bd43f22249f83cb95e8031509e2b85f8be04b65dc33aaab0c4fdca22
7
+ data.tar.gz: 478180ddc5b281c7a9873313608ad62368f9c947125fd1095b1c61a88e9cce5147637ca1391c801a0af1c2f53e4ac34418256a38563893f926a4f55ee37d62b4
data/README.md CHANGED
@@ -1,6 +1,20 @@
1
- # RemoteRecord
1
+ ![RemoteRecord: Ready-made remote resource structures.](doc/header.svg)
2
2
 
3
- Ready-made remote resource structures.
3
+ ---
4
+
5
+ ![Remote Record](https://github.com/raisedevs/remote_record/workflows/Remote%20Record/badge.svg)
6
+ [![Gem Version](https://badge.fury.io/rb/remote_record.svg)](https://badge.fury.io/rb/remote_record)
7
+
8
+ Every API speaks a different language. Maybe it's REST, maybe it's SOAP, maybe
9
+ it's GraphQL. Maybe it's got its own Ruby client, or maybe you need to roll your
10
+ own. But what if you could just pretend it existed in your database?
11
+
12
+ RemoteRecord provides a consistent ActiveRecord inspired interface for all of
13
+ your application's APIs. Store remote resources by ID, and RemoteRecord will
14
+ auto-populate instances of your ActiveRecord model with their attributes from
15
+ the API. Whether you're dealing with a user on GitHub, a track on Spotify, a
16
+ place on Google Maps, or a resource on your internal infrastructure, you can use
17
+ RemoteRecord to wrap fetching it.
4
18
 
5
19
  ## Setup
6
20
 
@@ -109,3 +123,12 @@ By default, this'll only make a request on initialize. For services that manage
109
123
  caching by way of expiry or ETags, I recommend using `faraday-http-cache` for
110
124
  your clients and setting `memoize` to `false`. Remote Record will eventually
111
125
  gain support for caching.
126
+
127
+ ### Forcing a fresh request
128
+
129
+ You might want to force a fresh request in some instances, even if you're using
130
+ `memoize`. To do this, call `fresh` on a reference, and it'll be repopulated.
131
+
132
+ ### Skip fetching
133
+
134
+ You might not want to make a request on initialize sometimes. In this case, pass `fetching: false` to your query or `new` to make sure the resource isn't fetched.
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_support/concern'
4
+ require 'active_support/rescuable'
4
5
  require 'remote_record/base'
5
6
  require 'remote_record/class_lookup'
6
7
  require 'remote_record/config'
@@ -3,6 +3,8 @@
3
3
  module RemoteRecord
4
4
  # Remote record classes should inherit from this class and define #get.
5
5
  class Base
6
+ include ActiveSupport::Rescuable
7
+
6
8
  def self.default_config
7
9
  Config.defaults.merge(remote_record_class: self)
8
10
  end
@@ -34,8 +36,8 @@ module RemoteRecord
34
36
  private
35
37
 
36
38
  def transform(data)
37
- transformers.reduce(data) do |data, transformer|
38
- transformer.new(data).transform
39
+ transformers.reduce(data) do |transformed_data, transformer|
40
+ transformer.new(transformed_data).transform
39
41
  end
40
42
  end
41
43
 
@@ -25,8 +25,13 @@ module RemoteRecord
25
25
  end
26
26
  end
27
27
 
28
+ # rubocop:disable Metrics/BlockLength
28
29
  included do
30
+ include ActiveSupport::Rescuable
31
+ attr_accessor :fetching
32
+
29
33
  after_initialize do |reference|
34
+ reference.fetching = true if reference.fetching.nil?
30
35
  config = reference.class.remote_record_class.default_config.merge(
31
36
  reference.class.remote_record_config.to_h
32
37
  )
@@ -39,20 +44,22 @@ module RemoteRecord
39
44
  def method_missing(method_name, *_args, &_block)
40
45
  fetch_remote_resource unless @remote_record_config.memoize
41
46
 
42
- @instance.public_send(method_name)
47
+ instance.public_send(method_name)
43
48
  end
44
49
 
45
50
  def respond_to_missing?(method_name, _include_private = false)
46
51
  instance.respond_to?(method_name, false)
47
52
  end
48
53
 
49
- def initialize(**args)
50
- @attrs = HashWithIndifferentAccess.new
51
- super
54
+ def fetch_remote_resource
55
+ instance.fetch if fetching
56
+ rescue Exception => e # rubocop:disable Lint/RescueException
57
+ rescue_with_handler(e) || raise
52
58
  end
53
59
 
54
- def fetch_remote_resource
60
+ def fresh
55
61
  instance.fetch
62
+ self
56
63
  end
57
64
 
58
65
  private
@@ -61,5 +68,6 @@ module RemoteRecord
61
68
  @instance ||= @remote_record_config.remote_record_class.new(self, @remote_record_config)
62
69
  end
63
70
  end
71
+ # rubocop:enable Metrics/BlockLength
64
72
  end
65
73
  end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'remote_record/transformers/base'
2
4
  require 'remote_record/transformers/snake_case'
3
5
 
4
6
  module RemoteRecord
7
+ # Classes responsible for transforming the hash of data returned by API calls.
5
8
  module Transformers
6
-
7
9
  end
8
10
  end
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RemoteRecord
2
4
  module Transformers
5
+ # Base transformer class. Inherit from this and implement `#transform`.
3
6
  class Base
4
7
  def initialize(data)
5
8
  @data = data
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RemoteRecord
2
4
  module Transformers
3
5
  # Converts keys to snake case.
@@ -19,8 +21,8 @@ module RemoteRecord
19
21
  end
20
22
  end
21
23
 
22
- def underscore_key(k)
23
- k.to_s.underscore.to_sym
24
+ def underscore_key(key)
25
+ key.to_s.underscore.to_sym
24
26
  end
25
27
  end
26
28
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RemoteRecord
4
- VERSION = '0.1.1'
4
+ VERSION = '0.5.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: remote_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Fish
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-12-03 00:00:00.000000000 Z
12
+ date: 2021-01-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord