google_storage 0.0.3 → 0.1.1

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/doc/index.html ADDED
@@ -0,0 +1,153 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.7.2
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ relpath = '';
19
+ if (relpath != '') relpath += '/';
20
+ </script>
21
+
22
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
25
+
26
+
27
+ </head>
28
+ <body>
29
+ <script type="text/javascript" charset="utf-8">
30
+ if (window.top.frames.main) document.body.className = 'frames';
31
+ </script>
32
+
33
+ <div id="header">
34
+ <div id="menu">
35
+
36
+ <a href="_index.html" title="Index">Index</a> &raquo;
37
+ <span class="title">File: README</span>
38
+
39
+
40
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
41
+ </div>
42
+
43
+ <div id="search">
44
+
45
+ <a id="class_list_link" href="#">Class List</a>
46
+
47
+ <a id="method_list_link" href="#">Method List</a>
48
+
49
+ <a id="file_list_link" href="#">File List</a>
50
+
51
+ </div>
52
+ <div class="clear"></div>
53
+ </div>
54
+
55
+ <iframe id="search_frame"></iframe>
56
+
57
+ <div id="content"><div id='filecontents'><h1>Google Storage using <span class="caps">API</span> v2</h1>
58
+ <p>I wrote this gem because the only google storage gems I could find already written were either written a while ago and only set up to use the old
59
+ version of Google&#8217;s <span class="caps">API</span> or they were dependent on Gems that don&#8217;t run properly on&#8230; dare I say it&#8230; windows.. :) Apologies, I&#8217;m without choice
60
+ at the moment, but anyways, this gem should run fine on all platforms and I&#8217;ve tried to keep dependencies to a minimum. Let me know if you find
61
+ any bugs though ok and feel free to contribute.</p>
62
+ <p>Google Storage is still a little experimental at the moment and the responses back from google differ quite a bit from each other.
63
+ I&#8217;ve tried to parse all of these different responses and turn them into a fairly common type of response object though.</p>
64
+ <h2>Setup Guide</h2>
65
+ <p>There&#8217;s a couple of steps to follow in order to setup this gem. The new Google Storage APIv2 uses OAuth 2.0 to authenticate requests, you can read up
66
+ more on the nitty gritty if you like here: <a href="http://code.google.com/apis/accounts/docs/OAuth2.html">Google&#8217;s OAuth2 Guide</a></p>
67
+ <p>I&#8217;ll try and add client side support also once this gem is up and running properly, but for the moment it&#8217;s only setup to support server side web
68
+ applications.</p>
69
+ <p>But it&#8217;s also possible to run this gem from the command line if you want.</p>
70
+ <h2>Install the google_storage Gem</h2>
71
+ <p>Include the google_storage gem in your Gemfile and install config files
72
+ <pre class="code"><span class='id gem'>gem</span> <span class='id “google_storage”'>“google_storage”</span>
73
+ <span class='id bundle'>bundle</span> <span class='id install'>install</span>
74
+ </pre>
75
+ Then in your Rails application directory run:
76
+ <pre class="code"><span class='id rails'>rails</span> <span class='id generate'>generate</span> <span class='label'>google_storage:</span><span class='id install'>install</span>
77
+ </pre>
78
+ This will generate some rake tasks a google_storage.yml file in your config directory.
79
+ <pre class="code"><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>Application</span><span class='regexp_end'>/config</span></span><span class='op'>/</span><span class='id google_storage'>google_storage</span><span class='period'>.</span><span class='id yml'>yml</span>
80
+ <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>Application</span><span class='regexp_end'>/lib</span></span><span class='op'>/</span><span class='id tasks'>tasks</span><span class='op'>/</span><span class='id google_storage'>google_storage</span><span class='period'>.</span><span class='id task'>task</span>
81
+ </pre></p>
82
+ <h2>Setup your Google Project Client ID&#8217;s</h2>
83
+ <p>Visit <a href="http://code.google.com/apis/storage/">Google Storage</a> and select activate Google Storage.
84
+ If you haven&#8217;t already got a project set up, it&#8217;ll prompt you to create one.</p>
85
+ <p>When you have access to your Google APIs Console, you need to enable Google Storage. When you select enable, you&#8217;ll be shown terms and conditions
86
+ and you&#8217;ll then need to setup billing. They have full pricing details there for you to check out as well but I think it&#8217;s pretty reasonable..</p>
87
+ <p>Create a client ID for your project
88
+ On the left menu select &#8220;<span class="caps">API</span> Access&#8221; and then &#8220;Create an OAuth 2.0 client ID&#8221;
89
+ Enter your project&#8217;s name and brand information.</p>
90
+ <p>Select Application type = Web Application and enter your site&#8217;s information. If you&#8217;re using localhost and running
91
+ locally make sure you include the port number you&#8217;re using as well.</p>
92
+ <h2>Enter your Client ID details into your google_storage.yml</h2>
93
+ <p>This is the example google_storage.yml file that is copied into your config directory of your rails application.</p>
94
+ <p>Follow the steps to obtain a refresh token from google.</p>
95
+ <pre class="code">
96
+ #Replace the following example ids with your own
97
+
98
+ google_config:
99
+ x-goog-project-id: 825628431245
100
+
101
+ #Client ID for web applications
102
+ web_applications:
103
+ client_id: 825628431245.apps.googleusercontent.com
104
+ client_secret: lpNYX5SPFDB6N-40lyMIPlQn
105
+ redirect_uris: 'http://localhost:3000/example'
106
+ js_origins: 'http://localhost:3000'
107
+
108
+ #refresh_token: replace this line with a refresh token from google, read below on how to get one
109
+
110
+ #You need to acquire a refresh token from google so that the google_storage gem
111
+ #can acquire access tokens whenever it needs to make new requests
112
+
113
+ # 1. Make sure you've signed up for Google Storage and filled in the above client ID details
114
+ # for your web application first
115
+ #
116
+ # 2. Depending on how much access you want to grant to your application run
117
+ # ONE of the following from your applications root directory. If you intend to be able to create and
118
+ # destroy objects and buckets and also be able to set permissions then use full_control
119
+ #
120
+ # rake gs:grant:read_only
121
+ # rake gs:grant:read_write
122
+ # rake gs:grant:full_control
123
+ #
124
+ # 3. Step 2 will generate a URL for you. Copy and paste the URL into a browser and you should be prompted
125
+ # by google to authorize the request by logging into your browser using the google email account you setup
126
+ # your google storage account with
127
+ #
128
+ # 4. When you 'allow access' you'll be redirected back to the redirect URL you setup in your client ID
129
+ # Your redirect URL should now include an authorization code. It'll look something like this:
130
+ # http://localhost:3000/example?code=4/WvlklnjtybhRJpaKpmDYrzIhAzyx
131
+ #
132
+ # 5. Copy that code from your URL and run the following rake task from your application directory
133
+ #
134
+ # rake gs:refresh_token['paste_your_auth_code_here']
135
+ # Example: rake gs:refresh_token['4/WvlklnjtybhRJpaKpmDYrzIhAzyx']
136
+ #
137
+ # 6. If everything worked you should see something that looks like the following:
138
+ #
139
+ # refresh_token: 1/x4X-U57snRMkLIWWYHWLCXPbfcnyGsdfx04sWAiG_1k
140
+ #
141
+ # 7. Copy and paste the refresh_token into this file. Your application should now be able to make calls to your
142
+ # Google Storage API
143
+ </pre>
144
+ <p>Once you&#8217;ve acquired your refresh_token you can now make calls to the <span class="caps">API</span>. Refer to the examples dir on how to use.</p></div></div>
145
+
146
+ <div id="footer">
147
+ Generated on Tue Jun 28 10:28:04 2011 by
148
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
149
+ 0.7.2 (ruby-1.9.2).
150
+ </div>
151
+
152
+ </body>
153
+ </html>
data/doc/js/app.js ADDED
@@ -0,0 +1,205 @@
1
+ function createSourceLinks() {
2
+ $('.method_details_list .source_code').
3
+ before("<span class='showSource'>[<a href='#' class='toggleSource'>View source</a>]</span>");
4
+ $('.toggleSource').toggle(function() {
5
+ $(this).parent().next().slideDown(100);
6
+ $(this).text("Hide source");
7
+ },
8
+ function() {
9
+ $(this).parent().next().slideUp(100);
10
+ $(this).text("View source");
11
+ });
12
+ }
13
+
14
+ function createDefineLinks() {
15
+ var tHeight = 0;
16
+ $('.defines').after(" <a href='#' class='toggleDefines'>more...</a>");
17
+ $('.toggleDefines').toggle(function() {
18
+ tHeight = $(this).parent().prev().height();
19
+ $(this).prev().show();
20
+ $(this).parent().prev().height($(this).parent().height());
21
+ $(this).text("(less)");
22
+ },
23
+ function() {
24
+ $(this).prev().hide();
25
+ $(this).parent().prev().height(tHeight);
26
+ $(this).text("more...");
27
+ });
28
+ }
29
+
30
+ function createFullTreeLinks() {
31
+ var tHeight = 0;
32
+ $('.inheritanceTree').toggle(function() {
33
+ tHeight = $(this).parent().prev().height();
34
+ $(this).parent().toggleClass('showAll');
35
+ $(this).text("(hide)");
36
+ $(this).parent().prev().height($(this).parent().height());
37
+ },
38
+ function() {
39
+ $(this).parent().toggleClass('showAll');
40
+ $(this).parent().prev().height(tHeight);
41
+ $(this).text("show all");
42
+ });
43
+ }
44
+
45
+ function fixBoxInfoHeights() {
46
+ $('dl.box dd.r1, dl.box dd.r2').each(function() {
47
+ $(this).prev().height($(this).height());
48
+ });
49
+ }
50
+
51
+ function searchFrameLinks() {
52
+ $('#method_list_link').click(function() {
53
+ toggleSearchFrame(this, relpath + 'method_list.html');
54
+ });
55
+
56
+ $('#class_list_link').click(function() {
57
+ toggleSearchFrame(this, relpath + 'class_list.html');
58
+ });
59
+
60
+ $('#file_list_link').click(function() {
61
+ toggleSearchFrame(this, relpath + 'file_list.html');
62
+ });
63
+ }
64
+
65
+ function toggleSearchFrame(id, link) {
66
+ var frame = $('#search_frame');
67
+ $('#search a').removeClass('active').addClass('inactive');
68
+ if (frame.attr('src') == link && frame.css('display') != "none") {
69
+ frame.slideUp(100);
70
+ $('#search a').removeClass('active inactive');
71
+ }
72
+ else {
73
+ $(id).addClass('active').removeClass('inactive');
74
+ frame.attr('src', link).slideDown(100);
75
+ }
76
+ }
77
+
78
+ function linkSummaries() {
79
+ $('.summary_signature').click(function() {
80
+ document.location = $(this).find('a').attr('href');
81
+ });
82
+ }
83
+
84
+ function framesInit() {
85
+ if (window.top.frames.main) {
86
+ document.body.className = 'frames';
87
+ $('#menu .noframes a').attr('href', document.location);
88
+ $('html head title', window.parent.document).text($('html head title').text());
89
+ }
90
+ }
91
+
92
+ function keyboardShortcuts() {
93
+ if (window.top.frames.main) return;
94
+ $(document).keypress(function(evt) {
95
+ if (evt.altKey || evt.ctrlKey || evt.metaKey || evt.shiftKey) return;
96
+ if (typeof evt.target !== "undefined" &&
97
+ (evt.target.nodeName == "INPUT" ||
98
+ evt.target.nodeName == "TEXTAREA")) return;
99
+ switch (evt.charCode) {
100
+ case 67: case 99: $('#class_list_link').click(); break; // 'c'
101
+ case 77: case 109: $('#method_list_link').click(); break; // 'm'
102
+ case 70: case 102: $('#file_list_link').click(); break; // 'f'
103
+ default: break;
104
+ }
105
+ });
106
+ }
107
+
108
+ function summaryToggle() {
109
+ $('.summary_toggle').click(function() {
110
+ localStorage.summaryCollapsed = $(this).text();
111
+ $(this).text($(this).text() == "collapse" ? "expand" : "collapse");
112
+ var next = $(this).parent().parent().next();
113
+ if (next.hasClass('compact')) {
114
+ next.toggle();
115
+ next.next().toggle();
116
+ }
117
+ else if (next.hasClass('summary')) {
118
+ var list = $('<ul class="summary compact" />');
119
+ list.html(next.html());
120
+ list.find('.summary_desc, .note').remove();
121
+ list.find('a').each(function() {
122
+ $(this).html($(this).find('strong').html());
123
+ $(this).parent().html($(this)[0].outerHTML);
124
+ });
125
+ next.before(list);
126
+ next.toggle();
127
+ }
128
+ return false;
129
+ });
130
+ if (localStorage) {
131
+ if (localStorage.summaryCollapsed == "collapse") $('.summary_toggle').click();
132
+ else localStorage.summaryCollapsed = "expand";
133
+ }
134
+ }
135
+
136
+ function fixOutsideWorldLinks() {
137
+ $('a').each(function() {
138
+ if (window.location.host != this.host) this.target = '_parent';
139
+ });
140
+ }
141
+
142
+ function generateTOC() {
143
+ if ($('#filecontents').length === 0) return;
144
+ var _toc = $('<ol class="top"></ol>');
145
+ var show = false;
146
+ var toc = _toc;
147
+ var counter = 0;
148
+ var tags = ['h2', 'h3', 'h4', 'h5', 'h6'];
149
+ var i;
150
+ if ($('#filecontents h1').length > 1) tags.unshift('h1');
151
+ for (i = 0; i < tags.length; i++) { tags[i] = '#filecontents ' + tags[i]; }
152
+ var lastTag = parseInt(tags[0][1], 10);
153
+ $(tags.join(', ')).each(function() {
154
+ if (this.id == "filecontents") return;
155
+ show = true;
156
+ var thisTag = parseInt(this.tagName[1], 10);
157
+ if (this.id.length === 0) {
158
+ var proposedId = $(this).text().replace(/[^a-z0-9-]/ig, '_');
159
+ if ($('#' + proposedId).length > 0) { proposedId += counter; counter++; }
160
+ this.id = proposedId;
161
+ }
162
+ if (thisTag > lastTag) {
163
+ for (i = 0; i < thisTag - lastTag; i++) {
164
+ var tmp = $('<ol/>'); toc.append(tmp); toc = tmp;
165
+ }
166
+ }
167
+ if (thisTag < lastTag) {
168
+ for (i = 0; i < lastTag - thisTag; i++) toc = toc.parent();
169
+ }
170
+ toc.append('<li><a href="#' + this.id + '">' + $(this).text() + '</a></li>');
171
+ lastTag = thisTag;
172
+ });
173
+ if (!show) return;
174
+ html = '<div id="toc"><p class="title"><a class="hide_toc" href="#"><strong>Table of Contents</strong></a> <small>(<a href="#" class="float_toc">left</a>)</small></p></div>';
175
+ $('#content').prepend(html);
176
+ $('#toc').append(_toc);
177
+ $('#toc .hide_toc').toggle(function() {
178
+ $('#toc .top').slideUp('fast');
179
+ $('#toc').toggleClass('hidden');
180
+ $('#toc .title small').toggle();
181
+ }, function() {
182
+ $('#toc .top').slideDown('fast');
183
+ $('#toc').toggleClass('hidden');
184
+ $('#toc .title small').toggle();
185
+ });
186
+ $('#toc .float_toc').toggle(function() {
187
+ $(this).text('float');
188
+ $('#toc').toggleClass('nofloat');
189
+ }, function() {
190
+ $(this).text('left');
191
+ $('#toc').toggleClass('nofloat');
192
+ });
193
+ }
194
+
195
+ $(framesInit);
196
+ $(createSourceLinks);
197
+ $(createDefineLinks);
198
+ $(createFullTreeLinks);
199
+ $(fixBoxInfoHeights);
200
+ $(searchFrameLinks);
201
+ $(linkSummaries);
202
+ $(keyboardShortcuts);
203
+ $(summaryToggle);
204
+ $(fixOutsideWorldLinks);
205
+ $(generateTOC);
@@ -0,0 +1,150 @@
1
+ var inSearch = null;
2
+ var searchIndex = 0;
3
+ var searchCache = [];
4
+ var searchString = '';
5
+
6
+ function fullListSearch() {
7
+ // generate cache
8
+ searchCache = [];
9
+ $('#full_list li').each(function() {
10
+ var link = $(this).find('.object_link a');
11
+ searchCache.push({name:link.text(), node:$(this), link:link});
12
+ });
13
+
14
+ $('#search input').keyup(function() {
15
+ searchString = this.value.toLowerCase();
16
+ if (searchString === "") {
17
+ clearTimeout(inSearch);
18
+ inSearch = null;
19
+ $('#full_list, #content').removeClass('insearch');
20
+ $('#full_list li').removeClass('found').each(function() {
21
+
22
+ var link = $(this).find('.object_link a');
23
+ link.text(link.text());
24
+ });
25
+ if (clicked) {
26
+ clicked.parents('ul').each(function() {
27
+ $(this).removeClass('collapsed').prev().removeClass('collapsed');
28
+ });
29
+ }
30
+ highlight();
31
+ }
32
+ else {
33
+ if (inSearch) clearTimeout(inSearch);
34
+ searchIndex = 0;
35
+ lastRowClass = '';
36
+ $('#full_list, #content').addClass('insearch');
37
+ $('#noresults').text('');
38
+ searchItem();
39
+ }
40
+ });
41
+
42
+ $('#search input').focus();
43
+ $('#full_list').after("<div id='noresults'></div>");
44
+ }
45
+
46
+ var lastRowClass = '';
47
+ function searchItem() {
48
+ for (var i = 0; i < searchCache.length / 50; i++) {
49
+ var item = searchCache[searchIndex];
50
+ if (item.name.toLowerCase().indexOf(searchString) == -1) {
51
+ item.node.removeClass('found');
52
+ }
53
+ else {
54
+ item.node.css('padding-left', '10px').addClass('found');
55
+ item.node.removeClass(lastRowClass).addClass(lastRowClass == 'r1' ? 'r2' : 'r1');
56
+ lastRowClass = item.node.hasClass('r1') ? 'r1' : 'r2';
57
+ item.link.html(item.name.replace(new RegExp("(" +
58
+ searchString.replace(/([\/.*+?|()\[\]{}\\])/g, "\\$1") + ")", "ig"),
59
+ '<strong>$1</strong>'));
60
+ }
61
+
62
+ if (searchCache.length === searchIndex + 1) {
63
+ searchDone();
64
+ return;
65
+ }
66
+ else {
67
+ searchIndex++;
68
+ }
69
+ }
70
+ inSearch = setTimeout('searchItem()', 0);
71
+ }
72
+
73
+ function searchDone() {
74
+ highlight(true);
75
+ if ($('#full_list li:visible').size() === 0) {
76
+ $('#noresults').text('No results were found.').hide().fadeIn();
77
+ }
78
+ else {
79
+ $('#noresults').text('');
80
+ }
81
+ $('#content').removeClass('insearch');
82
+ clearTimeout(inSearch);
83
+ inSearch = null;
84
+ }
85
+
86
+ clicked = null;
87
+ function linkList() {
88
+ $('#full_list li, #full_list li a:last').click(function(evt) {
89
+ if ($(this).hasClass('toggle')) return true;
90
+ if (this.tagName.toLowerCase() == "li") {
91
+ var toggle = $(this).children('a.toggle');
92
+ if (toggle.size() > 0 && evt.pageX < toggle.offset().left) {
93
+ toggle.click();
94
+ return false;
95
+ }
96
+ }
97
+ if (clicked) clicked.removeClass('clicked');
98
+ var win = window.top.frames.main ? window.top.frames.main : window.parent;
99
+ if (this.tagName.toLowerCase() == "a") {
100
+ clicked = $(this).parent('li').addClass('clicked');
101
+ win.location = this.href;
102
+ }
103
+ else {
104
+ clicked = $(this).addClass('clicked');
105
+ win.location = $(this).find('a:last').attr('href');
106
+ }
107
+ return false;
108
+ });
109
+ }
110
+
111
+ function collapse() {
112
+ if (!$('#full_list').hasClass('class')) return;
113
+ $('#full_list.class a.toggle').click(function() {
114
+ $(this).parent().toggleClass('collapsed').next().toggleClass('collapsed');
115
+ highlight();
116
+ return false;
117
+ });
118
+ $('#full_list.class ul').each(function() {
119
+ $(this).addClass('collapsed').prev().addClass('collapsed');
120
+ });
121
+ $('#full_list.class').children().removeClass('collapsed');
122
+ highlight();
123
+ }
124
+
125
+ function highlight(no_padding) {
126
+ var n = 1;
127
+ $('#full_list li:visible').each(function() {
128
+ var next = n == 1 ? 2 : 1;
129
+ $(this).removeClass("r" + next).addClass("r" + n);
130
+ if (!no_padding && $('#full_list').hasClass('class')) {
131
+ $(this).css('padding-left', (10 + $(this).parents('ul').size() * 15) + 'px');
132
+ }
133
+ n = next;
134
+ });
135
+ }
136
+
137
+ function escapeShortcut() {
138
+ $(document).keydown(function(evt) {
139
+ if (evt.which == 27) {
140
+ $('#search_frame', window.top.document).slideUp(100);
141
+ $('#search a', window.top.document).removeClass('active inactive');
142
+ $(window.top).focus();
143
+ }
144
+ });
145
+ }
146
+
147
+ $(escapeShortcut);
148
+ $(fullListSearch);
149
+ $(linkList);
150
+ $(collapse);