googletastic 0.0.5.1 → 0.0.5.2

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.textile CHANGED
@@ -46,4 +46,6 @@ http://productideas.appspot.com/#15/e=220cb&t=cabc1
46
46
  # Publish the docs as plain text.
47
47
  # Textile and Markdown support
48
48
  # Better font support in PDF documents
49
- # Everything Should Be TAGGABLE
49
+ # Everything Should Be TAGGABLE
50
+
51
+ Takes about 5-10 minutes for google to update the feed so that "updated_at" < 1.day.ago if you just made a change.
data/Rakefile CHANGED
@@ -39,6 +39,7 @@ spec = Gem::Specification.new do |s|
39
39
  s.add_dependency("activesupport", ">= 2.3.5")
40
40
  s.add_dependency("activerecord", ">= 2.3.5")
41
41
  s.add_dependency("gdata")
42
+ s.add_dependency("rspec")
42
43
  end
43
44
 
44
45
  desc "Create .gemspec file (useful for github)"
data/lib/googletastic.rb CHANGED
@@ -59,7 +59,7 @@ end
59
59
 
60
60
  module Googletastic
61
61
  # :stopdoc:
62
- VERSION = '0.0.5.1'
62
+ VERSION = '0.0.5.2'
63
63
  # :startdoc
64
64
  class << self; attr_accessor :keys, :clients, :options; end
65
65
 
@@ -6,12 +6,13 @@ class Googletastic::Base < Hash
6
6
  include Googletastic::Mixins::Parsing
7
7
  include Googletastic::Mixins::Finders
8
8
  include Googletastic::Mixins::Actions
9
+ include Googletastic::Mixins::Pagination
9
10
 
10
11
  # ID's are specifically the hash key for each entry.
11
12
  # They don't include the url for finding the document,
12
13
  # which can be inferred from the "action" you're taking on it,
13
14
  # and the general api.
14
- attr_accessor :id, :etag
15
+ attr_accessor :id, :etag, :head
15
16
  attr_accessor :acl
16
17
  attr_accessor :created_at, :updated_at
17
18
  attr_accessor :attachment_path # for docs, images...
@@ -168,6 +168,7 @@ class Googletastic::Document < Googletastic::Base
168
168
  end
169
169
 
170
170
  def unmarshall(xml)
171
+ head = unmarshall_head(xml)
171
172
  records = xml.xpath("//atom:entry", ns_tag("atom")).collect do |record|
172
173
  etag = record["etag"].to_s
173
174
  kind = title = id = categories = value = nil # reset
@@ -191,7 +192,8 @@ class Googletastic::Document < Googletastic::Base
191
192
  :plain_id => plain_id,
192
193
  :ext => File.extname(title),
193
194
  :created_at => DateTime.parse(created_at),
194
- :updated_at => DateTime.parse(updated_at)
195
+ :updated_at => DateTime.parse(updated_at),
196
+ :head => head
195
197
  )
196
198
  end
197
199
  records
@@ -0,0 +1,30 @@
1
+ class Googletastic::Head < Googletastic::Base
2
+
3
+ attr_accessor :title, :total_results, :start_index, :per_page
4
+
5
+ class << self
6
+
7
+ def unmarshall(xml)
8
+ feed = xml.xpath("atom:feed", ns_tag("atom")).first
9
+ return nil unless feed
10
+
11
+ id = feed.xpath("atom:id", ns_tag("atom")).text
12
+ updated_at = feed.xpath("atom:updated", ns_tag("atom")).text
13
+ title = feed.xpath("atom:title", ns_tag("atom")).text
14
+ total_results = feed.xpath("openSearch:totalResults", ns_tag("openSearch")).text
15
+ start_index = feed.xpath("openSearch:startIndex", ns_tag("openSearch")).text
16
+ per_page = feed.xpath("openSearch:itemsPerPage", ns_tag("openSearch")).text
17
+
18
+ head = Googletastic::Head.new(
19
+ :id => id,
20
+ :title => title,
21
+ :updated_at => DateTime.parse(updated_at),
22
+ :total_results => total_results,
23
+ :start_index => start_index,
24
+ :per_page => per_page
25
+ )
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -5,6 +5,13 @@ module Googletastic::Mixins::Finders
5
5
  end
6
6
 
7
7
  module ClassMethods
8
+
9
+ def head(*args)
10
+ options = args.extract_options!
11
+ result = find_by_api(options.merge(:limit => 1)).first
12
+ result.nil? ? nil : result.head
13
+ end
14
+
8
15
  def first(*args)
9
16
  find(:first, *args)
10
17
  end
