airtable 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: