airtable 0.0.2 → 0.0.3

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
  SHA1:
3
- metadata.gz: 44001bc278b32cb324d355c6e89ef3ef0daee53b
4
- data.tar.gz: f35bd0c0a6ce9b427684625d5e314913677b9e19
3
+ metadata.gz: 67239aa74286bc438bd259bca768866f807d65c6
4
+ data.tar.gz: d62daaec49b37d8e881f199989cb8522fc3526f5
5
5
  SHA512:
6
- metadata.gz: f530c2ede4381894784a64eb3a4a13e6e7d77ffe632388939d84baea2bc361fe53393888e868781a7aec564e5361b664fa8466aefc3249309019451e079c6521
7
- data.tar.gz: 1466e6989283a7475819b94b34bd819fb9e2e8345fdded5538abee6f011a48897c815294e39a142617a4ba06eec72f8296d671cda69c306a670fa41e53377089
6
+ metadata.gz: b6169dd1faf0dae55dc2792b7ba42115a8d73c8497f230c8d00825feb64ffeebb67b455cafb0c5d064ceb9a11bbc0aba2c140fca45a8de5b6aaf2db592a3102f
7
+ data.tar.gz: 99c83f64005e54e67fd48a11633ce860897a3fed6fdb757a26641e6ae02b123218387655e3c238dcfd3e41ffb3fa086c6c76fb86eb66cc91ffcc9ae8b6a27a2e
data/README.md CHANGED
@@ -91,7 +91,7 @@ Records can be inserted using the `create` method on a table:
91
91
 
92
92
  ```ruby
93
93
  @record = Airtable::Record.new(:name => "Sarah Jaine", :email => "sarah@jaine.com")
94
- @table.create(record)
94
+ @table.create(@record)
95
95
  # => #<Airtable::Record :name=>"Sarah Jaine", :email=>"sarah@jaine.com", :id=>"rec03sKOVIzU65eV4">
96
96
  ```
97
97
 
@@ -23,4 +23,5 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "rake"
24
24
  spec.add_development_dependency "minitest", "~> 5.6.0"
25
25
  spec.add_development_dependency "fakeweb", "~> 1.3"
26
+ spec.add_development_dependency "activesupport", ">= 3.0"
26
27
  end
@@ -2,9 +2,7 @@ module Airtable
2
2
 
3
3
  class Record
4
4
  def initialize(attrs={})
5
- @columns_map = attrs.keys
6
- @attrs = HashWithIndifferentAccess.new(Hash[attrs.map { |k, v| [ to_key(k), v ] }])
7
- @attrs.map { |k, v| define_accessor(k) }
5
+ override_attributes!(attrs)
8
6
  end
9
7
 
10
8
  def id; @attrs["id"]; end
@@ -28,10 +26,16 @@ module Airtable
28
26
  # Hash of attributes with underscored column names
29
27
  def attributes; @attrs; end
30
28
 
29
+ # Removes old and add new attributes for the record
30
+ def override_attributes!(attrs={})
31
+ @columns_map = attrs.keys
32
+ @attrs = HashWithIndifferentAccess.new(Hash[attrs.map { |k, v| [ to_key(k), v ] }])
33
+ @attrs.map { |k, v| define_accessor(k) }
34
+ end
35
+
31
36
  # Hash with keys based on airtable original column names
32
37
  def fields; Hash[@columns_map.map { |k| [ k, @attrs[to_key(k)] ] }]; end
33
38
 
34
-
35
39
  def method_missing(name, *args, &blk)
36
40
  # Accessor for attributes
37
41
  if args.empty? && blk.nil? && @attrs.has_key?(name)
@@ -30,7 +30,7 @@ module Airtable
30
30
  # Returns record based given row id
31
31
  def find(id)
32
32
  result = self.class.get(worksheet_url + "/" + id).parsed_response
33
- Record.new(result["fields"].merge("id" => result["id"])) if result.present? && result["id"]
33
+ Record.new(result_attributes(result)) if result.present? && result["id"]
34
34
  end
35
35
 
36
36
  # Creates a record by posting to airtable
@@ -39,7 +39,7 @@ module Airtable
39
39
  :body => { "fields" => record.fields }.to_json,
40
40
  :headers => { "Content-type" => "application/json" }).parsed_response
41
41
  if result.present? && result["id"].present?