@@ -3,7 +3,7 @@ module Googletastic::Mixins::Namespaces
3
3
  NAMESPACES = {
4
4
  "gphoto" => "http://schemas.google.com/photos/2007",
5
5
  "media" => "http://search.yahoo.com/mrss",
6
- "openSearch" => "http://a9.com/-/spec/opensearchrss/1.0/",
6
+ "openSearch" => "http://a9.com/-/spec/opensearch/1.1/",
7
7
  "docs" => "http://schemas.google.com/docs/2007",
8
8
  "atom" => "http://www.w3.org/2005/Atom",
9
9
  "gd" => "http://schemas.google.com/g/2005",
@@ -0,0 +1,32 @@
1
+ module Googletastic::Mixins::Pagination
2
+
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ base.class_eval do
6
+ include InstanceMethods
7
+ end
8
+ end
9
+
10
+ module ClassMethods
11
+
12
+ # needs to track category and such
13
+ def paginate(*args, &block)
14
+ options = args.extract_options!
15
+
16
+ per_page = options[:per_page]
17
+ page = options[:page] || 1
18
+
19
+
20
+ end
21
+
22
+ end
23
+
24
+ module InstanceMethods
25
+
26
+ def total_results
27
+ self.head ? self.head.total_results : 1
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -29,6 +29,10 @@ module Googletastic::Mixins::Parsing
29
29
  @cache_result == true
30
30
  end
31
31
 
32
+ def unmarshall_head(xml)
33
+ Googletastic::Head.unmarshall(xml)
34
+ end
35
+
32
36
  # implement in subclasses
33
37
  def unmarshall(xml_records)
34
38
  raise "Implemnent in subclasses"
@@ -11,7 +11,7 @@ module Googletastic::Mixins::Requesting
11
11
 
12
12
  def valid_queries
13
13
  {
14
- :limit => "max-result",
14
+ :limit => "max-results",
15
15
  :offset => "start-index",
16
16
  :start => "start-index",
17
17
  :end => "end-index",
@@ -40,6 +40,7 @@ class Googletastic::Row < Googletastic::Base
40
40
  end
41
41
 
42
42
  def unmarshall(xml)
43
+ head = unmarshall_head(xml)
43
44
  records = xml.xpath("//atom:entry", ns_tag("atom")).collect do |record|
44
45
  etag = record["etag"].to_s
45
46
  id = record.xpath("atom:id", ns_tag("atom")).first.text
@@ -66,7 +67,7 @@ class Googletastic::Row < Googletastic::Base
66
67
  :worksheet_id => worksheet_id,
67
68
  :data => data,
68
69
  :updated_at => DateTime.parse(updated_at),
69
- :raw => record.to_xml
70
+ :head => head
70
71
  )
71
72
  end
72
73
  records
@@ -14,10 +14,16 @@ class Googletastic::Spreadsheet < Googletastic::Base
14
14
  @table ||= Googletastic::Table.first(:key => self.id)
15
15
  end
16
16
 
17
+ # some property on google
17
18
  def num_rows
18
19
  worksheet.num_rows
19
20
  end
20
21
 
22
+ # what you want
23
+ def total_rows
24
+ @total_rows ||= Googletastic::Row.head(:key => self.id, :worksheet_id => worksheet.id).total_results
25
+ end
26
+
21
27
  def rows
22
28
  @rows ||= Googletastic::Row.all(:key => self.id, :worksheet_id => worksheet.id)
23
29
  end
@@ -52,6 +58,7 @@ class Googletastic::Spreadsheet < Googletastic::Base
52
58
  end
53
59
 
54
60
  def unmarshall(xml)
61
+ head = unmarshall_head(xml)
55
62
  records = xml.xpath("//atom:entry", ns_tag("atom")).collect do |record|
56
63
  etag = record["etag"].to_s
57
64
  id = record.xpath("atom:id", ns_tag("atom")).first.text.gsub("http://spreadsheets.google.com/feeds/spreadsheets/", "")
@@ -69,7 +76,7 @@ class Googletastic::Spreadsheet < Googletastic::Base
69
76
  :title => title,
70
77
  :content => content,
71
78
  :updated_at => DateTime.parse(updated_at),
72
- :raw => record.to_xml
79
+ :head => head
73
80
  )
74
81
  end
75
82
  records
@@ -20,6 +20,7 @@ class Googletastic::Worksheet < Googletastic::Base
20
20
  end
21
21
 
22
22
  def unmarshall(xml)
23
+ head = unmarshall_head(xml)
23
24
  records = xml.xpath("//atom:entry", ns_tag("atom")).collect do |record|
24
25
  id = record.xpath("atom:id", ns_tag("atom")).first.text
25
26
  ids = id =~ /http:\/\/spreadsheets\.google\.com\/feeds\/worksheets\/([^\/]+)\/([^\/]+)/
@@ -39,7 +40,7 @@ class Googletastic::Worksheet < Googletastic::Base
39
40
  :num_rows => num_rows,
40
41
  :num_columns => num_columns,
41
42
  :updated_at => DateTime.parse(updated_at),
42
- :raw => record.to_xml
43
+ :head => head
43
44
  )
44
45
 
45
46
  worksheet
@@ -7,12 +7,25 @@ describe Googletastic::Spreadsheet do
7
7
  puts spreadsheet.inspect
8
8
  spreadsheet.should be_an_instance_of(Googletastic::Spreadsheet)
