restbooks 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,129 @@
1
+ #
2
+ # api.rb
3
+ # restbooks
4
+ #
5
+ # Created by Paul Chavard on 2009-09-12.
6
+ # Copyright 2009
7
+ #
8
+ # This file is part of RestBooks.
9
+ #
10
+ # RestBooks is free software: you can redistribute it and/or modify
11
+ # it under the terms of the GNU General Public License as published by
12
+ # the Free Software Foundation, either version 3 of the License, or
13
+ # (at your option) any later version.
14
+ #
15
+ # RestBooks is distributed in the hope that it will be useful,
16
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ # GNU General Public License for more details.
19
+ #
20
+ # You should have received a copy of the GNU General Public License
21
+ # along with RestBooks. If not, see <http://www.gnu.org/licenses/>.
22
+ #
23
+
24
+ module RestBooks
25
+ module Api
26
+
27
+ BOOK_PARAMETERS = [ :letter, :year, :lang, :page ]
28
+ AUTHOR_PARAMETERS = [ :letter, :born, :death, :lang, :page ]
29
+ LIST_PARAMETERS = [ :order, :page ]
30
+ ORDERED_BOOK_PARAMETERS = BOOK_PARAMETERS + [ :order ]
31
+ RANGED_BOOK_PARAMETERS = BOOK_PARAMETERS + [ :range ]
32
+ ORDERED_AUTHOR_PARAMETERS = AUTHOR_PARAMETERS + [ :order ]
33
+ RANGED_AUTHOR_PARAMETERS = AUTHOR_PARAMETERS + [ :range ]
34
+
35
+ private
36
+
37
+ def initialize( client )
38
+ @user_agent = client.user_agent
39
+ @uri = client.uri
40
+ @etags = []
41
+ end
42
+
43
+ def create_url( path, options, valid_keys )
44
+ format = :atom
45
+ options_str = []
46
+ options.each do |key,value|
47
+ if key == :format
48
+ format = options.delete(:format)
49
+ elsif !valid_keys.include?(key)
50
+ options.delete( key )
51
+ else
52
+ options_str << "#{key.to_s}=#{value}"
53
+ end
54
+ end
55
+ options = (options_str.length > 0 ? options_str.join('&') : nil)
56
+ @uri.path = "#{path}.#{format.to_s}"
57
+ @uri.query = options
58
+ end
59
+
60
+ def do_request(type, format = :atom)
61
+ etag, saved_data = get_etag(@uri.to_s)
62
+ if etag
63
+ begin
64
+ data = RestClient.get(@uri.to_s, {'If-None-Match' => etag, 'User-Agent' => @user_agent})
65
+ etag = data.headers[:etag]
66
+ save_etag(@uri.to_s, etag, data.body)
67
+ rescue RestClient::NotModified
68
+ data = saved_data
69
+ end
70
+ else
71
+ data = RestClient.get(@uri.to_s, {'User-Agent' => @user_agent})
72
+ etag = data.headers[:etag]
73
+ save_etag(@uri.to_s, etag, data.body)
74
+ end
75
+
76
+ case format
77
+ when :atom
78
+ return process_atom_responce(type, data.body)
79
+ # when :json
80
+ # #return JSON.parse( data )
81
+ else
82
+ return data
83
+ end
84
+ end
85
+
86
+ def process_atom_responce( type, response )
87
+ result = []
88
+ doc = REXML::Document.new( response )
89
+ REXML::XPath.each( doc, '//entry' ) do |element|
90
+ result << eval( "Models::#{type.to_s.capitalize}.new( element )" )
91
+ end
92
+ return result
93
+ end
94
+
95
+ def get_etag( path )
96
+ arr = @etags.assoc( path )
97
+ etag = data = nil
98
+ if arr
99
+ etag = arr[1]
100
+ data = arr[2]
101
+ if arr != @etags.first
102
+ @etags.delete(arr)
103
+ @etags.unshift( arr )
104
+ end
105
+ end
106
+ return etag, data
107
+ end
108
+
109
+ def save_etag( path, etag, data )
110
+ @etags.unshift( [path,etag,data] )
111
+ @etags.pop if @etags.length > 99
112
+ end
113
+
114
+ def update_etag( path, etag, data )
115
+ arr = @etags.assoc( path )
116
+ if arr
117
+ if arr == @etags.first
118
+ @etags[0] = [path,etag,data]
119
+ else
120
+ @etags.delete(arr)
121
+ @etags.unshift( [path,etag,data] )
122
+ end
123
+ else
124
+ @etags.unshift( [path,etag,data] )
125
+ end
126
+ end
127
+
128
+ end
129
+ end
@@ -0,0 +1,41 @@
1
+ #
2
+ # model.rb
3
+ # restbooks
4
+ #
5
+ # Created by Paul Chavard on 2009-09-12.
6
+ # Copyright 2009
7
+ #
8
+ # This file is part of RestBooks.
9
+ #
10
+ # RestBooks is free software: you can redistribute it and/or modify
11
+ # it under the terms of the GNU General Public License as published by
12
+ # the Free Software Foundation, either version 3 of the License, or
13
+ # (at your option) any later version.
14
+ #
15
+ # RestBooks is distributed in the hope that it will be useful,
16
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ # GNU General Public License for more details.
19
+ #
20
+ # You should have received a copy of the GNU General Public License
21
+ # along with RestBooks. If not, see <http://www.gnu.org/licenses/>.
22
+ #
23
+
24
+ module RestBooks
25
+ module Model
26
+
27
+ def to_s
28
+ return @element.to_s
29
+ end
30
+
31
+ def to_entry
32
+ return @element
33
+ end
34
+
35
+ # def to_json
36
+ # model = self.class.to_s.split('::').last.downcase.to_sym
37
+ # return JSON.generate( { model => self.to_hash } )
38
+ # end
39
+
40
+ end
41
+ end
@@ -0,0 +1,63 @@
1
+ #
2
+ # author.rb
3
+ # restbooks
4
+ #
5
+ # Created by Paul Chavard on 2009-09-12.
6
+ # Copyright 2009
7
+ #
8
+ # This file is part of RestBooks.
9
+ #
10
+ # RestBooks is free software: you can redistribute it and/or modify
11
+ # it under the terms of the GNU General Public License as published by
12
+ # the Free Software Foundation, either version 3 of the License, or
13
+ # (at your option) any later version.
14
+ #
15
+ # RestBooks is distributed in the hope that it will be useful,
16
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ # GNU General Public License for more details.
19
+ #
20
+ # You should have received a copy of the GNU General Public License
21
+ # along with RestBooks. If not, see <http://www.gnu.org/licenses/>.
22
+ #
23
+
24
+ module RestBooks
25
+ module Models
26
+ class Author
27
+ include RestBooks::Model
28
+ attr_reader :title, :id, :updated, :born, :death
29
+
30
+ def initialize( element )
31
+ if element
32
+ @element = element
33
+ @element.elements.each do |tag|
34
+ case tag.name
35
+ when 'title'
36
+ @title = tag.text
37
+ when 'id'
38
+ @id = tag.text.scan(/author\/(\d+)\/books/).to_s
39
+ @id = @id.split(':').last if @id.split(':').length > 1
40
+ when 'updated'
41
+ @updated = Date.parse( tag.text )
42
+ when 'content'
43
+ dates = tag.text.strip.split(' - ')
44
+ @born = dates.first
45
+ @death = dates.last
46
+ end
47
+ end
48
+ else
49
+ @element = REXML::Element.new( 'entry' )
50
+ end
51
+ end
52
+
53
+ def to_hash
54
+ return { :title => @title,
55
+ :id => @id,
56
+ :updated => @updated,
57
+ :born => @date,
58
+ :death => @subject }
59
+ end
60
+
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,85 @@
1
+ #
2
+ # book.rb
3
+ # restbooks
4
+ #
5
+ # Created by Paul Chavard on 2009-09-12.
6
+ # Copyright 2009
7
+ #
8
+ # This file is part of RestBooks.
9
+ #
10
+ # RestBooks is free software: you can redistribute it and/or modify
11
+ # it under the terms of the GNU General Public License as published by
12
+ # the Free Software Foundation, either version 3 of the License, or
13
+ # (at your option) any later version.
14
+ #
15
+ # RestBooks is distributed in the hope that it will be useful,
16
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ # GNU General Public License for more details.
19
+ #
20
+ # You should have received a copy of the GNU General Public License
21
+ # along with RestBooks. If not, see <http://www.gnu.org/licenses/>.
22
+ #
23
+
24
+ module RestBooks
25
+ module Models
26
+ class Book
27
+ include RestBooks::Model
28
+ attr_reader :title, :id, :author, :updated, :language, :date, :subject, :description, :rights
29
+
30
+ def initialize( element=nil )
31
+ @updated = Time.now
32
+ @subject = []
33
+ if element
34
+ @element = element
35
+ @element.elements.each do |tag|
36
+ case tag.name
37
+ when 'title'
38
+ @title = tag.text
39
+ when 'id'
40
+ @id = tag.text.split('/').last
41
+ @id = @id.split(':').last if @id.split(':').length > 1
42
+ when 'updated'
43
+ @updated = Date.parse( tag.text )
44
+ when 'author'
45
+ @author = tag.elements['name'].text
46
+ @author_id = tag.elements['uri'].text.split('/').last
47
+ when 'language'
48
+ @language = tag.text
49
+ when 'date'
50
+ @date = tag.text
51
+ when 'subject'
52
+ @subject << tag.text
53
+ when 'description'
54
+ @description = tag.text.strip()
55
+ when 'rights'
56
+ @rights = tag.text
57
+ when 'content'
58
+ @html = tag.text if tag.attributes['type'] == "xhtml"
59
+ end
60
+ end
61
+ else
62
+ @element = REXML::Element.new( 'entry' )
63
+ end
64
+ end
65
+
66
+ def to_html
67
+ return @html
68
+ end
69
+
70
+ def to_hash
71
+ return { :title => @title,
72
+ :id => @id,
73
+ :author => @author,
74
+ :author_id => @author_id,
75
+ :updated => @updated,
76
+ :language => @language,
77
+ :date => @date,
78
+ :subject => @subject,
79
+ :description => @description,
80
+ :rights => @rights }
81
+ end
82
+
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,55 @@
1
+ #
2
+ # category.rb
3
+ # restbooks
4
+ #
5
+ # Created by Paul Chavard on 2009-09-12.
6
+ # Copyright 2009
7
+ #
8
+ # This file is part of RestBooks.
9
+ #
10
+ # RestBooks is free software: you can redistribute it and/or modify
11
+ # it under the terms of the GNU General Public License as published by
12
+ # the Free Software Foundation, either version 3 of the License, or
13
+ # (at your option) any later version.
14
+ #
15
+ # RestBooks is distributed in the hope that it will be useful,
16
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ # GNU General Public License for more details.
19
+ #
20
+ # You should have received a copy of the GNU General Public License
21
+ # along with RestBooks. If not, see <http://www.gnu.org/licenses/>.
22
+ #
23
+
24
+ module RestBooks
25
+ module Models
26
+ class Category
27
+ include RestBooks::Model
28
+ attr_reader :title, :id, :updated, :description
29
+
30
+ def initialize( element )
31
+ if element
32
+ @element = element
33
+ @element.elements.each do |tag|
34
+ case tag.name
35
+ when 'title'
36
+ @title = tag.text.strip()
37
+ @id = CGI.escape( @title )
38
+ when 'updated'
39
+ @updated = Date.parse( tag.text )
40
+ end
41
+ end
42
+ else
43
+ @element = REXML::Element.new( 'entry' )
44
+ end
45
+ end
46
+
47
+ def to_hash
48
+ return { :title => @title,
49
+ :id => @id,
50
+ :updated => @updated }
51
+ end
52
+
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,65 @@
1
+ #
2
+ # comment.rb
3
+ # restbooks
4
+ #
5
+ # Created by Paul Chavard on 2009-09-12.
6
+ # Copyright 2009
7
+ #
8
+ # This file is part of RestBooks.
9
+ #
10
+ # RestBooks is free software: you can redistribute it and/or modify
11
+ # it under the terms of the GNU General Public License as published by
12
+ # the Free Software Foundation, either version 3 of the License, or
13
+ # (at your option) any later version.
14
+ #
15
+ # RestBooks is distributed in the hope that it will be useful,
16
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ # GNU General Public License for more details.
19
+ #
20
+ # You should have received a copy of the GNU General Public License
21
+ # along with RestBooks. If not, see <http://www.gnu.org/licenses/>.
22
+ #
23
+
24
+ module RestBooks
25
+ module Models
26
+ class Comment
27
+ include RestBooks::Model
28
+ attr_reader :title, :id, :author, :published, :updated, :body
29
+
30
+ def initialize( element )
31
+ if element
32
+ @element = element
33
+ @element.elements.each do |tag|
34
+ case tag.name
35
+ when 'title'
36
+ @title = tag.text
37
+ when 'id'
38
+ @id = tag.text.split('#').last
39
+ when 'author'
40
+ @author = tag.elements['name'].text
41
+ when 'published'
42
+ @published = Date.parse( tag.text )
43
+ when 'updated'
44
+ @updated = Date.parse( tag.text )
45
+ when 'content'
46
+ @body = tag.text.strip()
47
+ end
48
+ end
49
+ else
50
+ @element = REXML::Element.new( 'entry' )
51
+ end
52
+ end
53
+
54
+ def to_hash
55
+ return { :title => @title,
56
+ :id => @id,
57
+ :author => @author,
58
+ :published => @published,
59
+ :updated => @updated,
60
+ :body => @date }
61
+ end
62
+
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,60 @@
1
+ #
2
+ # list.rb
3
+ # restbooks
4
+ #
5
+ # Created by Paul Chavard on 2009-09-12.
6
+ # Copyright 2009
7
+ #
8
+ # This file is part of RestBooks.
9
+ #
10
+ # RestBooks is free software: you can redistribute it and/or modify
11
+ # it under the terms of the GNU General Public License as published by
12
+ # the Free Software Foundation, either version 3 of the License, or
13
+ # (at your option) any later version.
14
+ #
15
+ # RestBooks is distributed in the hope that it will be useful,
16
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ # GNU General Public License for more details.
19
+ #
20
+ # You should have received a copy of the GNU General Public License
21
+ # along with RestBooks. If not, see <http://www.gnu.org/licenses/>.
22
+ #
23
+
24
+ module RestBooks
25
+ module Models
26
+ class List
27
+ include RestBooks::Model
28
+ attr_reader :title, :id, :updated, :description
29
+
30
+ def initialize( element )
31
+ if element
32
+ @element = element
33
+ @element.elements.each do |tag|
34
+ case tag.name
35
+ when 'title'
36
+ @title = tag.text.strip()
37
+ when 'id'
38
+ @id = tag.text.split('/').last
39
+ @id = @id.split(':').last if @id.split(':').length > 1
40
+ when 'updated'
41
+ @updated = Date.parse( tag.text )
42
+ when 'content'
43
+ @description = tag.text.strip()
44
+ end
45
+ end
46
+ else
47
+ @element = REXML::Element.new( 'entry' )
48
+ end
49
+ end
50
+
51
+ def to_hash
52
+ return { :title => @title,
53
+ :id => @id,
54
+ :updated => @updated,
55
+ :description => @description }
56
+ end
57
+
58
+ end
59
+ end
60
+ end