cartodb-rb-client 0.2.0 → 0.3.0
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.
- data/.gitignore +2 -1
- data/Gemfile +2 -2
- data/README.markdown +41 -11
- data/cartodb-rb-client.gemspec +3 -3
- data/lib/cartodb-rb-client/cartodb/client/authorization.rb +28 -0
- data/lib/cartodb-rb-client/cartodb/client/connection/cartodb.rb +63 -14
- data/lib/cartodb-rb-client/cartodb/helpers/sql_helper.rb +10 -4
- data/lib/cartodb-rb-client/cartodb/model/geo.rb +1 -0
- data/lib/cartodb-rb-client/cartodb/types/metadata.rb +8 -0
- data/lib/cartodb-rb-client/version.rb +1 -1
- data/spec/client_spec.rb +144 -65
- data/spec/spec_helper.rb +74 -25
- data/spec/support/cartodb_config.yml.sample +15 -0
- data/spec/support/data/110m-glaciated-areas.zip +0 -0
- data/spec/support/data/CartoDB_csv_export.zip +0 -0
- data/spec/support/data/CartoDB_shp_export.zip +0 -0
- data/spec/support/data/ngos.xlsx +0 -0
- data/spec/support/data/rmnp.kml +51 -0
- data/spec/support/data/states.kml.zip +0 -0
- data/spec/support/whs_features.csv +2 -33112
- data/spec/support/whs_features.csv.zip +0 -0
- data/spec/support/whs_features_temp.csv +315 -0
- metadata +28 -20
- data/spec/support/cartodb_config.yml +0 -15
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -5,8 +5,8 @@ gemspec
|
|
5
5
|
|
6
6
|
group :development do
|
7
7
|
gem "rspec", "~> 2.3.0"
|
8
|
-
gem "
|
9
|
-
gem "
|
8
|
+
gem "spork", "~> 0.9.0"
|
9
|
+
gem "bundler", "> 1.0.0"
|
10
10
|
gem 'ruby-debug', :platforms => :mri_18
|
11
11
|
gem 'ruby-debug19', :require => 'ruby-debug', :platforms => :mri_19
|
12
12
|
end
|
data/README.markdown
CHANGED
@@ -38,17 +38,13 @@ Setup
|
|
38
38
|
username: 'YOUR_CARTODB_USERNAME'
|
39
39
|
password: 'YOUR_CARTODB_PASSWORD'
|
40
40
|
|
41
|
-
3. Setup your cartoDB connection object
|
42
|
-
|
43
|
-
CartoDB::Settings = YAML.load_file(Rails.root.join('config/cartodb_config.yml'))
|
44
|
-
CartoDB::Connection = CartoDB::Client::Connection.new
|
41
|
+
3. Setup your cartoDB connection object:
|
45
42
|
|
43
|
+
CartoDB::Init.start YAML.load_file(Rails.root.join('config/cartodb_config.yml'))
|
44
|
+
|
46
45
|
And that's it. Now you should be able to run querys against the cartoDB servers using the CartoDB::Connection object.
|
47
46
|
|
48
|
-
|
49
|
-
----------
|
50
|
-
|
51
|
-
If you're developing a Rails app, you just need to add the cartodb\_config.yml file to your rails app config directory. And that's it. You can access cartoDB anywhere in your app's code using the CartoDB::Connection class.
|
47
|
+
Note: You have to use strings instead of symbols for the configuration hash keys.
|
52
48
|
|
53
49
|
Using the cartoDB API
|
54
50
|
-----------
|
@@ -63,11 +59,11 @@ Arguments:
|
|
63
59
|
|
64
60
|
- **table\_name**: table's name.
|
65
61
|
|
66
|
-
- **
|
62
|
+
- **schema_or_file**: this parameter can be a list of fields the table will contain, or a File class containing the data the table will contain. It supports all file types supported by cartoDB.
|
67
63
|
|
68
64
|
- **the\_geom\_type**: Type of geometry the\_geom field will have. Currently we only support 'POINT', but we'll support more types soon.
|
69
65
|
|
70
|
-
Example:
|
66
|
+
Example 1:
|
71
67
|
|
72
68
|
CartoDB::Connection.create_table 'table #1', [{:name => 'field1', :type => 'text'}], 'POINT'
|
73
69
|
|
@@ -81,6 +77,40 @@ Results:
|
|
81
77
|
["updated_at", "date"],
|
82
78
|
["created_at", "date"]]}
|
83
79
|
|
80
|
+
Example 2:
|
81
|
+
|
82
|
+
CartoDB::Connection.create_table 'whs_sites', File.open("#{File.dirname(__FILE__)}/support/whs_features.csv", 'r')
|
83
|
+
|
84
|
+
Results:
|
85
|
+
|
86
|
+
{:id=>242,
|
87
|
+
:name=>"_20120314_21932_1fx2580whs_features",
|
88
|
+
:schema=>
|
89
|
+
[["cartodb_id", "number"],
|
90
|
+
["the_geom", "geometry", "geometry", "point"],
|
91
|
+
["comments", "string"],
|
92
|
+
["country", "string"],
|
93
|
+
["criteria", "string"],
|
94
|
+
["date_of_inscription", "string"],
|
95
|
+
["description", "string"],
|
96
|
+
["edited_region", "string"],
|
97
|
+
["endangered_reason", "string"],
|
98
|
+
["endangered_year", "string"],
|
99
|
+
["external_links", "string"],
|
100
|
+
["iso_code", "string"],
|
101
|
+
["latitude", "string"],
|
102
|
+
["longitude", "string"],
|
103
|
+
["name", "string"],
|
104
|
+
["region", "string"],
|
105
|
+
["size", "string"],
|
106
|
+
["title", "string"],
|
107
|
+
["type", "string"],
|
108
|
+
["whs_site_id", "string"],
|
109
|
+
["whs_source_page", "string"],
|
110
|
+
["wikipedia_link", "string"],
|
111
|
+
["created_at", "date"],
|
112
|
+
["updated_at", "date"]]}
|
113
|
+
|
84
114
|
####2. Add column.
|
85
115
|
|
86
116
|
Adds a new column to an existing table.
|
@@ -178,7 +208,7 @@ Results:
|
|
178
208
|
:name => "table_1",
|
179
209
|
:privacy => "PRIVATE",
|
180
210
|
:tags => "",
|
181
|
-
:schema =>
|
211
|
+
:schema =>
|
182
212
|
[["cartodb_id", "number"],
|
183
213
|
["myfield", "boolean"],
|
184
214
|
["updated_at", "date"],
|
data/cartodb-rb-client.gemspec
CHANGED
@@ -22,10 +22,10 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
23
23
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
24
24
|
s.require_paths = ["lib"]
|
25
|
-
s.add_dependency 'typhoeus', '0.
|
25
|
+
s.add_dependency 'typhoeus', '0.3.3'
|
26
26
|
s.add_dependency 'oauth', '0.4.5'
|
27
|
-
s.add_dependency 'mime-types', '1.16'
|
28
|
-
s.add_dependency 'activesupport', '>= 3.0.0'
|
27
|
+
s.add_dependency 'mime-types', '>= 1.16'
|
28
|
+
s.add_dependency 'activesupport', '>= 3.0.0'
|
29
29
|
s.add_dependency 'i18n', '>= 0.5.0', '<= 0.6.0'
|
30
30
|
s.add_dependency 'rgeo', '0.3.2'
|
31
31
|
s.add_dependency 'rgeo-geojson', '0.2.1'
|
@@ -4,11 +4,15 @@ module CartoDB
|
|
4
4
|
module Client
|
5
5
|
module Authorization
|
6
6
|
|
7
|
+
CRLF = "\r\n"
|
8
|
+
|
7
9
|
def signed_request(request_uri, arguments)
|
8
10
|
arguments[:disable_ssl_peer_verification] = true
|
9
11
|
|
10
12
|
request = Typhoeus::Request.new(request_uri, arguments)
|
11
13
|
|
14
|
+
request = as_multipart(request, arguments[:params]) if arguments[:multipart] == true
|
15
|
+
|
12
16
|
request.headers.merge!({"Authorization" => oauth_helper(request, request_uri).header})
|
13
17
|
|
14
18
|
request
|
@@ -53,6 +57,30 @@ module CartoDB
|
|
53
57
|
end
|
54
58
|
private :oauth_helper
|
55
59
|
|
60
|
+
def as_multipart(request, params)
|
61
|
+
|
62
|
+
boundary = Time.now.to_i.to_s(16)
|
63
|
+
request.headers["Content-Type"] = "multipart/form-data; boundary=#{boundary}"
|
64
|
+
body = ""
|
65
|
+
params.each do |key,value|
|
66
|
+
esc_key = CGI.escape(key.to_s)
|
67
|
+
body << "--#{boundary}#{CRLF}"
|
68
|
+
if value.respond_to?(:read)
|
69
|
+
body << "Content-Disposition: form-data; name=\"#{esc_key}\"; filename=\"#{File.basename(value.path)}\"#{CRLF}"
|
70
|
+
body << "Content-Type: application/octet-stream#{CRLF*2}"
|
71
|
+
body << value.read.force_encoding('utf-8')
|
72
|
+
else
|
73
|
+
body << "Content-Disposition: form-data; name=\"#{esc_key}\"#{CRLF*2}#{value}"
|
74
|
+
end
|
75
|
+
body << CRLF
|
76
|
+
end
|
77
|
+
body << "--#{boundary}--#{CRLF*2}"
|
78
|
+
request.body = body
|
79
|
+
request.params = {}
|
80
|
+
request
|
81
|
+
end
|
82
|
+
private :as_multipart
|
83
|
+
|
56
84
|
end
|
57
85
|
end
|
58
86
|
end
|
@@ -14,14 +14,66 @@ module CartoDB
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def create_table(table_name = nil, schema_or_file = nil, the_geom_type = 'Point')
|
17
|
-
schema = schema_or_file if schema_or_file && schema_or_file.is_a?(Array)
|
18
|
-
file = schema_or_file if schema_or_file && schema_or_file.is_a?(File)
|
19
17
|
|
20
18
|
params = {:name => table_name}
|
21
|
-
params[:
|
22
|
-
params[:schema] = schema.map{|s| "#{s[:name]} #{s[:type]}"}.join(', ') if schema
|
19
|
+
params[:the_geom_type] = the_geom_type.downcase if the_geom_type.present?
|
23
20
|
|
24
|
-
|
21
|
+
case schema_or_file
|
22
|
+
|
23
|
+
when String
|
24
|
+
|
25
|
+
params[:the_geom_type] = schema_or_file.downcase
|
26
|
+
|
27
|
+
request = cartodb_request 'tables', :post, :params => params do |response|
|
28
|
+
return Utils.parse_json(response)
|
29
|
+
end
|
30
|
+
|
31
|
+
when Array
|
32
|
+
|
33
|
+
schema = schema_or_file if schema_or_file && schema_or_file.is_a?(Array)
|
34
|
+
params[:schema] = schema.map{|s| "#{s[:name]} #{s[:type]}"}.join(', ') if schema
|
35
|
+
|
36
|
+
request = cartodb_request 'tables', :post, :params => params do |response|
|
37
|
+
return Utils.parse_json(response)
|
38
|
+
end
|
39
|
+
|
40
|
+
when File
|
41
|
+
|
42
|
+
file = schema_or_file if schema_or_file && schema_or_file.is_a?(File)
|
43
|
+
|
44
|
+
request = cartodb_request nil, :post, :url => '/upload', :params => {:file => file}, :multipart => true do |response|
|
45
|
+
upload_response = Utils.parse_json(response)
|
46
|
+
|
47
|
+
params = {:name => table_name}
|
48
|
+
params[:url] = generate_url upload_response[:file_uri]
|
49
|
+
params[:the_geom_type] = the_geom_type.downcase if the_geom_type.present?
|
50
|
+
|
51
|
+
request = cartodb_request 'tables', :post, :params => params do |response|
|
52
|
+
return Utils.parse_json(response)
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
else
|
58
|
+
|
59
|
+
request = cartodb_request 'tables', :post, :params => params do |response|
|
60
|
+
return Utils.parse_json(response)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
execute_queue
|
66
|
+
|
67
|
+
request.handled_response
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
def rename_table(old_table_name, new_table_name)
|
72
|
+
request = cartodb_request "tables/#{old_table_name}",
|
73
|
+
:put,
|
74
|
+
:params => {
|
75
|
+
:name => new_table_name
|
76
|
+
} do |response|
|
25
77
|
return Utils.parse_json(response)
|
26
78
|
end
|
27
79
|
|
@@ -101,11 +153,8 @@ module CartoDB
|
|
101
153
|
results = query(<<-SQL
|
102
154
|
INSERT INTO #{table_name}
|
103
155
|
(#{row.keys.join(',')})
|
104
|
-
VALUES (#{row.values.join(',')})
|
105
|
-
|
106
|
-
SELECT #{table_name}.cartodb_id as id, #{table_name}.*
|
107
|
-
FROM #{table_name}
|
108
|
-
WHERE cartodb_id = currval('public.#{table_name}_cartodb_id_seq');
|
156
|
+
VALUES (#{row.values.join(',')})
|
157
|
+
RETURNING cartodb_id as id, *;
|
109
158
|
SQL
|
110
159
|
)
|
111
160
|
|
@@ -119,10 +168,8 @@ module CartoDB
|
|
119
168
|
UPDATE #{table_name}
|
120
169
|
SET (#{row.keys.join(',')})
|
121
170
|
= (#{row.values.join(',')})
|
122
|
-
WHERE cartodb_id = #{row_id}
|
123
|
-
|
124
|
-
FROM #{table_name}
|
125
|
-
WHERE cartodb_id = currval('public.#{table_name}_cartodb_id_seq');
|
171
|
+
WHERE cartodb_id = #{row_id}
|
172
|
+
RETURNING cartodb_id as id, *;
|
126
173
|
SQL
|
127
174
|
)
|
128
175
|
|
@@ -178,6 +225,7 @@ module CartoDB
|
|
178
225
|
|
179
226
|
uri = "/api/#{VERSION}/#{uri}"
|
180
227
|
url = generate_url uri
|
228
|
+
url = generate_url(arguments[:url]) if arguments[:url]
|
181
229
|
|
182
230
|
headers = {}
|
183
231
|
headers['Accept'] = MIME::Types['application/json']
|
@@ -187,6 +235,7 @@ module CartoDB
|
|
187
235
|
:method => method,
|
188
236
|
:headers => headers,
|
189
237
|
:params => params,
|
238
|
+
:multipart => arguments[:multipart],
|
190
239
|
:cache_timeout => settings['cache_timeout'],
|
191
240
|
:verbose => settings['debug']
|
192
241
|
)
|
@@ -1,20 +1,26 @@
|
|
1
1
|
module CartoDB
|
2
2
|
module Helpers
|
3
3
|
module SqlHelper
|
4
|
+
require 'time'
|
4
5
|
|
5
6
|
def prepare_data(hash)
|
6
7
|
hash.each do |key, value|
|
7
|
-
hash[key] = format_value(value)
|
8
|
+
hash[key] = format_value(key, value)
|
8
9
|
end
|
9
10
|
hash
|
10
11
|
end
|
11
12
|
|
12
|
-
def format_value(value)
|
13
|
+
def format_value(key, value)
|
13
14
|
case value
|
14
15
|
when ::String
|
15
|
-
|
16
|
+
#value = value.gsub(/\\/, '\&\&').gsub(/'/, "''")
|
17
|
+
if key.match(/geo/)
|
18
|
+
"#{value}"
|
19
|
+
else
|
20
|
+
"'#{value.gsub(/\\/, '\&\&').gsub(/'/, "''")}'"
|
21
|
+
end
|
16
22
|
when ::Date, ::DateTime, ::Time
|
17
|
-
"'#{value}'"
|
23
|
+
"'#{value.to_time.utc}'"
|
18
24
|
when RGeo::Feature::Geometry
|
19
25
|
"'#{RGeo::WKRep::WKBGenerator.new(:type_format => :ewkb, :emit_ewkb_srid => true, :hex_format => true).generate(value)}'"
|
20
26
|
when NilClass
|
@@ -2,6 +2,12 @@ module CartoDB
|
|
2
2
|
module Types
|
3
3
|
class Metadata < Hash
|
4
4
|
|
5
|
+
RESERVED_WORDS = %w(
|
6
|
+
alias and BEGIN begin break case class def defined? do else elsif END end
|
7
|
+
ensure false for if in module next nil not or redo rescue retry return self
|
8
|
+
super then true undef unless until when while yield
|
9
|
+
)
|
10
|
+
|
5
11
|
class << self
|
6
12
|
def from_hash(hash = {})
|
7
13
|
metadata = self.new
|
@@ -14,6 +20,8 @@ module CartoDB
|
|
14
20
|
end
|
15
21
|
|
16
22
|
def []=(key, value)
|
23
|
+
key = :"#{key}_" if RESERVED_WORDS.include?(key.to_s)
|
24
|
+
|
17
25
|
if key.to_s.eql?('the_geom')
|
18
26
|
value = _geometry_features(value)
|
19
27
|
else
|
data/spec/client_spec.rb
CHANGED
@@ -20,11 +20,11 @@ describe 'CartoDB client' do
|
|
20
20
|
|
21
21
|
it "should create a table forcing the schema and get its table definition" do
|
22
22
|
table = CartoDB::Connection.create_table 'cartodb_spec', [
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
{:name => 'field1', :type => 'text'},
|
24
|
+
{:name => 'field2', :type => 'numeric'},
|
25
|
+
{:name => 'field3', :type => 'date'},
|
26
|
+
{:name => 'field4', :type => 'boolean'}
|
27
|
+
]
|
28
28
|
|
29
29
|
table.should_not be_nil
|
30
30
|
table = CartoDB::Connection.table 'cartodb_spec'
|
@@ -38,43 +38,105 @@ describe 'CartoDB client' do
|
|
38
38
|
table.schema.should include(["field4", "boolean"])
|
39
39
|
end
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
41
|
+
it "should create a table from a csv file" do
|
42
|
+
|
43
|
+
table = CartoDB::Connection.create_table 'whs_sites', File.open("#{File.dirname(__FILE__)}/support/whs_features.csv", 'r')
|
44
|
+
|
45
|
+
table.should_not be_nil
|
46
|
+
table[:id].should be > 0
|
47
|
+
table = CartoDB::Connection.table table[:name]
|
48
|
+
table.schema.should have(24).items
|
49
|
+
|
50
|
+
records = CartoDB::Connection.records table[:name]
|
51
|
+
records.should_not be_nil
|
52
|
+
records.rows.should have(10).whs_sites
|
53
|
+
|
54
|
+
records.rows.first.cartodb_id.should be > 0
|
55
|
+
records.rows.first.title.should be == "Aflaj Irrigation Systems of Oman"
|
56
|
+
records.rows.first.latitude.should be > 0
|
57
|
+
records.rows.first.longitude.should be > 0
|
58
|
+
records.rows.first.description.should match /A qanāt \(from Arabic: قناة\) \(Iran, Syria and Jordan\) is a water management system used to provide/
|
59
|
+
records.rows.first.region.should be == "Dakhiliya, Sharqiya and Batinah Regions"
|
60
|
+
records.rows.first.type.should be == "cultural"
|
61
|
+
records.rows.first.endangered_reason.should be_empty
|
62
|
+
records.rows.first.edited_region.should be == "Dakhiliya, Sharqiya and Batinah Regions"
|
63
|
+
records.rows.first.endangered_year.should be_empty
|
64
|
+
records.rows.first.external_links.should_not be_empty
|
65
|
+
records.rows.first.wikipedia_link.should be == "http://en.wikipedia.org/wiki/Qanat"
|
66
|
+
records.rows.first.comments.should be_empty
|
67
|
+
records.rows.first.criteria.should be == "[v]"
|
68
|
+
records.rows.first.iso_code.should be == "OM"
|
69
|
+
records.rows.first.size.should be == 14560000.0
|
70
|
+
records.rows.first.name.should be == "Aflaj Irrigation Systems of Oman"
|
71
|
+
records.rows.first.country.should be == "Oman"
|
72
|
+
records.rows.first.whs_site_id.should be == 1207
|
73
|
+
records.rows.first.date_of_inscription.should be == 2006
|
74
|
+
records.rows.first.whs_source_page.should be == "http://whc.unesco.org/en/list/1207"
|
75
|
+
records.rows.first.created_at.should_not be_nil
|
76
|
+
records.rows.first.updated_at.should_not be_nil
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should import any kind of data file" do
|
81
|
+
Dir["#{File.dirname(__FILE__)}/support/data/*"].each do |file|
|
82
|
+
table = CartoDB::Connection.create_table File.basename(file, '.*'), File.open(file, 'r')
|
83
|
+
|
84
|
+
table.should_not be_nil
|
85
|
+
table[:id].should be > 0
|
86
|
+
table[:name].should_not be_empty
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should create a table with POINT type geometry" do
|
91
|
+
table = CartoDB::Connection.create_table 'cartodb_spec', 'point'
|
92
|
+
|
93
|
+
table.should_not be_nil
|
94
|
+
table = CartoDB::Connection.table 'cartodb_spec'
|
95
|
+
table.schema.should have(6).items
|
96
|
+
table.schema.should include(["cartodb_id", "number"])
|
97
|
+
table.schema.should include(["created_at", "date"])
|
98
|
+
table.schema.should include(["updated_at", "date"])
|
99
|
+
table.schema.should include(["name", "string"])
|
100
|
+
table.schema.should include(["description", "string"])
|
101
|
+
table.schema.should include(["the_geom", "geometry", "geometry", "point"])
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should create a table with MULTIPOLYGON type geometry" do
|
105
|
+
table = CartoDB::Connection.create_table 'cartodb_spec', 'multipolygon'
|
106
|
+
|
107
|
+
table.should_not be_nil
|
108
|
+
table = CartoDB::Connection.table 'cartodb_spec'
|
109
|
+
table.schema.should have(6).items
|
110
|
+
table.schema.should include(["cartodb_id", "number"])
|
111
|
+
table.schema.should include(["created_at", "date"])
|
112
|
+
table.schema.should include(["updated_at", "date"])
|
113
|
+
table.schema.should include(["name", "string"])
|
114
|
+
table.schema.should include(["description", "string"])
|
115
|
+
table.schema.should include(["the_geom", "geometry", "geometry", "multipolygon"])
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should rename an existing table" do
|
119
|
+
table = CartoDB::Connection.create_table 'cartodb_spec'
|
120
|
+
|
121
|
+
table.name.should be == 'cartodb_spec'
|
122
|
+
|
123
|
+
table = CartoDB::Connection.rename_table 'cartodb_spec', 'renamed_cartodb_spec'
|
124
|
+
table.name.should be == 'renamed_cartodb_spec'
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should create a table with MULTILINESTRING type geometry" do
|
128
|
+
table = CartoDB::Connection.create_table 'cartodb_spec', 'multilinestring'
|
129
|
+
|
130
|
+
table.should_not be_nil
|
131
|
+
table = CartoDB::Connection.table 'cartodb_spec'
|
132
|
+
table.schema.should have(6).items
|
133
|
+
table.schema.should include(["cartodb_id", "number"])
|
134
|
+
table.schema.should include(["created_at", "date"])
|
135
|
+
table.schema.should include(["updated_at", "date"])
|
136
|
+
table.schema.should include(["name", "string"])
|
137
|
+
table.schema.should include(["description", "string"])
|
138
|
+
table.schema.should include(["the_geom", "geometry", "geometry", "multilinestring"])
|
139
|
+
end
|
78
140
|
|
79
141
|
it "should add and remove colums in a previously created table" do
|
80
142
|
CartoDB::Connection.create_table 'cartodb_spec'
|
@@ -127,35 +189,34 @@ describe 'CartoDB client' do
|
|
127
189
|
|
128
190
|
it "should insert a row in a table" do
|
129
191
|
table = CartoDB::Connection.create_table 'table #1', [
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
192
|
+
{:name => 'field1', :type => 'text'},
|
193
|
+
{:name => 'field2', :type => 'numeric'},
|
194
|
+
{:name => 'field3', :type => 'date'},
|
195
|
+
{:name => 'field4', :type => 'boolean'}
|
196
|
+
]
|
135
197
|
|
136
198
|
today = DateTime.now
|
137
199
|
|
138
|
-
|
200
|
+
record = CartoDB::Connection.insert_row 'table_1', {
|
139
201
|
'field1' => 'lorem',
|
140
202
|
'field2' => 100.99,
|
141
203
|
'field3' => today,
|
142
204
|
'field4' => true
|
143
205
|
}
|
144
206
|
|
145
|
-
record
|
146
|
-
record.
|
147
|
-
record.field2.should == 100.99
|
207
|
+
record.field1.should == 'lorem'
|
208
|
+
record.field2.should == 100.99
|
148
209
|
record.field3.to_date.should == today.to_date
|
149
|
-
record.field4.should
|
210
|
+
record.field4.should == true
|
150
211
|
end
|
151
212
|
|
152
213
|
it "should update a row in a table" do
|
153
214
|
table = CartoDB::Connection.create_table 'table #1', [
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
215
|
+
{:name => 'field1', :type => 'text'},
|
216
|
+
{:name => 'field2', :type => 'numeric'},
|
217
|
+
{:name => 'field3', :type => 'date'},
|
218
|
+
{:name => 'field4', :type => 'boolean'}
|
219
|
+
]
|
159
220
|
|
160
221
|
today = DateTime.now
|
161
222
|
|
@@ -166,15 +227,13 @@ describe 'CartoDB client' do
|
|
166
227
|
'field4' => true
|
167
228
|
}
|
168
229
|
|
169
|
-
CartoDB::Connection.update_row 'table_1', record.id, {
|
230
|
+
record = CartoDB::Connection.update_row 'table_1', record.id, {
|
170
231
|
'field1' => 'illum',
|
171
232
|
'field2' => -83.24,
|
172
233
|
'field3' => today + 1,
|
173
234
|
'field4' => false
|
174
235
|
}
|
175
236
|
|
176
|
-
record = CartoDB::Connection.row 'table_1', record.id
|
177
|
-
|
178
237
|
record.field1.should == 'illum'
|
179
238
|
record.field2.should == -83.24
|
180
239
|
record.field3.to_date.should == (today + 1).to_date
|
@@ -183,11 +242,11 @@ describe 'CartoDB client' do
|
|
183
242
|
|
184
243
|
it "should delete a table's row" do
|
185
244
|
table = CartoDB::Connection.create_table 'table #1', [
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
245
|
+
{:name => 'field1', :type => 'text'},
|
246
|
+
{:name => 'field2', :type => 'numeric'},
|
247
|
+
{:name => 'field3', :type => 'date'},
|
248
|
+
{:name => 'field4', :type => 'boolean'}
|
249
|
+
]
|
191
250
|
|
192
251
|
today = Time.now
|
193
252
|
|
@@ -275,4 +334,24 @@ describe 'CartoDB client' do
|
|
275
334
|
|
276
335
|
end
|
277
336
|
|
337
|
+
it 'should escape properly input data in insert queries' do
|
338
|
+
|
339
|
+
table = CartoDB::Connection.create_table 'table #1', 'multipolygon'
|
340
|
+
table.schema.should include(["the_geom", "geometry", "geometry", "multipolygon"])
|
341
|
+
|
342
|
+
record = CartoDB::Connection.insert_row 'table_1', {
|
343
|
+
'the_geom' => "ST_GeomFromText('MULTIPOLYGON(((95.67764648436992 59.894444919406,90.75577148436992 54.16886220825434,103.41202148436992 56.75874227547269,95.67764648436992 59.894444919406)))', 4326)"
|
344
|
+
}
|
345
|
+
|
346
|
+
record.id.should_not be_nil
|
347
|
+
end
|
348
|
+
|
349
|
+
it 'should allow reserved words in columns names' do
|
350
|
+
table = CartoDB::Connection.create_table 'table #1', [{:name => 'class', :type => 'text'}]
|
351
|
+
table.schema.should include(["class", "string"])
|
352
|
+
|
353
|
+
record = CartoDB::Connection.insert_row table.name, :class => 'wadus'
|
354
|
+
record.class_.should == 'wadus'
|
355
|
+
end
|
356
|
+
|
278
357
|
end
|