9
9
  end
10
+
10
11
  it "should retrieve a list of spreadsheets" do
11
12
  spreadsheets = Googletastic::Spreadsheet.all
12
- puts spreadsheets.inspect
13
- spreadsheets.each do |sheet|
14
- puts sheet.num_rows.inspect
15
- end
13
+ end
14
+
15
+ it "should get the head for a list of spreadsheets" do
16
+ spreadsheets = Googletastic::Spreadsheet.all
17
+ first = spreadsheets.first
18
+ first.head.should_not be_nil
19
+ end
20
+
21
+ it "should be able to get a head by itself" do
22
+ head = Googletastic::Spreadsheet.head
23
+ head.should_not be_nil
24
+ end
25
+
26
+ it "should get total number of rows" do
27
+ sheet = Googletastic::Spreadsheet.first
28
+ puts sheet.total_rows.inspect
16
29
  end
17
30
 
18
31
  =begin
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: googletastic
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 95
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 0
8
9
  - 5
9
- - 1
10
- version: 0.0.5.1
10
+ - 2
11
+ version: 0.0.5.2
11
12
  platform: ruby
12
13
  authors:
13
14
  - Lance Pollard
@@ -22,9 +23,11 @@ dependencies:
22
23
  name: nokogiri
23
24
  prerelease: false
24
25
  requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
25
27
  requirements:
26
28
  - - ">="
27
29
  - !ruby/object:Gem::Version
30
+ hash: 3
28
31
  segments:
29
32
  - 0
30
33
  version: "0"
@@ -34,9 +37,11 @@ dependencies:
34
37
  name: activesupport
35
38
  prerelease: false
36
39
  requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
37
41
  requirements:
38
42
  - - ">="
39
43
  - !ruby/object:Gem::Version
44
+ hash: 9
40
45
  segments:
41
46
  - 2
42
47
  - 3
@@ -48,9 +53,11 @@ dependencies:
48
53
  name: activerecord
49
54
  prerelease: false
50
55
  requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
51
57
  requirements:
52
58
  - - ">="
53
59
  - !ruby/object:Gem::Version
60
+ hash: 9
54
61
  segments:
55
62
  - 2
56
63
  - 3
@@ -62,14 +69,30 @@ dependencies:
62
69
  name: gdata
63
70
  prerelease: false
64
71
  requirement: &id004 !ruby/object:Gem::Requirement
72
+ none: false
65
73
  requirements:
66
74
  - - ">="
67
75
  - !ruby/object:Gem::Version
76
+ hash: 3
68
77
  segments:
69
78
  - 0
70
79
  version: "0"
71
80
  type: :runtime
72
81
  version_requirements: *id004
82
+ - !ruby/object:Gem::Dependency
83
+ name: rspec
84
+ prerelease: false
85
+ requirement: &id005 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ hash: 3
91
+ segments:
92
+ - 0
93
+ version: "0"
94
+ type: :runtime
95
+ version_requirements: *id005
73
96
  description: "Googletastic: A New Way of Googling"
74
97
  email: lancejpollard@gmail.com
75
98
  executables: []
@@ -98,6 +121,7 @@ files:
98
121
  - lib/googletastic/ext.rb
99
122
  - lib/googletastic/form.rb
100
123
  - lib/googletastic/group.rb
124
+ - lib/googletastic/head.rb
101
125
  - lib/googletastic/helpers/document.rb
102
126
  - lib/googletastic/helpers/event.rb
103
127
  - lib/googletastic/helpers/form.rb
@@ -107,6 +131,7 @@ files:
107
131
  - lib/googletastic/mixins/attributes.rb
108
132
  - lib/googletastic/mixins/finders.rb
109
133
  - lib/googletastic/mixins/namespaces.rb
134
+ - lib/googletastic/mixins/pagination.rb
110
135
  - lib/googletastic/mixins/parsing.rb
111
136
  - lib/googletastic/mixins/requesting.rb
112
137
  - lib/googletastic/mixins.rb
@@ -170,23 +195,27 @@ rdoc_options: []
170
195
  require_paths:
171
196
  - lib
172
197
  required_ruby_version: !ruby/object:Gem::Requirement
198
+ none: false
173
199
  requirements:
174
200
  - - ">="
175
201
  - !ruby/object:Gem::Version
202
+ hash: 3
176
203
  segments:
177
204
  - 0
178
205
  version: "0"
179
206
  required_rubygems_version: !ruby/object:Gem::Requirement
207
+ none: false
180
208
  requirements:
181
209
  - - ">="
182
210
  - !ruby/object:Gem::Version
211
+ hash: 3
183
212
  segments:
184
213
  - 0
185
214
  version: "0"
186
215
  requirements: []
187
216
 
188
217
  rubyforge_project: googletastic
189
- rubygems_version: 1.3.6
218
+ rubygems_version: 1.3.7
190
219
  signing_key:
191
220
  specification_version: 3
192
221
  summary: More than Syncing Rails Apps with the Google Data API