swivel 0.0.8 → 0.0.15
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/README +31 -63
- data/lib/swivel.rb +251 -56
- metadata +2 -2
data/README
CHANGED
@@ -16,7 +16,8 @@ swivel.rb is a smallish bit that lets you interface with Swivel's REST API.
|
|
16
16
|
|
17
17
|
== The REST API
|
18
18
|
|
19
|
-
|
19
|
+
The Swivel API is mostly RESTful. You can read and write many kinds of
|
20
|
+
resources. Here's the list.
|
20
21
|
|
21
22
|
------ ----------- ------------
|
22
23
|
method uri what it does
|
@@ -46,9 +47,13 @@ TODO: some copy
|
|
46
47
|
get /rest/users/#{id} show user #{id}
|
47
48
|
put /rest/users/#{id} update user #{id}
|
48
49
|
|
49
|
-
|
50
|
-
|
51
|
-
|
50
|
+
(non-RESTful methods)
|
51
|
+
get /rest/test/echo/#{text} echo some text
|
52
|
+
get /rest/search search for stuff
|
53
|
+
|
54
|
+
Most method calls take parameters. Check out the
|
55
|
+
{Swivel API Explorer}[http://swivel.com/api/list] to try calls interactively.
|
56
|
+
Also, check out some {sample code}[http://swivel.com/api/code].
|
52
57
|
|
53
58
|
== Make it go go racer
|
54
59
|
|
@@ -87,13 +92,14 @@ Never fear, it's installed when you install the gem.
|
|
87
92
|
|
88
93
|
$ ri Swivel
|
89
94
|
|
90
|
-
|
95
|
+
Other nice ones:
|
91
96
|
|
97
|
+
$ ri Swivel::Connection
|
92
98
|
$ ri Swivel::Response
|
93
99
|
|
94
100
|
== Examples. Worth a thousand words
|
95
101
|
|
96
|
-
Ready, set, ... wait. Got an API key? Get an API key
|
102
|
+
Ready, set, ... wait. Got an API key? {Get an API key}[http://swivel.com/api/key].
|
97
103
|
Try to keep your API key close to your chest, safely tucked away from prying eyes
|
98
104
|
and dangers of the "real world"... dangers like parking tickets and untied shoelaces.
|
99
105
|
It's like a password, so don't share it.
|
@@ -101,6 +107,9 @@ It's like a password, so don't share it.
|
|
101
107
|
# writes your api key into ~/.swivelrc
|
102
108
|
swivel -k <your api key>
|
103
109
|
|
110
|
+
(Did you notice you got a `swivel` at your command line? Sneaky! It's part of the
|
111
|
+
gem. And it can query or pipe data into Swivel from your terminal!)
|
112
|
+
|
104
113
|
Now, back to it. Ready, set, go!
|
105
114
|
|
106
115
|
$ irb
|
@@ -223,6 +232,14 @@ TODO: explain it in this here table
|
|
223
232
|
* time_scale
|
224
233
|
* aggregation_function
|
225
234
|
|
235
|
+
== Uploading Data
|
236
|
+
|
237
|
+
See Swivel::Connection#upload
|
238
|
+
|
239
|
+
== Create Graphs
|
240
|
+
|
241
|
+
TODO
|
242
|
+
|
226
243
|
== Something completely different: A tryst at the command line
|
227
244
|
|
228
245
|
The command line program lets you query Swivel or upload data into Swivel.
|
@@ -250,8 +267,8 @@ It uses a ~/.swivelrc file to remember settings. If you don't have a
|
|
250
267
|
-rw-rw-r-- 1 huned huned 105 Jun 4 05:04 /home/huned/.swivelrc
|
251
268
|
|
252
269
|
Note, however, that the api_key setting is blank. Once you finagle an api key,
|
253
|
-
run `swivel -k <your api key>` to update your ~/.swivelrc. (Remember: finagle an api
|
254
|
-
key
|
270
|
+
run `swivel -k <your api key>` to update your ~/.swivelrc. (Remember: {finagle an api
|
271
|
+
key}[http://swivel.com/api/key].)
|
255
272
|
|
256
273
|
$ cat ~/.swivelrc
|
257
274
|
---
|
@@ -302,67 +319,18 @@ Edit by Visnu: Huned wrote this at 4am. He tired out right here.
|
|
302
319
|
|
303
320
|
== Feedback
|
304
321
|
|
305
|
-
Feedback, comments, and (especially) patches welcome at developer@swivel.com.
|
322
|
+
Feedback, comments, and (especially) patches welcome at mailto:developer@swivel.com.
|
323
|
+
|
324
|
+
You can rcov swivel.rb by running this from the top level directory:
|
325
|
+
|
326
|
+
$ rcov -Ilib -t test/test_swivel.rb
|
306
327
|
|
307
328
|
== Respek
|
308
329
|
|
309
330
|
Respeks to _why, errtheblog, 37signals, our moms, and of course the community.
|
310
|
-
Wanna write code with us? http://swivel.com/about/jobs
|
331
|
+
Wanna write code with us? {We're hiring!}[http://swivel.com/about/jobs]
|
311
332
|
|
312
333
|
== License
|
313
334
|
|
314
335
|
This software is licensed under the exact same license as Ruby itself. Peace
|
315
336
|
out.
|
316
|
-
|
317
|
-
upload options
|
318
|
-
mode
|
319
|
-
initial append replace
|
320
|
-
|
321
|
-
auto_estimate
|
322
|
-
ordered_column_names
|
323
|
-
ordered_column_types
|
324
|
-
column_separator
|
325
|
-
|
326
|
-
original_asset_name
|
327
|
-
original_asset_path
|
328
|
-
data (or data_content)
|
329
|
-
|
330
|
-
name
|
331
|
-
color
|
332
|
-
description
|
333
|
-
citation
|
334
|
-
citation_url
|
335
|
-
image_url
|
336
|
-
image_source_url
|
337
|
-
display_tags
|
338
|
-
public_tags
|
339
|
-
|
340
|
-
graph options
|
341
|
-
graph_type
|
342
|
-
BarGraph LineGraph HorizontalBarGraph PieGraph ScatterGraph
|
343
|
-
width
|
344
|
-
height
|
345
|
-
limit
|
346
|
-
image_url
|
347
|
-
name
|
348
|
-
description
|
349
|
-
display_tags
|
350
|
-
time_range
|
351
|
-
???
|
352
|
-
time_scale
|
353
|
-
hourly daily weekly quarterly yearly
|
354
|
-
scale
|
355
|
-
absolute average relative range percent
|
356
|
-
|
357
|
-
variant
|
358
|
-
default thumbnail sparkline preview share
|
359
|
-
|
360
|
-
columns
|
361
|
-
order_by_direction
|
362
|
-
asc desc unsorted alpha
|
363
|
-
order_by_column
|
364
|
-
x_axis_column
|
365
|
-
join_on_columns
|
366
|
-
group_by_columns
|
367
|
-
highlight_columns
|
368
|
-
|
data/lib/swivel.rb
CHANGED
@@ -59,69 +59,67 @@ end
|
|
59
59
|
# ==Overview
|
60
60
|
#
|
61
61
|
# Create a new connection to swivel. Grabs options from ~/.swivelrc, creating
|
62
|
-
# it if necessary.
|
62
|
+
# it if necessary. ({Get a Swivel API key}[http://swivel.com/api/key])
|
63
63
|
#
|
64
64
|
# swivel = Swivel::Connection.new
|
65
65
|
#
|
66
66
|
# Get data from Swivel
|
67
67
|
#
|
68
68
|
# # show a data_set's name
|
69
|
-
# data_set = swivel.
|
69
|
+
# data_set = swivel.data_set 1000001
|
70
70
|
# data_set.name # => "American Longevity"
|
71
71
|
#
|
72
72
|
# # list data_sets' names
|
73
|
-
# data_sets = swivel.
|
73
|
+
# data_sets = swivel.data_sets
|
74
74
|
# data_sets.collect do |data_set|
|
75
75
|
# data_set.name
|
76
76
|
# end
|
77
77
|
#
|
78
78
|
# # show a data_column's name
|
79
|
-
# data_column = swivel.
|
79
|
+
# data_column = swivel.data_column 1000343
|
80
80
|
# data_column.name # => "Average Per Capita Income"
|
81
81
|
#
|
82
82
|
# # list data_columns' names
|
83
|
-
# data_columns = swivel.
|
83
|
+
# data_columns = swivel.data_columns
|
84
84
|
# data_columns.collect do |data_column|
|
85
85
|
# data_column.name
|
86
86
|
# end
|
87
87
|
#
|
88
88
|
# # show a user's name
|
89
|
-
# user = swivel.
|
89
|
+
# user = swivel.user 1000010
|
90
90
|
# user.name # => "huned"
|
91
91
|
#
|
92
92
|
# # list users' names
|
93
|
-
# users = swivel.
|
93
|
+
# users = swivel.users
|
94
94
|
# users.collect do |user|
|
95
95
|
# user.name
|
96
96
|
# end
|
97
97
|
#
|
98
98
|
# # show a graph's name
|
99
|
-
# graph = swivel.
|
99
|
+
# graph = swivel.graph 5119232
|
100
100
|
# graph.name # => "Vinyl to Ipods"
|
101
101
|
#
|
102
102
|
# # list graphs' names
|
103
|
-
# graphs = swivel.
|
103
|
+
# graphs = swivel.graphs
|
104
104
|
# graphs.collect do |graph|
|
105
105
|
# graph.name
|
106
106
|
# end
|
107
107
|
#
|
108
108
|
# Upload data
|
109
109
|
#
|
110
|
+
# See Swivel::Connection#upload for a detailed list of options
|
111
|
+
#
|
110
112
|
# # upload a new data_set
|
111
113
|
# data_set = swivel.upload {...}
|
112
114
|
#
|
113
115
|
# # append to an existing data_set
|
114
|
-
# data_set = swivel.append {...}.merge(:id => orig_data_set_id
|
116
|
+
# data_set = swivel.append {...}.merge(:id => orig_data_set_id)
|
115
117
|
#
|
116
118
|
# # replace data for an existing data_set
|
117
|
-
# data_set = swivel.
|
118
|
-
#
|
119
|
-
# TODO: SwQL
|
119
|
+
# data_set = swivel.replace {...}.merge(:id => orig_data_set_id)
|
120
120
|
#
|
121
121
|
# TODO: constructing URLs for csvs, html pages, etc
|
122
122
|
#
|
123
|
-
# TODO: object cache {in memory, on filesystem}
|
124
|
-
#
|
125
123
|
|
126
124
|
module Swivel
|
127
125
|
|
@@ -263,14 +261,50 @@ module Swivel
|
|
263
261
|
end
|
264
262
|
end
|
265
263
|
|
266
|
-
%w/DataColumn
|
264
|
+
%w/DataColumn User/.each do |class_name|
|
267
265
|
class_eval <<-LAZY
|
268
266
|
class #{class_name} < Response; end
|
269
267
|
LAZY
|
270
268
|
end
|
271
269
|
|
270
|
+
class DataSet < Response
|
271
|
+
# Append new data to this data_set. Passed in options must contain
|
272
|
+
# csv data. This csv data must adhrere to the same column structure
|
273
|
+
# as the originally uploaded data_set.
|
274
|
+
#
|
275
|
+
# data_set = swivel.data_set id
|
276
|
+
# data_set.append! :data => `/tmp/append.csv`
|
277
|
+
|
278
|
+
def append! options = Hash.new
|
279
|
+
options.merge! :mode => 'append', :id => self.id
|
280
|
+
raise 'feed me data!' if options[:data].blank?
|
281
|
+
appended_data_set = @connection.upload options
|
282
|
+
@refreshed_at = nil
|
283
|
+
@retried = false
|
284
|
+
@doc = appended_data_set.instance_variable_get :@doc
|
285
|
+
self
|
286
|
+
end
|
287
|
+
|
288
|
+
# Replace data in this data_set. Passed in options must contain
|
289
|
+
# csv data. This csv data must adhere to the same column structure
|
290
|
+
# as the originally uploaded data set.
|
291
|
+
#
|
292
|
+
# data_set = swivel.data_set id
|
293
|
+
# data_set.replace! :data => `/tmp/replace.csv`
|
294
|
+
|
295
|
+
def replace! options = Hash.new
|
296
|
+
options.merge! :mode => 'replace', :id => self.id
|
297
|
+
raise 'feed me data!' if options[:data].blank?
|
298
|
+
replaced_data_set = @connection.upload options
|
299
|
+
@refreshed_at = nil
|
300
|
+
@retried = false
|
301
|
+
@doc = replaced_data_set.instance_variable_get :@doc
|
302
|
+
self
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
272
306
|
class Graph < Response
|
273
|
-
def image_url options =
|
307
|
+
def image_url options = Hash.new
|
274
308
|
host = @connection.config[:image_host]
|
275
309
|
if variant == 'transient'
|
276
310
|
"http://#{host}/graphs/get/#{digest}"
|
@@ -278,6 +312,47 @@ module Swivel
|
|
278
312
|
"http://#{host}/graphs/image/#{id}"
|
279
313
|
end
|
280
314
|
end
|
315
|
+
|
316
|
+
# Swivel::Connection#create_graph returns a transient graph that
|
317
|
+
# must be saved in order for it to persist at Swivel. Only persistent
|
318
|
+
# graphs have page urls at Swivel.
|
319
|
+
#
|
320
|
+
# call save on a transient graph in order to do this.
|
321
|
+
#
|
322
|
+
# # create a transient graph
|
323
|
+
# transient_graph = swivel.create_graph {...}
|
324
|
+
# transient_graph.variant # => 'transient'
|
325
|
+
# transient_graph.id.blank? # => true
|
326
|
+
#
|
327
|
+
# # persist the transient graph
|
328
|
+
# persisted_graph = transient_graph.save
|
329
|
+
# persisted_graph.variant # => 'default'
|
330
|
+
# persisted_graph.id.blank? # false
|
331
|
+
#
|
332
|
+
# # now, you can grab it from swivel whenever
|
333
|
+
# g = swivel.graph persisted_graph.id
|
334
|
+
# g.name == persisted_graph.name # => true
|
335
|
+
|
336
|
+
def save!
|
337
|
+
return self unless variant == 'transient'
|
338
|
+
options = {:save => 'true', :digest => self.digest}
|
339
|
+
# PUT /rest/graphs/0 denotes updating a transient graph. Swivel
|
340
|
+
# will read the digest and save the transient graph that matches
|
341
|
+
# that digest.
|
342
|
+
saved_graph = @connection.call '/rest/graphs/0', options, :put
|
343
|
+
@doc = saved_graph.instance_variable_get :@doc
|
344
|
+
@refreshed_at = nil
|
345
|
+
@retried = false
|
346
|
+
self
|
347
|
+
end
|
348
|
+
|
349
|
+
def add_column! data_column
|
350
|
+
# TODO
|
351
|
+
end
|
352
|
+
|
353
|
+
def remove_column! data_column
|
354
|
+
# TODO
|
355
|
+
end
|
281
356
|
end
|
282
357
|
|
283
358
|
# Encapsulates lists of resources. Typically, items contained within the list are
|
@@ -412,6 +487,24 @@ module Swivel
|
|
412
487
|
# # returns a string (because an appropriate Swivel::Response subclass doesn't exist)
|
413
488
|
# echo = swivel.call '/rest/test/echo/howdy'
|
414
489
|
# echo.class # => String
|
490
|
+
#
|
491
|
+
# However, calling all of those endpoints is tedious. For swivel's main objects
|
492
|
+
# there are some helper methods to get stuff:
|
493
|
+
#
|
494
|
+
# data_set = swivel.data_set 1
|
495
|
+
# data_set.class # => Swivel::DataSet
|
496
|
+
# data_set.id # => 1
|
497
|
+
#
|
498
|
+
# data_sets = swivel.data_sets
|
499
|
+
#
|
500
|
+
# some_graph = swivel.graph 1232132
|
501
|
+
#
|
502
|
+
# pwn3r = swivel.user 'visnu'
|
503
|
+
# pwn3r.name # => 'visnu'
|
504
|
+
#
|
505
|
+
# All these convenience methoods (yeah, methoods) really do is prettify a get call
|
506
|
+
# to:
|
507
|
+
# /rest/object_type or /rest/object_type/id
|
415
508
|
|
416
509
|
def call path, params = Hash.new, method = :get
|
417
510
|
xml =
|
@@ -428,26 +521,9 @@ module Swivel
|
|
428
521
|
doc = REXML::Document.new xml
|
429
522
|
Response.class_for(doc.root.elements[1].name).new xml, self
|
430
523
|
rescue Exception => e
|
431
|
-
xml
|
524
|
+
xml.blank? ? nil : xml
|
432
525
|
end
|
433
526
|
|
434
|
-
# Calling all of those endpoints is tedious. For swivel's main objects
|
435
|
-
# there are some helper methods to get stuff:
|
436
|
-
#
|
437
|
-
# data_set = swivel.data_set 1
|
438
|
-
# data_set.class # => Swivel::DataSet
|
439
|
-
# data_set.id # => 1
|
440
|
-
#
|
441
|
-
# data_sets = swivel.data_sets
|
442
|
-
#
|
443
|
-
# some_graph = swivel.graph 1232132
|
444
|
-
#
|
445
|
-
# da_bomb = swivel.user 'visnu'
|
446
|
-
# da_bomb.name # => 'visnu'
|
447
|
-
#
|
448
|
-
# All these really do is prettify a get call to:
|
449
|
-
# /rest/object_type or /rest/object_type/id
|
450
|
-
|
451
527
|
%w/ data_columns data_sets graphs users /.each do |obj|
|
452
528
|
class_eval <<-LAZY
|
453
529
|
def #{obj} options = nil
|
@@ -468,49 +544,168 @@ module Swivel
|
|
468
544
|
LAZY
|
469
545
|
end
|
470
546
|
|
471
|
-
|
472
|
-
|
473
|
-
|
547
|
+
DEFAULT_UPLOAD_OPTIONS = {
|
548
|
+
:citation => 'swivel.rb',
|
549
|
+
:citation_url => 'swivel.com/developer',
|
550
|
+
:image_url => 'http://swivel.com/images/logo.png',
|
551
|
+
:image_source_url => 'http://swivel.com',
|
552
|
+
:display_tags => 'swivel api swivel.rb'
|
553
|
+
}
|
554
|
+
|
555
|
+
# Performs an upload, append, or replace to a data_set in Swivel.
|
556
|
+
# # upload a file to swivel
|
557
|
+
# data_set = swivel.upload {...}
|
474
558
|
#
|
475
|
-
# In order to append or replace
|
476
|
-
#
|
559
|
+
# In order to upload, append, or replace, you must have a valid api key.
|
560
|
+
# {Get a Swivel API key}[http://swivel.com/api/key].
|
477
561
|
#
|
478
|
-
#
|
562
|
+
# # append to a data_set already in Swivel
|
563
|
+
# more_data = `cat /tmp/more.csv`
|
564
|
+
# data_set = swivel.append {:data => more_data}.merge(:id => data_set_id)
|
479
565
|
#
|
480
|
-
#
|
566
|
+
# # replace underlying data in a data_set that already exists on Swivel
|
567
|
+
# new_data = `cat /tmp/new.csv`
|
568
|
+
# data_set = swivel.replace {:data => new_data}.merge(:id => data_set_id)
|
481
569
|
#
|
482
|
-
#
|
570
|
+
# In order to append or replace a data_set, you must be the owner of the data.
|
571
|
+
# The new data must conform to the same column structure as the original data.
|
483
572
|
#
|
484
|
-
#
|
573
|
+
# required parameters
|
574
|
+
# * options['id'] - data_set id that you want to append/replace. (append, replace only)
|
575
|
+
# * options['name'] - name for the data_set. (upload only)
|
576
|
+
# * options['citation'] - citation for the data_set. e.g., U.N. (upload only)
|
577
|
+
# * options['data'] - a string of actual csv data. when appending or replacing data, a header row is optional. (upload, append, and replace)
|
578
|
+
# * options['display_tags'] - tags for the data_set (upload only)
|
485
579
|
#
|
486
|
-
#
|
487
|
-
#
|
580
|
+
# optional parameters (upload only; not for append or replace)
|
581
|
+
# * options['description'] - description for the data_set
|
582
|
+
# * options['citation_url'] - citation url for the data set. e.g., http://un.org
|
583
|
+
# * options['auto_estimate'] - when true, swivel tries to figure out the column names, column types, and column separator character automatically from the csv data. when missing or false, you must also supply options['column_names'], options['column_types'], and options['column_separator'].
|
584
|
+
# * options['column_names'] - a comma-separated string of column names. only send this option when auto_estimate is missing or false.
|
585
|
+
# * options['column_types'] - a comma-separated string of column types. possible types are DateTimeDataColumn, BooleanDataColumn, CurrencyDataColumn, NumberDataColumn, WholeNumberDataColumn, PercentageDataColumn, TextDataColumn. only send this option when auto_estimate is missing or false.
|
586
|
+
# * options['column_separator'] - a character. usually a ','. only send this option when auto_estimate is false.
|
587
|
+
# * options['image_url'] - a url to an image you'd like to associate with your data_set.
|
588
|
+
# * options['image_source_url'] - a url to the source for your image, for proper attribution.
|
488
589
|
#
|
489
|
-
#
|
490
|
-
# data_set = swivel.append {...}
|
590
|
+
# {More examples online}[http://swivel.com/api/code]
|
491
591
|
#
|
492
|
-
#
|
493
|
-
#
|
592
|
+
# A few limitations since swivel.rb is yet nascent and in its formative
|
593
|
+
# days.
|
594
|
+
# * You must post data as a string of text.
|
595
|
+
# * Actually, that's it, I think.
|
494
596
|
|
495
597
|
def upload options = Hash.new
|
496
|
-
|
598
|
+
opts = options.clone
|
599
|
+
opts[:mode] ||= 'initial'
|
600
|
+
|
497
601
|
uri, method =
|
498
|
-
case
|
602
|
+
case opts[:mode]
|
499
603
|
when 'append', 'replace'
|
500
|
-
[
|
604
|
+
opts[:auto_estimate] = true
|
605
|
+
["/rest/data_sets/#{opts[:id]}", :put]
|
501
606
|
else
|
607
|
+
force_auto_estimate =
|
608
|
+
!opts.has_key?(:auto_estimate) && !opts.has_key?(:column_type)
|
609
|
+
opts[:auto_estimate] = true if force_auto_estimate
|
610
|
+
opts.reverse_merge! DEFAULT_UPLOAD_OPTIONS
|
502
611
|
['/rest/data_sets', :post]
|
503
612
|
end
|
504
|
-
call uri,
|
613
|
+
call uri, opts, method
|
505
614
|
end
|
615
|
+
alias_method :create_data_set, :upload
|
506
616
|
|
507
617
|
%w/append replace/.each do |mode|
|
508
618
|
class_eval <<-LAZY
|
509
619
|
def #{mode} options = Hash.new
|
510
|
-
|
511
|
-
|
620
|
+
opts = options.clone
|
621
|
+
opts[:mode] = "#{mode}"
|
622
|
+
upload opts
|
512
623
|
end
|
513
624
|
LAZY
|
514
625
|
end
|
626
|
+
|
627
|
+
# Lets you create a transient graph in Swivel.
|
628
|
+
#
|
629
|
+
# If you pass in options[:save] => true, your transient graph will be
|
630
|
+
# immediately saved.
|
631
|
+
#
|
632
|
+
# # build a transient graph, then save it.
|
633
|
+
# transient_graph = swivel.create_graph {...}
|
634
|
+
# graph = transient_graph.save
|
635
|
+
#
|
636
|
+
# # a faster way of doing the same thing.
|
637
|
+
# graph = swivel.create_graph {...}.merge(:save => 'true')
|
638
|
+
#
|
639
|
+
# Transient graphs exist in Swivel so you can cheaply play around with
|
640
|
+
# different visualizations, without saving them to Swivel's database.
|
641
|
+
# The idea is to let you quickly create visualizations and discard the
|
642
|
+
# duds and keep the gems. So, create graphs with impunity! And just
|
643
|
+
# save the ones you like.
|
644
|
+
#
|
645
|
+
# From an object perspective, the big differences between transient
|
646
|
+
# and persistent graphs are:
|
647
|
+
#
|
648
|
+
# transient_graph = swivel.create_graph {...}
|
649
|
+
#
|
650
|
+
# # transient graphs do not have ids. thus, they are not accessible
|
651
|
+
# # at their own page at swivel.com.
|
652
|
+
# transient_graph.id # => nil
|
653
|
+
#
|
654
|
+
# # transient graphs have a 'transient' variant
|
655
|
+
# transient_graph.variant # => 'transient'
|
656
|
+
#
|
657
|
+
# # transient graphs have digests whereas persisted graphs do not.
|
658
|
+
# # digests act as a unique identifier for transient graphs. e.g.,
|
659
|
+
# # you'd use the digest to build urls to the transient graph's image.
|
660
|
+
# transient_graph.digest.blank? # => false
|
661
|
+
# transient_graph.image_url.blank? # => false
|
662
|
+
#
|
663
|
+
# Please don't save transient graphs you don't want to end up keeping
|
664
|
+
# around. It's the most environmentally friendly thing to do.
|
665
|
+
#
|
666
|
+
# required parameters
|
667
|
+
# * options[:graph_type]
|
668
|
+
# * LineGraph, BarGraph, HorizontalBarGraph, PieGraph, or ScatterGraph
|
669
|
+
#--
|
670
|
+
# TODO: that sucks. i want: line, bar, hbar, pie, scatter, spark
|
671
|
+
#++
|
672
|
+
# * options[:columns]
|
673
|
+
# a comma separated list of data_column ids
|
674
|
+
# * options[:x_axis_column]
|
675
|
+
# the x-axis data_column id
|
676
|
+
#
|
677
|
+
# optional parameters
|
678
|
+
# * options[:join_on_columns]
|
679
|
+
# a comma separated list of join data_column ids
|
680
|
+
# * options[:group_by_columns]
|
681
|
+
# a comma separated list of group by data_column ids
|
682
|
+
# * options[:aggregation_function]
|
683
|
+
# aggregation functions for group_by_columns.
|
684
|
+
# one of: AvgFunction, ConcatFunction, MaxFunction, MinFunction,
|
685
|
+
# SumFunction, CountFunction, DistinctCountFunction
|
686
|
+
# * options[:order_by_column]
|
687
|
+
# a comma separated list of order-by data_column ids
|
688
|
+
# * options[:order_by_direction]
|
689
|
+
# which sort to apply to the order_by_column.
|
690
|
+
# one of: ASC, DESC, ALPHABETICAL, UNSORTED
|
691
|
+
# * options[:time_scale]
|
692
|
+
# time-scale of your X-axis, if applicable. one of: YEARLY,
|
693
|
+
# QUARTERLY, MONTHLY, WEEKLY, DAILY, HOURLY, BY_MINUTE, BY_SECOND
|
694
|
+
# * options[:time_range]
|
695
|
+
# time-range of your X-axis, if applicable. Swivel understands many
|
696
|
+
# human readable date/time formats. Examples: "3 years ago to now",
|
697
|
+
# "1 month", "1992-2004".
|
698
|
+
# * options[:scale]
|
699
|
+
# y-scale of the graph you're creating, if applicable. one
|
700
|
+
# of: ABSOLUTE, AVERAGE, RANGE, RELATIVE, PERCENT
|
701
|
+
|
702
|
+
def create_graph options = Hash.new, persist = false
|
703
|
+
options.merge! :save => 'true' if persist
|
704
|
+
unless options.has_key? :order_by_column
|
705
|
+
options.merge! :order_by_column => options[:columns].split(',').first,
|
706
|
+
:order_by_direction => 'DESC'
|
707
|
+
end
|
708
|
+
call '/rest/graphs', options, :post
|
709
|
+
end
|
515
710
|
end
|
516
711
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: swivel
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.0.15
|
7
|
+
date: 2007-07-01 00:00:00 -07:00
|
8
8
|
summary: Ruby interface to the Swivel API.
|
9
9
|
require_paths:
|
10
10
|
- lib
|