Skip to content

Commit

Permalink
Major update, see History: v0.2.0
Browse files Browse the repository at this point in the history
  • Loading branch information
marcandre committed Nov 17, 2009
1 parent c595757 commit a1d67d4
Show file tree
Hide file tree
Showing 20 changed files with 341 additions and 245 deletions.
22 changes: 19 additions & 3 deletions History.txt
@@ -1,6 +1,22 @@
=== 1.0.0 / 2008-05-19
=== 0.2.0 / 2009-11-17

* 1 major enhancement
* New features:
* results can use [] and []= for lookup and seting
* allows results to be open structs (default) or hash (by requiring 'googleajax/as_hash' instead)

* Birthday!
* bug fixes:
* Search.web(...).count now returns an int, not a string
* many calls were not passing the args argument to #get
* Feed.load used to return an open struct with only one method called 'feed' that was a hash. It now returns the feed correctly.

* Behind the scene changes:
* specs
* shorter, cleaner code
* links to google api doc in rdoc
* most classes are now modules
* small optimizations
* All #get now requires arg (see bug fix)

=== 0.1.0 / 2008-05-19

* Initial Release
11 changes: 0 additions & 11 deletions Manifest.txt

This file was deleted.

4 changes: 2 additions & 2 deletions README.rdoc
Expand Up @@ -55,11 +55,11 @@ Ruby wrapper for Google AJAX API REST interfaces(Feeds, Language and Search).

== REQUIREMENTS:

* JSON gem to parse responses
* JSON gem to parse responses, or rails

== INSTALL:

sudo gem install googleajax --include-dependencies
sudo gem install googleajax

== LICENSE:

Expand Down
55 changes: 42 additions & 13 deletions Rakefile
@@ -1,17 +1,46 @@
# -*- ruby -*-

require 'rubygems'
require 'hoe'
$: << File.dirname(__FILE__) + '/lib'
require './lib/googleajax.rb'
require 'rake'

begin
require 'jeweler'
Jeweler::Tasks.new do |gem|
gem.name = "googleajax"
gem.summary = %Q{Ruby wrapper to the Google AJAX API REST interfaces(Feeds, Language and Search).}
#gem.description = %Q{TODO: longer description of your gem}
gem.email = "monki@geemus.com"
gem.homepage = "http://github.com/geemus/googleajax"
gem.authors = ["monki(Wesley Beary)", "Marc-Andre Lafortune"]
gem.add_development_dependency "rspec", ">= 1.2.9"
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
gem.add_dependency 'json', '>= 1.0.0'
end
Jeweler::GemcutterTasks.new
rescue LoadError
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
end

require 'spec/rake/spectask'
Spec::Rake::SpecTask.new(:spec) do |spec|
spec.libs << 'lib' << 'spec'
spec.spec_files = FileList['spec/**/*_spec.rb']
end

Hoe.new('GoogleAjax', GoogleAjax::VERSION::STRING) do |p|
p.rubyforge_name = 'googleajax'
p.developer('monki(Wesley Beary)', 'monki@geemus.com')
p.summary = 'Ruby wrapper to the Google AJAX API REST interfaces(Feeds, Language and Search).'
p.url = 'http://googleajax.rubyforge.com'
p.remote_rdoc_dir = ''
p.extra_deps << ['json', '>= 1.0.0']
Spec::Rake::SpecTask.new(:rcov) do |spec|
spec.libs << 'lib' << 'spec'
spec.pattern = 'spec/**/*_spec.rb'
spec.rcov = true
end

# vim: syntax=Ruby
task :spec => :check_dependencies

task :default => :spec

require 'rake/rdoctask'
Rake::RDocTask.new do |rdoc|
version = File.exist?('VERSION') ? File.read('VERSION') : ""

rdoc.rdoc_dir = 'rdoc'
rdoc.title = "googleajax #{version}"
rdoc.rdoc_files.include('README*')
rdoc.rdoc_files.include('lib/**/*.rb')
end
1 change: 1 addition & 0 deletions VERSION
@@ -0,0 +1 @@
0.2.0
25 changes: 0 additions & 25 deletions googleajax.gemspec

This file was deleted.

49 changes: 20 additions & 29 deletions lib/googleajax.rb
Expand Up @@ -4,37 +4,28 @@
require 'rubygems'
require 'json' unless defined?(Rails)

require 'googleajax/feed'
require 'googleajax/language'
require 'googleajax/parser'
require 'googleajax/search'
require 'googleajax/version'
module GoogleAjax
require 'googleajax/base' unless const_defined?("Base")
require 'googleajax/feed'
require 'googleajax/language'
require 'googleajax/search'
require 'googleajax/parser'

class GoogleAjax
API_BASE = 'http://ajax.googleapis.com/ajax/services/'
@@api_key = @@referer = nil
class << self
attr_accessor :api_key
attr_accessor :referer

def self.api_key
@@api_key
end
def self.api_key=(key)
@@api_key = key
end
def self.referer
@@referer
end
def self.referer=(referer)
@@referer = referer
end

