airtable2 0.2.3 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +45 -16
- data/lib/airtable/base.rb +1 -1
- data/lib/airtable/field.rb +32 -0
- data/lib/airtable/record.rb +7 -9
- data/lib/airtable/table.rb +26 -13
- data/lib/airtable/version.rb +1 -1
- data/lib/airtable.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 289287db343e46821fa736305ee64eb1a9fc08a58c662b3877cf10643ea63737
|
4
|
+
data.tar.gz: b25cca2262cc2d91ff241fbd479c58efcebdc77cb95dbe9a869f19d990593e11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97493ce00abb1c1306f7c8d5efc0b0b0c21b9155a8f64458138e11e61b5fc9f504241137391f3bd4184fab4434d8bc0e11401407034a1ae5561b85cd64393fb5
|
7
|
+
data.tar.gz: 38f2292dc125c1f3cffb1c6a35f48ea79824029b1bd9d1b0824c09bbc8705a8b8c3791962f9bce4a9e7bd1105d3290b9b05740661cc82297815331cac028acfc
|
data/README.md
CHANGED
@@ -27,21 +27,38 @@ First, be sure to register for an [airtable](https://airtable.com) account, set
|
|
27
27
|
@client = Airtable::Client.new('your.token.goes.here')
|
28
28
|
```
|
29
29
|
|
30
|
-
###
|
30
|
+
### Simple Usage
|
31
|
+
|
32
|
+
#### Reading
|
31
33
|
|
32
34
|
Now we can access our base
|
33
35
|
|
34
36
|
```ruby
|
37
|
+
# Retrieve with a specific ID
|
35
38
|
@base = @client.base('appExAmPlE')
|
39
|
+
# or
|
40
|
+
@base = @client.bases.first
|
36
41
|
```
|
37
42
|
|
38
43
|
and its tables
|
39
44
|
|
40
45
|
```ruby
|
41
|
-
|
46
|
+
# Retrieve with a specific ID
|
47
|
+
@table = @base.table('tblExAmPle')
|
48
|
+
# or
|
49
|
+
@table = @base.tables.first
|
50
|
+
```
|
51
|
+
|
52
|
+
and a table's records,
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
# Retrieve with a specific ID
|
56
|
+
@record = @table.record('recExAmPle')
|
57
|
+
# or
|
58
|
+
@record = @table.records.first
|
42
59
|
```
|
43
60
|
|
44
|
-
|
61
|
+
so you can navigate the belongs_to/has_many relationships the way God intended:
|
45
62
|
|
46
63
|
```ruby
|
47
64
|
@record = @client.bases.first.tables.first.records.first
|
@@ -50,9 +67,15 @@ and a table's records, so you can navigate the belongs_to/has_many relationships
|
|
50
67
|
|
51
68
|
Note that objects' child records are memoized to avoid unnecessary API calls. If sensitive to stale data, be sure to use the objects instantiated most recently.
|
52
69
|
|
53
|
-
|
70
|
+
To get the fields of a table, its simply
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
@fields = @table.fields
|
74
|
+
```
|
75
|
+
|
76
|
+
#### Writing
|
54
77
|
|
55
|
-
Create a
|
78
|
+
Create a table in a base like so
|
56
79
|
|
57
80
|
```ruby
|
58
81
|
@table = @base.create_table({ name: 'Names', description: 'A list of names', fields: [{ name: 'name', type: 'singleLineText' }] })
|
@@ -64,32 +87,38 @@ You can update at a table's metadata with the `update` method:
|
|
64
87
|
@table.update({ description: 'Updated description' })
|
65
88
|
```
|
66
89
|
|
67
|
-
|
68
|
-
|
69
|
-
Once you have access to a table from above, we can query a set of records in the table with:
|
90
|
+
You can add a column to a table...
|
70
91
|
|
71
92
|
```ruby
|
72
|
-
@
|
93
|
+
@field = @table.add_field({'description': 'Whether I have visited this apartment yet.', 'name': 'Visited', 'type': 'checkbox', 'options': { 'color': 'greenBright', 'icon': 'check'} })
|
73
94
|
```
|
74
95
|
|
75
|
-
|
96
|
+
...and update it
|
97
|
+
|
98
|
+
```ruby
|
99
|
+
@field = @field.update({'description': 'Whether I have rented this apartment yet.', 'name': 'Rented'})
|
100
|
+
```
|
76
101
|
|
77
102
|
A single record or an array of records can be inserted using the `create_records` method on a table (max 10 at a time):
|
78
103
|
|
79
104
|
```ruby
|
105
|
+
# Single
|
80
106
|
@table.create_records({ 'Name': 'name value', 'Age': 35 })
|
107
|
+
# Array
|
108
|
+
@table.create_records([{ 'Name': 'name value', 'Age': 35 }, { 'Name': 'another name value', 'Age': 40 }])
|
81
109
|
```
|
82
110
|
|
83
|
-
|
84
|
-
|
85
|
-
A single record or an array of records can be destroyed by passing their ids to the `delete_records` method on a table:
|
111
|
+
A single record or an array of records can be destroyed by passing their ids to the `delete_records` method on a table (max 10 at a time):
|
86
112
|
|
87
113
|
```ruby
|
88
|
-
@
|
89
|
-
|
114
|
+
@records = @table.records
|
115
|
+
# Single
|
116
|
+
@table.delete_records(@records.first.id)
|
117
|
+
# Array
|
118
|
+
@table.delete_records(@records.map(&:ids))
|
90
119
|
```
|
91
120
|
|
92
|
-
Or as a convenience, you can delete all records with the `dump` method
|
121
|
+
Or as a convenience, you can delete all records with the `dump` method, which will abide by the API's rate limiting.
|
93
122
|
|
94
123
|
```ruby
|
95
124
|
@table.dump
|
data/lib/airtable/base.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Object corresponding to an Airtable Field
|
4
|
+
class Airtable::Field < Airtable::Resource
|
5
|
+
attr_reader :base, :table, :name, :type, :options
|
6
|
+
|
7
|
+
def initialize(token, table, id, data = nil)
|
8
|
+
super(token)
|
9
|
+
@table = table
|
10
|
+
@base = @table.base
|
11
|
+
@id = id
|
12
|
+
data&.each_key do |key|
|
13
|
+
instance_variable_set(:"@#{key}", data[key])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Airtable::Field]
|
18
|
+
# @see https://airtable.com/developers/web/api/update-field
|
19
|
+
def update(field_data)
|
20
|
+
response = self.class.patch(field_url,
|
21
|
+
body: field_data.to_json).parsed_response
|
22
|
+
|
23
|
+
check_and_raise_error(response)
|
24
|
+
|
25
|
+
Airtable::Field.new(@token, @table, response)
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
# Endpoint for tables
|
31
|
+
def field_url = "/v0/meta/bases/#{@base.id}/tables/#{@table.id}/fields/#{@id}"
|
32
|
+
end
|
data/lib/airtable/record.rb
CHANGED
@@ -2,10 +2,12 @@
|
|
2
2
|
|
3
3
|
# Object corresponding to an Airtable Record
|
4
4
|
class Airtable::Record < Airtable::Resource
|
5
|
-
|
5
|
+
attr_reader :table, :base
|
6
|
+
|
7
|
+
def initialize(token, table, id, data = nil)
|
6
8
|
super(token)
|
7
|
-
@
|
8
|
-
@
|
9
|
+
@table = table
|
10
|
+
@base = @table.base
|
9
11
|
@id = id
|
10
12
|
@data = data
|
11
13
|
end
|
@@ -23,10 +25,6 @@ class Airtable::Record < Airtable::Resource
|
|
23
25
|
end
|
24
26
|
end
|
25
27
|
|
26
|
-
# Instantiate record's table
|
27
|
-
# @return [Airtable::Table]
|
28
|
-
def table = Airtable::Table.new(token, @base_id, @table_id)
|
29
|
-
|
30
28
|
# @return [Airtable::Record]
|
31
29
|
# @see https://airtable.com/developers/web/api/update-record
|
32
30
|
def update(record_data)
|
@@ -35,11 +33,11 @@ class Airtable::Record < Airtable::Resource
|
|
35
33
|
|
36
34
|
check_and_raise_error(response)
|
37
35
|
|
38
|
-
Airtable::Record.new @token, @
|
36
|
+
Airtable::Record.new @token, @base.id, @table.id, response['id'], response
|
39
37
|
end
|
40
38
|
|
41
39
|
protected
|
42
40
|
|
43
41
|
# Endpoint for records
|
44
|
-
def record_url = "/v0/#{@
|
42
|
+
def record_url = "/v0/#{@base.id}/#{@table.id}/#{@id}"
|
45
43
|
end
|
data/lib/airtable/table.rb
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
# Object corresponding to an Airtable Table
|
4
4
|
class Airtable::Table < Airtable::Resource
|
5
|
-
attr_reader :name
|
5
|
+
attr_reader :name, :base
|
6
6
|
|
7
|
-
def initialize(token,
|
7
|
+
def initialize(token, base, id, data = nil)
|
8
8
|
super(token)
|
9
|
-
@
|
9
|
+
@base = base
|
10
10
|
@id = id
|
11
11
|
@data = data
|
12
12
|
end
|
@@ -16,9 +16,16 @@ class Airtable::Table < Airtable::Resource
|
|
16
16
|
# @see https://airtable.com/developers/web/api/get-base-schema
|
17
17
|
def data = @data ||= base.tables.find { _1.id == @id }.data
|
18
18
|
|
19
|
-
#
|
20
|
-
# @
|
21
|
-
def
|
19
|
+
# @return [Airtable::Field]
|
20
|
+
# @see https://airtable.com/developers/web/api/create-field
|
21
|
+
def create_field(field_data)
|
22
|
+
response = self.class.post("/v0/meta/bases/#{@base.id}/tables/#{@id}/fields",
|
23
|
+
body: field_data.to_json).parsed_response
|
24
|
+
|
25
|
+
check_and_raise_error(response)
|
26
|
+
|
27
|
+
Airtable::Field.new(@token, self, response['id'], response)
|
28
|
+
end
|
22
29
|
|
23
30
|
# @return [Array<Airtable::Record>]
|
24
31
|
# @see https://airtable.com/developers/web/api/list-records
|
@@ -28,24 +35,27 @@ class Airtable::Table < Airtable::Resource
|
|
28
35
|
|
29
36
|
check_and_raise_error(response)
|
30
37
|
|
31
|
-
response['records'].map { Airtable::Record.new(@token,
|
38
|
+
response['records'].map { Airtable::Record.new(@token, self, _1['id'], _1) }
|
32
39
|
end
|
33
40
|
end
|
34
41
|
|
42
|
+
# @return [Array<Airtable::Field>]
|
43
|
+
def fields = @fields ||= data['fields'].map { Airtable::Field.new(@token, self, _1['id'], _1) }
|
44
|
+
|
35
45
|
# Instantiate record in table
|
36
46
|
# @param record_id [String] ID of record
|
37
47
|
# @return [Airtable::Record]
|
38
|
-
def record(record_id) = Airtable::Record.new(@token, @
|
48
|
+
def record(record_id) = Airtable::Record.new(@token, @base.id, @id, record_id)
|
39
49
|
|
40
50
|
# @return [Airtable::Table]
|
41
51
|
# @see https://airtable.com/developers/web/api/update-table
|
42
52
|
def update(table_data)
|
43
|
-
response = self.class.patch("/v0/meta/bases/#{@
|
53
|
+
response = self.class.patch("/v0/meta/bases/#{@base.id}/tables/#{@id}",
|
44
54
|
body: table_data.to_json).parsed_response
|
45
55
|
|
46
56
|
check_and_raise_error(response)
|
47
57
|
|
48
|
-
Airtable::Table.new @token, @
|
58
|
+
Airtable::Table.new @token, @base.id, response['id'], response
|
49
59
|
end
|
50
60
|
|
51
61
|
# @param [Array] Record objects to create
|
@@ -58,7 +68,7 @@ class Airtable::Table < Airtable::Resource
|
|
58
68
|
|
59
69
|
check_and_raise_error(response)
|
60
70
|
|
61
|
-
response['records'].map { Airtable::Record.new(@token, @
|
71
|
+
response['records'].map { Airtable::Record.new(@token, @base.id, @id, _1['id'], _1) }
|
62
72
|
end
|
63
73
|
|
64
74
|
# @param [Array] IDs of records to delete
|
@@ -75,15 +85,18 @@ class Airtable::Table < Airtable::Resource
|
|
75
85
|
end
|
76
86
|
|
77
87
|
# Deletes all table's records
|
88
|
+
# @return [Integer] Number of deleted records
|
78
89
|
def dump
|
79
|
-
records.map(&:id)
|
90
|
+
ids = records.map(&:id)
|
91
|
+
ids.each_slice(10) do |record_id_set|
|
80
92
|
delete_records(record_id_set)
|
81
93
|
sleep(0.2)
|
82
94
|
end
|
95
|
+
ids.size
|
83
96
|
end
|
84
97
|
|
85
98
|
protected
|
86
99
|
|
87
100
|
# Endpoint for tables
|
88
|
-
def table_url = "/v0/#{@
|
101
|
+
def table_url = "/v0/#{@base.id}/#{@id}"
|
89
102
|
end
|
data/lib/airtable/version.rb
CHANGED
data/lib/airtable.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: airtable2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Seroff
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-10-
|
13
|
+
date: 2024-10-29 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: httparty
|
@@ -171,6 +171,7 @@ files:
|
|
171
171
|
- lib/airtable/base.rb
|
172
172
|
- lib/airtable/client.rb
|
173
173
|
- lib/airtable/error.rb
|
174
|
+
- lib/airtable/field.rb
|
174
175
|
- lib/airtable/record.rb
|
175
176
|
- lib/airtable/resource.rb
|
176
177
|
- lib/airtable/table.rb
|