airrecord 1.0.3 → 1.0.7

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: 0a4dcc6bb1ab38c832a2a47375709f336a339aeb6ce8a59f444aef7d0a593907
4
- data.tar.gz: 4832ad61f71311634e3b55abeaa14ed235e714e86352f69ef2590ec8688d59c3
3
+ metadata.gz: deb117e05bbf701e4e1e60cf3cccc659a173c7d4f1fc5cb6f80ee72af5603b0e
4
+ data.tar.gz: a4e928fbd33774f2d41508136da24e56eb2687775c2b962912df86e99eb34bdf
5
5
  SHA512:
6
- metadata.gz: f9e3cad6f957ddc9beec914906e9ab9d975c30192042eeb7c445578d91a456008ebdec96ebbb2fcb8c0dfde750bf0c77d0642b5b059997c6d5105a1882a65fa0
7
- data.tar.gz: 07cf5860116e8b50b05608bcb584517b0f9161ee08b1d7c54c9329a3bfb29f35d6e862e1944ada726f27c413652f5bf8b233fd0b44107eaf9e557885f39cac09
6
+ metadata.gz: 890dbffd8a3489d505db3da5149cefeb85acbee754d0cc39a9ecf15e5d38b145735df895de9a16a747e20a0b92ae533e01a954e21220d0e044beb7e73ddc3c3e
7
+ data.tar.gz: 518f7f4cbc0559bb20931ba39a7c000a5ed632075ebd6ce41ff4555334c5c31251256b1f92105d8cd44b21b93b79e52e6b820ab2f5875bbd26a219dd3334967b
data/.travis.yml CHANGED
@@ -1,4 +1,5 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.3.3
4
+ - 2.7.2
5
+ - 3.0.0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ # 1.0.7
2
+
3
+ * Further Ruby 3 compatibility, in particular with Faraday (#83)
4
+
5
+ # 1.0.6
6
+
7
+ * Ruby 3 compatibility
8
+
9
+ # 1.0.5
10
+
11
+ * Allow Faraday 1.0 (#70)
12
+
13
+ # 1.0.4
14
+
15
+ * Correctly set `created_at` on `#find` (#68)
16
+
1
17
  # 1.0.3
2
18
 
3
19
  * Allow passing optional parameters, e.g. `typecast: true`. (#67)
data/README.md CHANGED
@@ -255,6 +255,8 @@ tea["Village"] = "Feng Gang"
255
255
  tea.save # persist to Airtable
256
256
  ```
257
257
 
258
+ _Airtable's API doesn't allow you to change attachment's filename. As a workaround you can delete the original attachment and [upload a new one](https://github.com/sirupsen/airrecord#file-uploads) with the original URL and a new filename._
259
+
258
260
  ### Deleting
259
261
 
260
262
  An instantiated record can be deleted through `#destroy`:
data/airrecord.gemspec CHANGED
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'airrecord/version'
@@ -18,13 +19,13 @@ Gem::Specification.new do |spec|
18
19
  spec.bindir = "exe"
19
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
21
  spec.require_paths = ["lib"]
21
- spec.required_ruby_version = '>= 2.2'
22
+ spec.required_ruby_version = ">= 2.2"
22
23
 
23
- spec.add_dependency 'faraday', '~> 0.10'
24
- spec.add_dependency "net-http-persistent", '>= 2.9'
24
+ spec.add_dependency "faraday", [">= 0.10", "< 2.0"]
25
+ spec.add_dependency "net-http-persistent"
25
26
 
26
- spec.add_development_dependency "bundler", "~> 2.1.2"
27
- spec.add_development_dependency "rake", "~> 10.0"
28
- spec.add_development_dependency "minitest", "~> 5.0"
27
+ spec.add_development_dependency "bundler", "~> 2"
29
28
  spec.add_development_dependency "byebug"
29
+ spec.add_development_dependency "minitest", "~> 5.0"
30
+ spec.add_development_dependency "rake", "~> 10.0"
30
31
  end
@@ -0,0 +1,9 @@
1
+ require 'airrecord'
2
+
3
+ Tea = Airrecord.table(
4
+ ENV["AIRTABLE_TOKEN"],
5
+ "appZJC9q8TBYPDF7j",
6
+ "Teas"
7
+ )
8
+
9
+ p Tea.all
data/lib/airrecord.rb CHANGED
@@ -7,12 +7,13 @@ require "airrecord/table"
7
7
 
8
8
  module Airrecord
9
9
  extend self
10
+ attr_accessor :api_key, :throttle
11
+
10
12
  Error = Class.new(StandardError)
11
- attr_accessor :api_key
12
- attr_accessor :throttle
13
13
 
14
14
  def throttle?
15
15
  return true if @throttle.nil?
16
+
16
17
  @throttle
17
18
  end
18
19
  end
@@ -23,13 +23,13 @@ module Airrecord
23
23
  "User-Agent" => "Airrecord/#{Airrecord::VERSION}",
24
24
  "X-API-VERSION" => "0.1.0",
25
25
  },
26
- request: { params_encoder: Airrecord::QueryString },
27
- ) { |conn|
26
+ request: { params_encoder: Airrecord::QueryString }
27
+ ) do |conn|
28
28
  if Airrecord.throttle?
29
29
  conn.request :airrecord_rate_limiter, requests_per_second: AIRTABLE_RPS_LIMIT
30
30
  end
31
31
  conn.adapter :net_http_persistent
32
- }
32
+ end
33
33
  end
34
34
 
35
35
  def escape(*args)
@@ -37,6 +37,7 @@ module Airrecord
37
37
  def too_many_requests_in_last_second?
38
38
  return false unless @rps
39
39
  return false unless requests.size >= @rps
40
+
40
41
  window_span < 1.0
41
42
  end
42
43
 
@@ -56,5 +57,5 @@ end
56
57
 
57
58
  Faraday::Request.register_middleware(
58
59
  # Avoid polluting the global middleware namespace with a prefix.
59
- :airrecord_rate_limiter => Airrecord::FaradayRateLimiter
60
+ airrecord_rate_limiter: Airrecord::FaradayRateLimiter
60
61
  )
@@ -25,16 +25,16 @@ module Airrecord
25
25
  end
26
26
 
27
27
  TYPES = {
28
- Array => lambda { |prefix, array|
28
+ Array => lambda do |prefix, array|
29
29
  array.each_with_index.map do |value, index|
30
30
  self[value].call("#{prefix}[#{index}]", value)
31
31
  end
32
- },
33
- Hash => lambda { |prefix, hash|
32
+ end,
33
+ Hash => lambda do |prefix, hash|
34
34
  hash.map do |key, value|
35
35
  self[value].call("#{prefix}[#{key}]", value)
36
36
  end
37
- },
37
+ end
38
38
  }.freeze
39
39
 
40
40
  DEFAULT = lambda do |key, value|
@@ -1,3 +1,5 @@
1
+ require 'rubygems' # For Gem::Version
2
+
1
3
  module Airrecord
2
4
  class Table
3
5
  class << self
@@ -15,7 +17,7 @@ module Airrecord
15
17
 
16
18
  def has_many(method_name, options)
17
19
  define_method(method_name.to_sym) do
18
- # Get association ids in reverse order, because Airtables UI and API
20
+ # Get association ids in reverse order, because Airtable's UI and API
19
21
  # sort associations in opposite directions. We want to match the UI.
20
22
  ids = (self[options.fetch(:column)] || []).reverse
21
23
  table = Kernel.const_get(options.fetch(:class))
@@ -40,7 +42,7 @@ module Airrecord
40
42
  parsed_response = client.parse(response.body)
41
43
 
42
44
  if response.success?
43
- self.new(parsed_response["fields"], id: id)
45
+ self.new(parsed_response["fields"], id: id, created_at: parsed_response["createdTime"])
44
46
  else
45
47
  client.handle_error(response.status, parsed_response)
46
48
  end
@@ -54,7 +56,7 @@ module Airrecord
54
56
  records(filter: formula).sort_by { |record| or_args.index(record.id) }
55
57
  end
56
58
 
57
- def create(fields, options={})
59
+ def create(fields, options = {})
58
60
  new(fields).tap { |record| record.save(options) }
59
61
  end
60
62
 
@@ -102,15 +104,25 @@ module Airrecord
102
104
  client.handle_error(response.status, parsed_response)
103
105
  end
104
106
  end
105
- alias_method :all, :records
107
+ alias all records
106
108
  end
107
109
 
108
110
  attr_reader :fields, :id, :created_at, :updated_keys
109
111
 
110
- def initialize(fields, id: nil, created_at: nil)
111
- @id = id
112
- self.created_at = created_at
113
- self.fields = fields
112
+ # This is an awkward definition for Ruby 3 to remain backwards compatible.
113
+ # It's easier to read by reading the 2.x definition below.
114
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.0.0")
115
+ def initialize(*one, **two)
116
+ @id = one.first && two.delete(:id)
117
+ self.created_at = one.first && two.delete(:created_at)
118
+ self.fields = one.first || two
119
+ end
120
+ else
121
+ def initialize(fields, id: nil, created_at: nil)
122
+ @id = id
123
+ self.created_at = created_at
124
+ self.fields = fields
125
+ end
114
126
  end
115
127
 
116
128
  def new_record?
@@ -125,16 +137,17 @@ module Airrecord
125
137
  def []=(key, value)
126
138
  validate_key(key)
127
139
  return if fields[key] == value # no-op
140
+
128
141
  @updated_keys << key
129
142
  fields[key] = value
130
143
  end
131
144
 
132
- def create(options={})
145
+ def create(options = {})
133
146
  raise Error, "Record already exists (record has an id)" unless new_record?
134
147
 
135
148
  body = {
136
149
  fields: serializable_fields,
137
- **options,
150
+ **options
138
151
  }.to_json
139
152
 
140
153
  response = client.connection.post("/v0/#{self.class.base_key}/#{client.escape(self.class.table_name)}", body, { 'Content-Type' => 'application/json' })
@@ -149,9 +162,8 @@ module Airrecord
149
162
  end
150
163
  end
151
164
 
152
- def save(options={})
165
+ def save(options = {})
153
166
  return create(options) if new_record?
154
-
155
167
  return true if @updated_keys.empty?
156
168
 
157
169
  # To avoid trying to update computed fields we *always* use PATCH
@@ -159,7 +171,7 @@ module Airrecord
159
171
  fields: Hash[@updated_keys.map { |key|
160
172
  [key, fields[key]]
161
173
  }],
162
- **options,
174
+ **options
163
175
  }.to_json
