oos4ruby 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -7,3 +7,11 @@
7
7
 
8
8
  * 1 major enhancement:
9
9
  * Changed MIT license to BSD license
10
+
11
+ == 0.1.2 2007-10-16
12
+
13
+ * 1 major enhancement:
14
+ * added multimedia management
15
+ * some bugs fixed
16
+ * README.txt completed
17
+ * more rdoc
data/Manifest.txt CHANGED
@@ -15,6 +15,8 @@ lib/oos4ruby/contacts.rb
15
15
  lib/oos4ruby/entry.rb
16
16
  lib/oos4ruby/feed.rb
17
17
  lib/oos4ruby/http_invoker.rb
18
+ lib/oos4ruby/media.rb
19
+ lib/oos4ruby/medias.rb
18
20
  lib/oos4ruby/oos.rb
19
21
  lib/oos4ruby/search.rb
20
22
  lib/oos4ruby/service.rb
data/README.txt CHANGED
@@ -1 +1,54 @@
1
- README
1
+ oos4ruby is a ruby library to interact with the 11870 API.
2
+
3
+ == Installing
4
+
5
+ sudo gem install oos4ruby
6
+
7
+ == The basics
8
+
9
+ The class Oos4ruby::Oos is the endpoint to interact with the api. This class provides the authentication methods in addition to the search and user management methods.
10
+
11
+ oos = Oos4ruby::Oos.new
12
+
13
+ Authenticate as an application in order to perform searches or explore the user contents:
14
+
15
+ oos.auth_app 'your appToken', 'your secret key'
16
+
17
+ Authenticate as a user in order to manage his contents:
18
+
19
+ oos.auth_user 'user email in 11870.com', 'user authorization token'
20
+
21
+ How to perform a search inside 11870:
22
+
23
+ oos.search :q => 'cheap restaurants in new york'
24
+
25
+ How to obtain the services or places saved by a user:
26
+
27
+ #if your app is authenticated with this user authorization token
28
+ user = oos.user
29
+ #if your app is authenticated to expore contents
30
+ user = oos.user 'user slug in 11870'
31
+
32
+ sites = user.sites.entries
33
+
34
+ How to add a review from a site that doesn't exist in 11870:
35
+
36
+ oos.user.sites.create! {:title => 'this site doesn't exist',
37
+ :user_address => 'the address',
38
+ :locality => {:name => 'Madrid', :slug => '/es/madrid'},
39
+ :country => {:name => 'España', :slug => '/es'},
40
+ :summary => 'review title', :content => 'review content',
41
+ :tags => ['tapas', 'tipical spanish'], :lists => ['food']}
42
+
43
+ How to add a review from a site that exists in 11870:
44
+
45
+ oos.user.sites.create! {:id => '11870 site id',
46
+ :summary => 'review title', :content => 'review content'}
47
+
48
+ How to obtain all user contacts in 11870:
49
+
50
+ contacts = user.contacts.entries
51
+
52
+ How to obtain the multimedia feed associated with a review:
53
+
54
+ media_collection = user.sites.entries[0].multimedia
data/lib/oos4ruby/bean.rb CHANGED
@@ -1,12 +1,12 @@
1
1
  include Oos4ruby
2
2
 
3
- module Bean
4
- def self.append_features(base) #:nodoc:
3
+ module Bean #:nodoc:
4
+ def self.append_features(base)
5
5
  super
6
6
  base.extend(ClassMethods)
7
7
  end
8
8
 
9
- module ClassMethods
9
+ module ClassMethods #:nodoc:
10
10
  def define_el_reader(opts = {})
11
11
  if !opts.empty?