def self.get(api, method, query, args = nil)
raise "You must assign a value to GoogleAjax.referer" unless @@referer
url = "#{API_BASE}#{api}/"
url += "#{method}?"
url += "&q=#{CGI::escape(query)}"
url += "&key=#{api_key}" if api_key
url += "&" + args.collect {|key, value| "#{key}=#{value}"}.join('&') if args && !args.empty?
data = open(url, "Referer" => @@referer).read
Parser.parse(api, method, data)
# Api doc is at http://code.google.com/apis/ajaxsearch/documentation/reference.html#_intro_fonje
def get(api, method, query, args = nil)
raise "You must assign a value to GoogleAjax.referer" unless referer
url = "#{API_BASE}#{api}/"
url += "#{method}?"
url += "&q=#{CGI::escape(query)}"
url += "&key=#{api_key}" if api_key
url += "&" + args.collect {|key, value| "#{key}=#{value}"}.join('&') if args && !args.empty?
data = open(url, "Referer" => referer).read
Parser.parse(api, method, data)
end
end
end
15 changes: 15 additions & 0 deletions lib/googleajax/as_hash.rb
@@ -0,0 +1,15 @@
# Include this file instead of googleajax so that results are simply hashes

module GoogleAjax
class Base < Hash
def initialize(h)
super()
replace(h)
end

def self.remap(h)
end
end
end

require 'googleajax'
25 changes: 25 additions & 0 deletions lib/googleajax/base.rb
@@ -0,0 +1,25 @@
module GoogleAjax
class Base < OpenStruct
def [](key)
send(key)
end

def []=(key, value)
send("#{key}=", value)
end

def self.remap(h)
define_method(:initialize) do |arg|
super(arg)
h.each do |key, klass|
case self[key]
when Array
self[key] = self[key].map(&klass.method(:new))
when Hash
self[key] = klass.new(self[key])
end
end
end
end
end
end
43 changes: 20 additions & 23 deletions lib/googleajax/feed.rb
@@ -1,38 +1,35 @@
class GoogleAjax
class Feed
module GoogleAjax
module Feed
FEED_VERSION = 1.0
def self.get(method, query, args = {})
args = { :v => FEED_VERSION }.merge!(args)
# Arguments: http://code.google.com/apis/ajaxfeeds/documentation/reference.html#_intro_fonje
def self.get(method, query, args)
args = { :v => FEED_VERSION }.merge(args)
GoogleAjax::get(:feed, method, query, args)
end

# will return a list of feeds that match the given query
# Arguments: http://code.google.com/apis/ajaxfeeds/documentation/reference.html#_fonje_find
def self.find(query, args = {})
self.get(:find, query)
self.get(:find, query, args)
end

# downloads this feed from Google's servers
# Optional: args { :num => number of entries to download(default is 4, maximum is 100) }
def self.load(query, args = {})
self.get(:load, query, args)
# Arguments: http://code.google.com/apis/ajaxfeeds/documentation/reference.html#_fonje_load
def self.load(url, args = {})
self.get(:load, url, args)
end

# will return the associated feed if it exists for a given url
def self.lookup(query, args = {})
self.get(:lookup, query)
# Arguments: http://code.google.com/apis/ajaxfeeds/documentation/reference.html#_intro_fonje
def self.lookup(url, args = {})
self.get(:lookup, url, args)
end

class Entry < OpenStruct
def initialize(data)
super(data)
end

class Entry < Base
end

class Feed < OpenStruct
def initialize(data)
super(data)
self.entries = entries.collect {|data| Entry.new(data)} if entries
end

class Feed < Base
remap :entries => Entry
end
end
end
27 changes: 10 additions & 17 deletions lib/googleajax/language.rb
@@ -1,36 +1,29 @@
class GoogleAjax
class Language
module GoogleAjax
module Language
LANGUAGE_VERSION = 1.0
def self.get(method, query, args = {})
args = { :v => LANGUAGE_VERSION }.merge!(args)
def self.get(method, query, args)
args = { :v => LANGUAGE_VERSION }.merge(args)
GoogleAjax::get(:language, method, query, args)
end

# will return the language code that describes the language of the given text
def self.detect(query, args = {})
self.get(:detect, query)
self.get(:detect, query, args)
end

# will return translated text for the given text supplied, matching the destination language.
def self.translate(query, source, destination, args = {})
args = { :langpair => "#{source}%7C#{destination}"}.merge!(args)
args = { :langpair => "#{source}%7C#{destination}"}.merge(args)
self.get(:translate, query, args)
end

class Language < OpenStruct
def initialize(data)
super(data)
end

class Language < Base
def name
LANGUAGES.invert[self.language]
(@@lang_cache ||= LANGUAGES.invert)[self.language]
end
end

class Translation < OpenStruct
def initialize(data)
super(data)
end
class Translation < Base
end

LANGUAGES =
Expand Down Expand Up @@ -77,6 +70,6 @@ def initialize(data)
'UKRAINIAN' => 'uk',
'VIETNAMESE' => 'vi',
'UNKNOWN' => ''
}
}
end
end

0 comments on commit a1d67d4

Please sign in to comment.