164
176
 
165
177
  response = client.connection.patch("/v0/#{self.class.base_key}/#{client.escape(self.class.table_name)}/#{self.id}", body, { 'Content-Type' => 'application/json' })
@@ -193,8 +205,7 @@ module Airrecord
193
205
  self.class == other.class &&
194
206
  serializable_fields == other.serializable_fields
195
207
  end
196
-
197
- alias_method :eql?, :==
208
+ alias eql? ==
198
209
 
199
210
  def hash
200
211
  serializable_fields.hash
@@ -209,6 +220,7 @@ module Airrecord
209
220
 
210
221
  def created_at=(created_at)
211
222
  return unless created_at
223
+
212
224
  @created_at = Time.parse(created_at)
213
225
  end
214
226
 
@@ -218,6 +230,7 @@ module Airrecord
218
230
 
219
231
  def validate_key(key)
220
232
  return true unless key.is_a?(Symbol)
233
+
221
234
  raise(Error, [
222
235
  "Airrecord 1.0 dropped support for Symbols as field names.",
223
236
  "Please use the raw field name, a String, instead.",
@@ -1,3 +1,3 @@
1
1
  module Airrecord
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.7"
3
3
  end
metadata CHANGED
@@ -1,71 +1,77 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airrecord
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Eskildsen
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-28 00:00:00.000000000 Z
11
+ date: 2021-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0.10'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: '0.10'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: net-http-persistent
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - ">="
32
38
  - !ruby/object:Gem::Version
33
- version: '2.9'
39
+ version: '0'
34
40
  type: :runtime
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
44
  - - ">="
39
45
  - !ruby/object:Gem::Version
40
- version: '2.9'
46
+ version: '0'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: bundler
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
51
  - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: 2.1.2
53
+ version: '2'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
58
  - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: 2.1.2
60
+ version: '2'
55
61
  - !ruby/object:Gem::Dependency
56
- name: rake
62
+ name: byebug
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
- - - "~>"
65
+ - - ">="
60
66
  - !ruby/object:Gem::Version
61
- version: '10.0'
67
+ version: '0'
62
68
  type: :development
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
- - - "~>"
72
+ - - ">="
67
73
  - !ruby/object:Gem::Version
68
- version: '10.0'
74
+ version: '0'
69
75
  - !ruby/object:Gem::Dependency
70
76
  name: minitest
71
77
  requirement: !ruby/object:Gem::Requirement
@@ -81,19 +87,19 @@ dependencies:
81
87
  - !ruby/object:Gem::Version
82
88
  version: '5.0'
83
89
  - !ruby/object:Gem::Dependency
84
- name: byebug
90
+ name: rake
85
91
  requirement: !ruby/object:Gem::Requirement
86
92
  requirements:
87
- - - ">="
93
+ - - "~>"
88
94
  - !ruby/object:Gem::Version
89
- version: '0'
95
+ version: '10.0'
90
96
  type: :development
91
97
  prerelease: false
92
98
  version_requirements: !ruby/object:Gem::Requirement
93
99
  requirements:
94
- - - ">="
100
+ - - "~>"
95
101
  - !ruby/object:Gem::Version
96
- version: '0'
102
+ version: '10.0'
97
103
  description: Airtable client to make Airtable interactions a breeze
98
104
  email:
99
105
  - sirup@sirupsen.com
@@ -110,6 +116,7 @@ files:
110
116
  - Rakefile
111
117
  - airrecord.gemspec
112
118
  - bin/console
119
+ - bin/production-test.rb
113
120
  - bin/setup
114
121
  - lib/airrecord.rb
115
122
  - lib/airrecord/client.rb
@@ -121,7 +128,7 @@ homepage: https://github.com/sirupsen/airrecord
121
128
  licenses:
122
129
  - MIT
123
130
  metadata: {}
124
- post_install_message:
131
+ post_install_message:
125
132
  rdoc_options: []
126
133
  require_paths:
127
134
  - lib
@@ -136,8 +143,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
143
  - !ruby/object:Gem::Version
137
144
  version: '0'
138
145
  requirements: []
139
- rubygems_version: 3.0.3
140
- signing_key:
146
+ rubygems_version: 3.2.15
147
+ signing_key:
141
148
  specification_version: 4
142
149
  summary: Airtable client
143
150
  test_files: []