Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,6 @@ tmp
*.a
mkmf.log
.DS_Store
.idea
.env.docker
*.log
1 change: 1 addition & 0 deletions .rspec
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
--require spec_helper
11 changes: 11 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
AllCops:
Exclude:
- 'spec/**/*'
TargetRubyVersion: 2.1
Metrics/LineLength:
Max: 100
Metrics/ClassLength:
Exclude:
- "lib/airtable/entity/table.rb"
Metrics/AbcSize:
Max: 16
5 changes: 5 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
FROM ruby:2.4.2

ENV LIB_HOME /home/lib

WORKDIR $LIB_HOME
2 changes: 2 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@ source 'https://rubygems.org'

# Specify your gem's dependencies in airtable.gemspec
gemspec

gem 'pry'
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is pry needed here?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Its for development purposes. Really helpful. Gemfile is not pushed to the gem file so used only for development environment of gem file only.

92 changes: 75 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,29 +35,45 @@ First, be sure to register for an [airtable](https://airtable.com) account, crea
@client = Airtable::Client.new("keyPCx5W")
```

Also you can have `AIRTABLE_KEY` environment variable which is your API key.

```ruby
# if you have AIRTABLE_KEY variable
@client = Airtable::Client.new
```

Your API key carries the same privileges as your user account, so be sure to keep it secret!

### Accessing a Base

Now we can access any base in our Airtable account by referencing the [API docs](https://airtable.com/api):

```ruby
# Pass in the base id
@base = @client.table("appPo84QuCy2BPgLk")
```

### Accessing a Table

Now we can access any table in our Airsheet account by referencing the [API docs](https://airtable.com/api):
Now we can access any table in our Airtable account by referencing the [API docs](https://airtable.com/api):

```ruby
# Pass in the app key and table name
@table = @client.table("appPo84QuCy2BPgLk", "Table Name")
# Pass in the table name
@table = @base.table("Table Name")
```

### Querying Records
### Batch Querying All Records

Once you have access to a table from above, we can query a set of records in the table with:

```ruby
@records = @table.records
@records = @table.select
```

We can specify a `sort` order, `limit`, and `offset` as part of our query:
We can specify a `sort` order, `per_page`, `max_records` and `offset` as part of our query:

```ruby
@records = @table.records(:sort => ["Name", :asc], :limit => 50)
@records = @table.records(:sort => ["Name", :asc], :page_size => 50)
@records # => [#<Airtable::Record :name=>"Bill Lowry", :email=>"[email protected]">, ...]
@records.offset #=> "itrEN2TCbrcSN2BMs"
```
Expand All @@ -72,16 +88,6 @@ This will return the records based on the query as well as an `offset` for the n
@bill[:email] # => "[email protected]"
```

Note that you can only request a maximimum of 100 records in a single query. To retrieve more records, use the "batch" feature below.

### Batch Querying All Records

We can also query all records in the table through a series of batch requests with:

```ruby
@records = @table.all(:sort => ["Name", :asc])
```

This executes a variable number of network requests (100 records per batch) to retrieve all records in a sheet.

### Finding a Record
Expand Down Expand Up @@ -121,6 +127,58 @@ Records can be destroyed using the `destroy` method on a table:
@table.destroy(record)
```

## Command Line Tool

This gem includes a simple command line tool which shows the basic functionality of the service.

```
$ airtable
Usage: airtable operation options

Common options:
-k, --api_key=KEY Airtable API key
-t, --table NAME Table Name
-b, --base BASE_ID Base ID
-r, --record RECORD_ID Record ID
-f, --field FIELD_NAME Field name to update or read
-v, --value VALUE Field value for update

Supported Operations:
get - Get Record/Field
update - Update Field

Examples:
airtable get -B Base -t Table
airtable get -B Base -t Table -r RECORD_ID
airtable get -B Base -t Table -f FIELD_NAME
airtable get -B Base -t Table -f FIELD_NAME -r RECORD_ID
airtable update -b Base -t table -r RECORD_ID -f FIELD_NAME -v newValue

-h, --help Show this message
--version Show version
```

### Get record's JSON

```
$ airtable get -b base_id -t Table -r record_id
{"id":"record_id","fields":{...},"createdTime":"2015-11-11 23:05:58 UTC"}
```

### Get record's field value

```
$ airtable get -b base_id -t Table -r record_id -f field_name
FIELD_VALUE
```

### Update record's field value

```
$ airtable update -b base_id -t Table -r record_id -f field_name -v NEW_VALUE
OK
```

## Contributing

1. Fork it ( https://github.com/nesquena/airtable-ruby/fork )
Expand Down
20 changes: 15 additions & 5 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
require "bundler/gem_tasks"
require 'rake/testtask'
require 'bundler'
Bundler.setup
Bundler::GemHelper.install_tasks

Rake::TestTask.new do |t|
t.libs << 'test'
t.pattern = "test/*_test.rb"
require 'rspec/core/rake_task'

desc 'Run all tests'
RSpec::Core::RakeTask.new(:spec) do |t|
t.ruby_opts = %w[-w]
end

desc 'Run RuboCop on the lib directory'
task :rubocop do
sh 'bundle exec rubocop lib'
end

task default: %i[spec rubocop]
41 changes: 21 additions & 20 deletions airtable.gemspec
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'airtable/version'

Gem::Specification.new do |spec|
spec.name = "airtable"
spec.version = Airtable::VERSION
spec.authors = ["Nathan Esquenazi", "Alexander Sorokin"]
spec.email = ["[email protected]", "[email protected]"]
spec.summary = %q{Easily connect to airtable data using ruby}
spec.description = %q{Easily connect to airtable data using ruby with access to all of the airtable features.}
spec.homepage = "https://github.com/nesquena/airtable-ruby"
spec.license = "MIT"
spec.name = 'airtable'
spec.version = Airtable::VERSION
spec.authors = ['Nathan Esquenazi', 'Alexander Sorokin', 'Oleksandr Simonov']
spec.email = ['[email protected]', '[email protected]', '[email protected]']
spec.summary = 'Easily connect to airtable data using ruby'
spec.description = 'Easily connect to airtable data using ruby with access to all of the airtable features.'
spec.homepage = 'https://github.com/nesquena/airtable-ruby'
spec.license = 'MIT'

spec.files = `git ls-files -z`.split("\x0")
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
spec.files = `git ls-files -z`.split("\x0")
spec.bindir = 'exe'
spec.executables = `git ls-files -- exe/*`.split("\n").map {|f| File.basename(f)}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is exe/ better than bin/ ?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ['lib']
spec.required_ruby_version = '>= 2.0.0'

spec.add_dependency "httparty", "~> 0.14.0"
spec.add_dependency "activesupport", ">= 3.0"

spec.add_development_dependency "bundler", "~> 1.6"
spec.add_development_dependency "rake"
spec.add_development_dependency "minitest", "~> 5.6.0"
spec.add_development_dependency "webmock", "~> 2.1.0"
spec.add_development_dependency 'bundler', '~> 1.6'
spec.add_development_dependency 'rake'
spec.add_development_dependency 'rspec', '~> 3.7'
spec.add_development_dependency 'rubocop', '~> 0.51'
spec.add_development_dependency 'simplecov', '~> 0.15'
spec.add_development_dependency 'vcr', '~> 4.0'
spec.add_development_dependency 'webmock', '~> 3.1'
end
15 changes: 15 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
version: '2.1'
volumes:
app-gems:
driver: local
services:
lib:
build:
context: .
dockerfile: Dockerfile
env_file:
- .env.docker
volumes:
- app-gems:/usr/local/bundle
- .:/home/lib

5 changes: 5 additions & 0 deletions exe/airtable
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/usr/bin/env ruby
$stderr.sync = true
require 'airtable'
require 'airtable/cli'
::Airtable::CLI.new(ARGV).start
48 changes: 39 additions & 9 deletions lib/airtable.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,41 @@
require 'httparty'
require 'delegate'
require 'active_support/core_ext/hash'

require 'airtable/version'
require 'airtable/resource'
require 'airtable/record'
require 'airtable/record_set'
require 'airtable/table'
require 'logger'

# Airtable wrapper library
module Airtable
class << self
DEFAULT_URL = 'https://api.airtable.com/v0'.freeze
attr_writer :log_path

def debug?
!ENV['DEBUG'].nil?
end

def log_path
@log_path ||= 'airtable.log'
end

def logger
@logger ||= ::Logger.new(@log_path)
end

def server_url
@server_url ||= ENV.fetch('AIRTABLE_ENDPOINT_URL') { DEFAULT_URL }
end

def reset!
@log_path = nil
@logger = nil
@server_url = nil
end
end
end

require 'airtable/response'
require 'airtable/request'
require 'airtable/entity'
require 'airtable/client'
require 'airtable/error'

# require 'airtable/resource'
# require 'airtable/record'
# require 'airtable/record_set'
Loading