12
12
  opts.each_pair { |key, value|
@@ -1,4 +1,10 @@
1
1
  module Oos4ruby
2
+
3
+ =begin rdoc
4
+ This class wraps feed response. You must use its subclass, Oos4ruby::Sites, Oos4ruby::Contacts, Oos4ruby::Medias
5
+
6
+ API feed response is paginated, so, this class provides some methods to explore the feed.
7
+ =end
2
8
  class Collection
3
9
 
4
10
  attr_reader :entries
@@ -7,32 +13,69 @@ class Collection
7
13
  @feed = feed
8
14
  @auth = auth
9
15
  @slug = slug
16
+ evalued_class = eval(self.class.name.gsub(/s$/, ''))
17
+ @entries = feed.entries.map {|entry| evalued_class.new(entry, @auth, @slug) }
10
18
  end
11
-
19
+
20
+ =begin rdoc
21
+ returns true if next page exists into the feed
22
+ =end
12
23
  def next_page?
13
24
  @feed.next?
14
25
  end
15
26
 
27
+ =begin rdoc
28
+ returns true if previous page exists into the feed
29
+ =end
16
30
  def previous_page?
17
31
  @feed.previous?
18
32
  end
19
33
 
34
+ =begin rdoc
35
+ returns the next feed as a new Collection subclass.
36
+ =end
20
37
  def next_page
21
38
  return get_page(@feed.next) if next_page?
22
39
  end
23
40
 
41
+ =begin rdoc
42
+ returns the previous feed as a new Collection subclass.
43
+ =end
24
44
  def previous_page
25
45
  return get_page(@feed.previous) if previous_page?
26
46
  end
27
47
 
48
+ =begin rdoc
49
+ updats the current Collection with the next feed response.
50
+ =end
28
51
  def next_page!
29
52
  return get_page!(@feed.next)
30
53
  end
31
54
 
55
+ =begin rdoc
56
+ updates the current Collection with the precious feed response.
57
+ =end
32
58
  def previous!
33
59
  return get_page!(@feed.previous)
34
60
  end
35
61
 
62
+ =begin rdoc
63
+ returns the size of the current collection.
64
+ =end
65
+ def size
66
+ @feed.size
67
+ end
68
+
69
+ =begin rdoc
70
+ returns the total size of the feed.
71
+ =end
72
+ def total_size
73
+ @feed.total_size
74
+ end
75
+
76
+ =begin rdoc
77
+ return all entries into the feed.
78
+ =end
36
79
  def all
37
80
  all = @entries
38
81
  aux = self
@@ -44,6 +87,9 @@ class Collection
44
87
  return all
45
88
  end
46
89
 
90
+ =begin rdoc
91
+ reload the current collection
92
+ =end
47
93
  def refresh!
48
94
  return get_page!(@feed.self_link)
49
95
  end
@@ -52,19 +98,50 @@ class Collection
52
98
  @entries.join("\n")
53
99
  end
54
100
 
101
+ =begin rdoc
102
+ method to create a resource into a collection.
103
+ opts available keys:
104
+ * if you want to create a Site:
105
+ :id => 11870 service/place id if it already exists in 11780
106
+ if the service/place doesn't exit in 11870 then
107
+ :title => service/place name (required)
108
+ :user_address (required)
109
+ :url (optional)
110
+ :telephone (optional)
111
+ :locality => a hash with :name and :slug (required)
112
+ :country => a hash with :name and :slug (required)
113
+ :summary => review title
114
+ :content or :review_content => review_content
115
+ :privacy => a REXML::Element from 11870 privacy scheme or a string with "true" or "false"
116
+ :tags => an array of tags
117
+ :lists => an array of lists
118
+ * if you want to create a Contact:
119
+ :contact or :slug or :title => the new contact slug
120
+ :trusted => a REXML::Element from 11870 trusted scheme or one of the next strings => "public", "trustedContacts", "contacts", "private"
121
+ * if you want to create a Media:
122
+ :file => the new media file system path or a File object
123
+ :content_length => file size
124
+ :content_type => file content type
125
+ =end
55
126
  def create!(opts = {})
56
127
  opts[:author] = REXML::XPath.first(@feed.xml, 'author', XmlNamespaces)
57
128
 
58
- new_entry = Site.dump! opts, @slug if self.instance_of?Sites
59
- new_entry = Contact.dump! opts, @slug if self.instance_of?Contacts
129
+ evalued_class = eval(self.class.name.gsub(/s$/, ''))
130
+ body = evalued_class.dump! opts, @slug
131
+ unless self.instance_of?Medias
132
+ body = "<?xml version='1.0' ?>\n" + body.to_s
133
+ end
60
134
 
61
135
  poster = HTTPInvoker.new( @feed.self_link, @auth)
62
136
 
63
- worked = poster.post AtomEntryContentType, "<?xml version='1.0' ?>\n" + new_entry.to_s
137
+ content_type = opts[:content_type] || AtomEntryContentType
138
+ opts.reject {|k, v| k == :content_type}
139
+ opts.each {|k, v| poster.set_header(k, v)}
140
+
141
+ worked = poster.post content_type, body
64
142
 
65
143
  raise RuntimeError.new unless worked
66
- return Site.new(poster.entry, @auth, @slug) if self.instance_of?Sites
67
- return Contact.new(poster.entry, @auth, @slug) if self.instance_of?Contacts
144
+ return evalued_class.new(poster.entry, @auth, @slug)
68
145
  end
69
146
 
70
147
  private
@@ -86,8 +163,8 @@ class Collection
86
163
  end
87
164
 
88
165
  def convert( body )
89
- return Sites.new( Feed.read( body ), @auth, @slug ) if self.instance_of?(Sites)
90
- return Contacts.new( Feed.read( body ), @auth, @slug ) if self.instance_of?(Contacts)
166
+ evalued_class = eval(self.class.name)
167
+ return evalued_class.new( Feed.read( body ), @auth, @slug )
91
168
  end
92
169
 
93
170
  end
@@ -42,8 +42,11 @@ class Contact < BeanClass
42
42
  def Contact.dump!(opts, slug)
43
43
  entry = create_entry
44
44
 
45
- entry.add_element opts[:author]
46
- add_element entry, 'updated', DateTime.now
45
+ entry.add_element opts[:author]
46
+
47
+ updated = DateTime::now.strftime("%Y-%m-%dT%H:%M:%S%z").sub(/(..)$/, ':\1')
48
+
49
+ add_element entry, 'updated', updated
47
50
  add_element entry, 'id', make_id
48
51
 
49
52
  add_element entry, 'title', (opts[:contact] || opts[:slug] || opts[:title])
@@ -1,10 +1,6 @@
1
1
 
2
2
  module Oos4ruby
3
- class Contacts < Collection
4
- def initialize(feed, auth, slug)
5
- super(feed, auth, slug)
6
- @entries = feed.entries.map {|entry| Contact.new(entry, @auth, @slug) }
7
- end
3
+ class Contacts < Collection
8
4
  end
9
5
  end
10
6
 
data/lib/oos4ruby/feed.rb CHANGED
@@ -4,7 +4,7 @@ require 'rexml/xpath'
4
4
  module Oos4ruby
5
5
  class Feed
6
6
 
7
- attr_reader :previous, :next, :entries, :xml
7
+ attr_reader :previous, :next, :entries, :xml, :size, :total_size
8
8
 
9
9
  def initialize(entries, xml)
10
10
  @entries = entries
@@ -12,6 +12,8 @@ class Feed
12
12
  @next = Feed.get_link('next', xml)
13
13
  @previous = Feed.get_link 'previous', xml
14
14
  @self = Feed.get_link 'self', xml
15
+ @size = REXML::XPath.first(xml, "./os:itemsPerPage/text()", XmlNamespaces)
16
+ @total_size = REXML::XPath.first(xml, "./os:totalResults/text()", XmlNamespaces)
15
17
  end
16
18
 
17
19
  def self.get_link(rel, xml)
@@ -15,7 +15,7 @@ class HTTPInvoker
15
15
  end
16
16
 
17
17
  def set_header(name, val)
18
- @headers[name] = val
18
+ @headers[name.to_s.gsub(/_/, '-')] = val
19
19
  end
20
20
 
21
21
  def get(depth = 0, req = nil)
@@ -48,7 +48,12 @@ class HTTPInvoker
48
48
  @headers.each { |k, v| req[k]= v }
49
49
 
50
50
  http.start do |connection|
51
- @response = connection.request(req, body)
51
+ if body.instance_of?String
52
+ @response = connection.request(req, body)
53
+ else
54
+ req.body_stream = body
55
+ @response = connection.request(req)
56
+ end
52
57
 
53
58
  return post(contentType, body, depth + 1, req) if need_authentication?(req)
54
59
 
@@ -113,12 +118,10 @@ class HTTPInvoker
113
118
  unless req
114
119
  url = @uri.path
115
120
  url += "?#{@uri.query}" if @uri.query
116
- req = Net::HTTP::Get.new( url ) if option == :get
117
- req = Net::HTTP::Post.new( url ) if option == :post
118
- req = Net::HTTP::Put.new( url ) if option == :put
119
- req = Net::HTTP::Delete.new( url ) if option == :delete
121
+ req = eval("Net::HTTP::#{option.to_s.capitalize}").new( url )
120
122
  end
121
123
 
124
+ @authent.add_to req
122
125
  return http, req
123
126
  end
124
127
 
@@ -126,6 +129,7 @@ class HTTPInvoker
126
129
  if @response.instance_of?(Net::HTTPUnauthorized) && @authent
127
130
  @authent.add_to req
128
131
  req.body = nil unless req.body.nil?
132
+ req.body_stream = nil unless req.body_stream.nil?
129
133
  return true
130
134
  end
131
135
  return false
@@ -0,0 +1,34 @@
1
+
2
+ include Bean
3
+
4
+ module Oos4ruby
5
+ class Media < Bean::BeanClass
6
+
7
+ define_el_reader AtomNamespace => [:title, :updated, :content]
8
+
9
+ attr_writer :title
10
+
11
+ def initialize(entry, auth, slug = nil)
12
+ @xml = entry
13
+ @auth = auth
14
+ @slug = slug || @xml.child('slug', OosNamespace).text
15
+ end
16
+
17
+ def Media.dump!(opts, slug)
18
+ if (opts[:file].instance_of?File)
19
+ file = opts[:file]
20
+ elsif (opts[:file].instance_of?String)
21
+ file = File.new( opts[:file ])
22
+ end
23
+ return file
24
+ end
25
+
26
+ private
27
+ def load!
28
+ if @title
29
+ @xml.child('title').text = @title
30
+ end
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,6 @@
1
+
2
+
3
+ module Oos4ruby
4
+ class Medias < Collection
5
+ end
6
+ end
@@ -5,7 +5,7 @@ module Oos4ruby
5
5
  class Search
6
6
 
7
7
  =begin rdoc
8
- Method to search places into 11870
8
+ Method to search services/places into 11870. Returns a Sites collection
9
9
  available parameters:
10
10
  <tt>q</tt>:: string that represents a siple query.
11
11
  <tt>bbox</tt>:: array of points that delimiters a rectangle, SW and NE.
data/lib/oos4ruby/site.rb CHANGED
@@ -1,4 +1,5 @@
1
1
 
2
+ require 'date'
2
3
  include Bean
3
4
 
4
5
  module Oos4ruby
@@ -21,13 +22,6 @@ class Site < Bean::BeanClass
21
22
 
22
23
  attr_writer :review_title, :review_content, :user_address, :url, :locality, :telephone
23
24
 
24
- def country=(name, slug)
25
- @country = REXML::Element.new('oos:country')
26
- @country.add_namespace('oos', OosNamespace)
27
- @country.add_text name
28
- @country.add_attribute 'slug', slug
29
- end
30
-
31
25
  def initialize(xml, auth, slug = nil)
32
26
  @xml = xml
33
27
  @auth = auth
@@ -40,6 +34,13 @@ class Site < Bean::BeanClass
40
34
  @categories_removed = []
41
35
  end
42
36
 
37
+ def country=(name, slug)
38
+ @country = REXML::Element.new('oos:country')
39
+ @country.add_namespace('oos', OosNamespace)
40
+ @country.add_text name
41
+ @country.add_attribute 'slug', slug
42
+ end
43
+
43
44
  def Site.find_by_user( auth, slug, opts = {} )
44
45
  raise Oos4ruby::UnknownUser if slug.nil?
45
46
 
@@ -57,12 +58,15 @@ class Site < Bean::BeanClass
57
58
 
58
59
  entry.add_element opts[:author]
59
60
 
60
- add_element entry, 'updated', DateTime.now
61
+ updated = DateTime::now.strftime("%Y-%m-%dT%H:%M:%S%z").sub(/(..)$/, ':\1')
62
+
63
+ add_element entry, 'updated', updated
61
64
  add_element entry, 'id', make_id
62
65
  add_element entry, 'oos:id', opts[:id] if opts[:id]
63
66
  add_element entry, 'title', opts[:title] if opts[:title]
64
67
  add_element entry, 'oos:useraddress', opts[:user_address] if opts[:user_address]
65
68
  add_element entry, 'oos:url', opts[:url] if opts[:url]
69
+ add_element entry, 'oos:telephone', opts[:telephone] if opts[:telephone]
66
70
  add_element entry, 'summary', opts[:review_title] if opts[:review_title]
67
71
  add_element entry, 'summary', opts[:summary] if opts[:summary] and REXML::XPath.first(entry, 'summary', XmlNamespaces).nil?
68
72
 
@@ -110,8 +114,8 @@ class Site < Bean::BeanClass
110
114
  add_element entry, 'oos:country', name, attrs
111
115
  end
112
116
 
113
- opts[:tags].each { |tag| add_category entry, tag.to_s, "#{TAGS_URL}/#{slug}"} if opts[:tags]
114
- opts[:lists].each { |list| add_category entry, list.to_s, "#{LISTS_URL}/#{slug}"} if opts[:lists]
117
+ opts[:tags].each { |tag| add_category entry, tag, "#{TAGS_URL}/#{slug}"} if opts[:tags]
118
+ opts[:lists].each { |list| add_category entry, list, "#{LISTS_URL}/#{slug}"} if opts[:lists]
115
119
 
116
120
  entry
117
121
  end
@@ -178,6 +182,16 @@ class Site < Bean::BeanClass
178
182
  @privacy_updated = privacy
179
183
  end
180
184
 
185
+ def multimedia
186
+ href = @xml.first('./atom:source/app:collection').attributes['href']
187
+
188
+ getter = HTTPInvoker.new href, @auth
189
+ worked = getter.get
190
+
191
+ raise RuntimeError unless worked
192
+ Medias.new(Feed.read(getter.body), @auth, @slug)
193
+ end
194
+
181
195
  private
182
196
  def load!
183
197
  if @title_review
@@ -1,10 +1,6 @@
1
1
 
2
2
  module Oos4ruby
3
- class Sites < Collection
4
- def initialize(feed, auth, slug = nil)
5
- super( feed, auth, slug )
6
- @entries = feed.entries.map {|entry| Site.new(entry, @auth, slug) }
7
- end
3
+ class Sites < Collection
8
4
  end
9
5
  end
10
6
 
@@ -2,7 +2,7 @@ module Oos4ruby #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 1
5
- TINY = 1
5
+ TINY = 2
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
data/lib/oos4ruby.rb CHANGED
@@ -41,6 +41,8 @@ require 'oos4ruby/contact.rb'
41
41
  require 'oos4ruby/contacts.rb'
42
42
  require 'oos4ruby/entry.rb'
43
43
  require 'oos4ruby/feed.rb'
44
+ require 'oos4ruby/media.rb'
45
+ require 'oos4ruby/medias.rb'
44
46
  require 'oos4ruby/oos.rb'
45
47
  require 'oos4ruby/search.rb'
46
48
  require 'oos4ruby/service.rb'
@@ -50,7 +52,7 @@ require 'oos4ruby/user.rb'
50
52
  require 'oos4ruby/version.rb'
51
53
 
52
54
 
53
- class String
55
+ class String #:nodoc:
54
56
  def underscore
55
57
  self.to_s.gsub(/::/, '/').
56
58
  gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
@@ -61,7 +63,8 @@ class String
61
63
  end
62
64
 
63
65
  require 'rexml/element'
64
- class REXML::Element
66
+ module REXML #:nodoc:
67
+ class REXML::Element #:nodoc:
65
68
  def add_category(term, scheme = nil, label = nil)
66
69
  c = REXML::Element.new('category', self)
67
70
  c.add_attribute('term', term)
@@ -70,3 +73,4 @@ class REXML::Element
70
73
  c
71
74
  end
72
75
  end
76
+ end
@@ -7,7 +7,6 @@ oos = Oos4ruby::Oos.new
7
7
 
8
8
  oos.auth_user('david.calavera@11870.com', 'asdf')
9
9
 
10
- user = oos.user
11
10
  puts user.name
12
11
  puts user.surname
13
12
  puts user.no_mails
@@ -73,6 +72,17 @@ site.update!
73
72
 
74
73
  site.tags.each { |tag| puts "TAG : #{tag.term}, #{tag.scheme} "}
75
74
 
75
+ file_path = '/home/david/media_api_test.png'
76
+
77
+ medias = site.multimedia
78
+
79
+ media = medias.create!(:file => file_path,
80
+ :content_length => File.size(file_path), :content_type => 'image/png' )
81
+
82
+ puts media.to_s
83
+ site.multimedia.refresh!
84
+
85
+ puts site.multimedia.entries.to_s
76
86
 
77
87
  class TestOos4ruby < Test::Unit::TestCase
78
88
 
@@ -82,4 +92,7 @@ class TestOos4ruby < Test::Unit::TestCase
82
92
  def test_truth
83
93
  assert true
84
94
  end
95
+
96
+
85
97
  end
98
+
data/website/index.html CHANGED
@@ -33,7 +33,7 @@
33
33
  <h1>oos4ruby</h1>
34
34
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/oos4ruby"; return false'>
35
35
  <p>Get Version</p>
36
- <a href="http://rubyforge.org/projects/oos4ruby" class="numbers">0.1.1</a>
36
+ <a href="http://rubyforge.org/projects/oos4ruby" class="numbers">0.1.2</a>
37
37
  </div>
38
38
  <h1>&#x2192; &#8216;oos4ruby&#8217;</h1>
39
39
 
@@ -77,23 +77,53 @@
77
77
  <p><pre class='syntax'><span class="ident">oos</span><span class="punct">.</span><span class="ident">search</span> <span class="symbol">:q</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">cheap restaurants in new york</span><span class="punct">'</span></pre></p>
78
78
 
79
79
 
80
- <p>Method to obtain the services or places saved by a user:</p>
80
+ <p>How to obtain the services or places saved by a user:</p>
81
81
 
82
82
 
83
83
  <p><pre class='syntax'>
84
- <span class="ident">user</span> <span class="punct">=</span> <span class="ident">oos</span><span class="punct">.</span><span class="ident">user</span> <span class="comment">#if your app is authenticated with this user authorization token</span>
85
- <span class="ident">user</span> <span class="punct">=</span> <span class="ident">oos</span><span class="punct">.</span><span class="ident">user</span> <span class="punct">'</span><span class="string">user slug in 11870</span><span class="punct">'</span> <span class="comment">#if your app is authenticated to expore contents</span>
84
+ <span class="comment">#if your app is authenticated with this user authorization token</span>
85
+ <span class="ident">user</span> <span class="punct">=</span> <span class="ident">oos</span><span class="punct">.</span><span class="ident">user</span>
86
+ <span class="comment">#if your app is authenticated to expore contents</span>
87
+ <span class="ident">user</span> <span class="punct">=</span> <span class="ident">oos</span><span class="punct">.</span><span class="ident">user</span> <span class="punct">'</span><span class="string">user slug in 11870</span><span class="punct">'</span>
86
88
 
87
89
  <span class="ident">sites</span> <span class="punct">=</span> <span class="ident">user</span><span class="punct">.</span><span class="ident">sites</span><span class="punct">.</span><span class="ident">entries</span>
88
90
  </pre></p>
89
91
 
90
92
 
91
- <p>Method to obtain all user contacts in 11870:</p>
93
+ <p>How to add a review from a site that doesn&#8217;t exist in 11870:</p>
94
+
95
+
96
+ <p><pre class='syntax'>
97
+ <span class="ident">oos</span><span class="punct">.</span><span class="ident">user</span><span class="punct">.</span><span class="ident">sites</span><span class="punct">.</span><span class="ident">create!</span> <span class="punct">{</span><span class="symbol">:title</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">this site doesn</span><span class="punct">'</span><span class="ident">t</span> <span class="ident">exist</span><span class="punct">'</span><span class="string">,
98
+ :user_address =&gt; </span><span class="punct">'</span><span class="ident">the</span> <span class="ident">address</span><span class="punct">'</span><span class="string">,
99
+ :locality =&gt; {:name =&gt; </span><span class="punct">'</span><span class="constant">Madrid</span><span class="punct">'</span><span class="string">, :slug =&gt; </span><span class="punct">'/</span><span class="ident">es</span><span class="punct">/</span><span class="ident">madrid</span><span class="punct">'</span><span class="string">},
100
+ :country =&gt; {:name =&gt; </span><span class="punct">'</span><span class="constant">Españ</span><span class="ident">a</span><span class="punct">'</span><span class="string">, :slug =&gt; </span><span class="punct">'/</span><span class="ident">es</span><span class="punct">'</span><span class="string">}
101
+ :summary =&gt; </span><span class="punct">'</span><span class="ident">review</span> <span class="ident">title</span><span class="punct">'</span><span class="string">, :content =&gt; </span><span class="punct">'</span><span class="ident">review</span> <span class="ident">content</span><span class="punct">'</span><span class="string">
102
+ :tags =&gt; [</span><span class="punct">'</span><span class="ident">tapas</span><span class="punct">'</span><span class="string">, </span><span class="punct">'</span><span class="ident">tipical</span> <span class="ident">spanish</span><span class="punct">'</span><span class="string">], :lists =&gt; [</span><span class="punct">'</span><span class="ident">food</span><span class="punct">'</span><span class="string">]}<span class="normal">
103
+ </span></span></pre></p>
104
+
105
+
106
+ <p>How to add a review from a site that exists in 11870:</p>
107
+
108
+
109
+ <p><pre class='syntax'>
110
+ <span class="ident">oos</span><span class="punct">.</span><span class="ident">user</span><span class="punct">.</span><span class="ident">sites</span><span class="punct">.</span><span class="ident">create!</span> <span class="punct">{</span><span class="symbol">:id</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">11870 site id</span><span class="punct">',</span>
111
+ <span class="symbol">:summary</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">review title</span><span class="punct">',</span> <span class="symbol">:content</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">review content</span><span class="punct">'}</span>
112
+ </pre></p>
113
+
114
+
115
+ <p>How to obtain all user contacts in 11870:</p>
92
116
 
93
117
 
94
118
  <p><pre class='syntax'><span class="ident">contacts</span> <span class="punct">=</span> <span class="ident">user</span><span class="punct">.</span><span class="ident">contacts</span><span class="punct">.</span><span class="ident">entries</span></pre></p>
95
119
 
96
120
 
121
+ <p>How to obtain the multimedia feed associated with a review:</p>
122
+
123
+
124
+ <p><pre class='syntax'><span class="ident">media_collection</span> <span class="punct">=</span> <span class="ident">user</span><span class="punct">.</span><span class="ident">sites</span><span class="punct">.</span><span class="ident">entries</span><span class="punct">[</span><span class="number">0</span><span class="punct">].</span><span class="ident">multimedia</span></pre></p>
125
+
126
+
97
127
  <h2>Forum</h2>
98
128
 
99
129
 
@@ -120,7 +150,7 @@
120
150
 
121
151
  <p>Comments are welcome. Send an email to <a href="mailto:david.calavera@gmail.com">David Calavera</a> email via the <a href="http://groups.google.com/group/api-11870">forum</a></p>
122
152
  <p class="coda">
123
- <a href="FIXME email">David Calavera</a>, 28th September 2007<br>
153
+ <a href="FIXME email">David Calavera</a>, 16th October 2007<br>
124
154
  Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
125
155
  </p>
126
156
  </div>
data/website/index.txt CHANGED
@@ -29,19 +29,43 @@ Method to perform a search inside 11870:
29
29
 
30
30
  <pre syntax="ruby">oos.search :q => 'cheap restaurants in new york'</pre>
31
31
 
32
- Method to obtain the services or places saved by a user:
32
+ How to obtain the services or places saved by a user:
33
33
 
34
34
  <pre syntax="ruby">
35
- user = oos.user #if your app is authenticated with this user authorization token
36
- user = oos.user 'user slug in 11870' #if your app is authenticated to expore contents
35
+ #if your app is authenticated with this user authorization token
36
+ user = oos.user
37
+ #if your app is authenticated to expore contents
38
+ user = oos.user 'user slug in 11870'
37
39
 
38
40
  sites = user.sites.entries
39
41
  </pre>
40
42
 
41
- Method to obtain all user contacts in 11870:
43
+ How to add a review from a site that doesn't exist in 11870:
44
+
45
+ <pre syntax="ruby">
46
+ oos.user.sites.create! {:title => 'this site doesn't exist',
47
+ :user_address => 'the address',
48
+ :locality => {:name => 'Madrid', :slug => '/es/madrid'},
49
+ :country => {:name => 'España', :slug => '/es'}
50
+ :summary => 'review title', :content => 'review content'
51
+ :tags => ['tapas', 'tipical spanish'], :lists => ['food']}
52
+ </pre>
53
+
54
+ How to add a review from a site that exists in 11870:
55
+
56
+ <pre syntax="ruby">
57
+ oos.user.sites.create! {:id => '11870 site id',
58
+ :summary => 'review title', :content => 'review content'}
59
+ </pre>
60
+
61
+ How to obtain all user contacts in 11870:
42
62
 
43
63
  <pre syntax="ruby">contacts = user.contacts.entries</pre>
44
64
 
65
+ How to obtain the multimedia feed associated with a review:
66
+
67
+ <pre syntax="ruby">media_collection = user.sites.entries[0].multimedia</pre>
68
+
45
69
  h2. Forum
46
70
 
47
71
  "http://groups.google.com/group/api-11870":http://groups.google.com/group/api-11870
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: oos4ruby
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.1
7
- date: 2007-09-28 00:00:00 +02:00
6
+ version: 0.1.2
7
+ date: 2007-10-16 00:00:00 +02:00
8
8
  summary: oos4ruby is a ruby binding for the 11870 API
9
9
  require_paths:
10
10
  - lib
@@ -46,6 +46,8 @@ files:
46
46
  - lib/oos4ruby/entry.rb
47
47
  - lib/oos4ruby/feed.rb
48
48
  - lib/oos4ruby/http_invoker.rb
49
+ - lib/oos4ruby/media.rb
50
+ - lib/oos4ruby/medias.rb
49
51
  - lib/oos4ruby/oos.rb
50
52
  - lib/oos4ruby/search.rb
51
53
  - lib/oos4ruby/service.rb