42
- record.id = result["id"]
42
+ record.override_attributes!(result_attributes(result))
43
43
  record
44
44
  else # failed
45
45
  false
@@ -48,10 +48,11 @@ module Airtable
48
48
 
49
49
  # Replaces record in airtable based on id
50
50
  def update(record)
51
- result = self.class.put(worksheet_url + "/" + id,
51
+ result = self.class.put(worksheet_url + "/" + record.id,
52
52
  :body => { "fields" => record.fields }.to_json,
53
53
  :headers => { "Content-type" => "application/json" }).parsed_response
54
54
  if result.present? && result["id"].present?
55
+ record.override_attributes!(result_attributes(result))
55
56
  record
56
57
  else # failed
57
58
  false
@@ -65,6 +66,10 @@ module Airtable
65
66
 
66
67
  protected
67
68
 
69
+ def result_attributes(res)
70
+ res["fields"].merge("id" => res["id"]) if res.present? && res["id"]
71
+ end
72
+
68
73
  def worksheet_url
69
74
  "/#{app_token}/#{URI.encode(worksheet_name)}"
70
75
  end
@@ -1,3 +1,3 @@
1
1
  module Airtable
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -16,10 +16,31 @@ describe Airtable do
16
16
  end
17
17
 
18
18
  it "should fetch record set" do
19
- stub_airtable_response("https://api.airtable.com/v0/#{@app_key}/#{@sheet_name}", { "records" => [], "offset" => "abcde" })
19
+ stub_airtable_response!("https://api.airtable.com/v0/#{@app_key}/#{@sheet_name}", { "records" => [], "offset" => "abcde" })
20
20
  @table = Airtable::Client.new(@client_key).table(@app_key, @sheet_name)
21
21
  @records = @table.records
22
22
  assert_equal "abcde", @records.offset
23
23
  end
24
+
25
+ it "should allow creating records" do
26
+ stub_airtable_response!("https://api.airtable.com/v0/#{@app_key}/#{@sheet_name}",
27
+ { "fields" => { "name" => "Sarah Jaine", "email" => "sarah@jaine.com", "foo" => "bar" }, "id" => "12345" }, :post)
28
+ table = Airtable::Client.new(@client_key).table(@app_key, @sheet_name)
29
+ record = Airtable::Record.new(:name => "Sarah Jaine", :email => "sarah@jaine.com")
30
+ table.create(record)
31
+ assert_equal "12345", record["id"]
32
+ assert_equal "bar", record["foo"]
33
+ end
34
+
35
+ it "should allow updating records" do
36
+ record_id = "12345"
37
+ stub_airtable_response!("https://api.airtable.com/v0/#{@app_key}/#{@sheet_name}/#{record_id}",
38
+ { "fields" => { "name" => "Sarah Jaine", "email" => "sarah@jaine.com", "foo" => "bar" }, "id" => record_id }, :put)
39
+ table = Airtable::Client.new(@client_key).table(@app_key, @sheet_name)
40
+ record = Airtable::Record.new(:name => "Sarah Jaine", :email => "sarah@jaine.com", :id => record_id)
41
+ table.update(record)
42
+ assert_equal "12345", record["id"]
43
+ assert_equal "bar", record["foo"]
44
+ end
24
45
  end # describe Airtable
25
46
  end # Airtable
@@ -2,9 +2,11 @@ require 'airtable'
2
2
  require 'fakeweb'
3
3
  require 'minitest/pride'
4
4
  require 'minitest/autorun'
5
+ require 'active_support/core_ext/hash'
5
6
 
7
+ # https://github.com/chrisk/fakeweb
6
8
  FakeWeb.allow_net_connect = false
7
9
 
8
- def stub_airtable_response(url, response)
9
- FakeWeb.register_uri(:get, url, :body => response.to_json, :content_type => "application/json")
10
+ def stub_airtable_response!(url, response, method=:get)
11
+ FakeWeb.register_uri(method, url, :body => response.to_json, :content_type => "application/json")
10
12
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airtable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Esquenazi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-17 00:00:00.000000000 Z
11
+ date: 2015-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ~>
81
81
  - !ruby/object:Gem::Version
82
82
  version: '1.3'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activesupport
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
83
97
  description: Easily connect to airtable data using ruby with access to all of the
84
98
  airtable features.
85
99
  email: