rubyjedi-actionwebservice 2.3.5.20100615120735

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.
Files changed (85) hide show
  1. data/CHANGELOG +335 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +381 -0
  4. data/Rakefile +180 -0
  5. data/TODO +32 -0
  6. data/examples/googlesearch/README +143 -0
  7. data/examples/googlesearch/autoloading/google_search_api.rb +50 -0
  8. data/examples/googlesearch/autoloading/google_search_controller.rb +57 -0
  9. data/examples/googlesearch/delegated/google_search_service.rb +108 -0
  10. data/examples/googlesearch/delegated/search_controller.rb +7 -0
  11. data/examples/googlesearch/direct/google_search_api.rb +50 -0
  12. data/examples/googlesearch/direct/search_controller.rb +58 -0
  13. data/examples/metaWeblog/README +17 -0
  14. data/examples/metaWeblog/apis/blogger_api.rb +60 -0
  15. data/examples/metaWeblog/apis/blogger_service.rb +34 -0
  16. data/examples/metaWeblog/apis/meta_weblog_api.rb +67 -0
  17. data/examples/metaWeblog/apis/meta_weblog_service.rb +48 -0
  18. data/examples/metaWeblog/controllers/xmlrpc_controller.rb +16 -0
  19. data/generators/web_service/USAGE +28 -0
  20. data/generators/web_service/templates/api_definition.rb +5 -0
  21. data/generators/web_service/templates/controller.rb +8 -0
  22. data/generators/web_service/templates/functional_test.rb +19 -0
  23. data/generators/web_service/web_service_generator.rb +29 -0
  24. data/lib/action_web_service/acts_as_web_service.rb +24 -0
  25. data/lib/action_web_service/api.rb +297 -0
  26. data/lib/action_web_service/base.rb +38 -0
  27. data/lib/action_web_service/casting.rb +151 -0
  28. data/lib/action_web_service/client/base.rb +28 -0
  29. data/lib/action_web_service/client/soap_client.rb +113 -0
  30. data/lib/action_web_service/client/xmlrpc_client.rb +58 -0
  31. data/lib/action_web_service/client.rb +3 -0
  32. data/lib/action_web_service/container/action_controller_container.rb +93 -0
  33. data/lib/action_web_service/container/delegated_container.rb +86 -0
  34. data/lib/action_web_service/container/direct_container.rb +69 -0
  35. data/lib/action_web_service/container.rb +3 -0
  36. data/lib/action_web_service/dispatcher/abstract.rb +208 -0
  37. data/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +396 -0
  38. data/lib/action_web_service/dispatcher.rb +2 -0
  39. data/lib/action_web_service/invocation.rb +202 -0
  40. data/lib/action_web_service/protocol/abstract.rb +112 -0
  41. data/lib/action_web_service/protocol/discovery.rb +37 -0
  42. data/lib/action_web_service/protocol/soap_protocol/marshaler.rb +242 -0
  43. data/lib/action_web_service/protocol/soap_protocol.rb +176 -0
  44. data/lib/action_web_service/protocol/xmlrpc_protocol.rb +123 -0
  45. data/lib/action_web_service/protocol.rb +4 -0
  46. data/lib/action_web_service/scaffolding.rb +281 -0
  47. data/lib/action_web_service/simple.rb +53 -0
  48. data/lib/action_web_service/string_to_datetime_for_soap.rb +16 -0
  49. data/lib/action_web_service/struct.rb +68 -0
  50. data/lib/action_web_service/support/class_inheritable_options.rb +26 -0
  51. data/lib/action_web_service/support/signature_types.rb +261 -0
  52. data/lib/action_web_service/templates/scaffolds/layout.html.erb +65 -0
  53. data/lib/action_web_service/templates/scaffolds/methods.html.erb +6 -0
  54. data/lib/action_web_service/templates/scaffolds/parameters.html.erb +29 -0
  55. data/lib/action_web_service/templates/scaffolds/result.html.erb +30 -0
  56. data/lib/action_web_service/test_invoke.rb +110 -0
  57. data/lib/action_web_service/version.rb +9 -0
  58. data/lib/action_web_service.rb +60 -0
  59. data/lib/actionwebservice.rb +1 -0
  60. data/setup.rb +1379 -0
  61. data/test/abstract_client.rb +184 -0
  62. data/test/abstract_dispatcher.rb +549 -0
  63. data/test/abstract_unit.rb +43 -0
  64. data/test/actionwebservice_unittest.db +0 -0
  65. data/test/api_test.rb +102 -0
  66. data/test/apis/auto_load_api.rb +3 -0
  67. data/test/apis/broken_auto_load_api.rb +2 -0
  68. data/test/base_test.rb +42 -0
  69. data/test/casting_test.rb +95 -0
  70. data/test/client_soap_test.rb +156 -0
  71. data/test/client_xmlrpc_test.rb +154 -0
  72. data/test/container_test.rb +75 -0
  73. data/test/debug.log +12305 -0
  74. data/test/dispatcher_action_controller_soap_test.rb +139 -0
  75. data/test/dispatcher_action_controller_xmlrpc_test.rb +59 -0
  76. data/test/fixtures/db_definitions/mysql.sql +8 -0
  77. data/test/fixtures/db_definitions/sqlite3.sql +8 -0
  78. data/test/fixtures/users.yml +12 -0
  79. data/test/gencov +3 -0
  80. data/test/invocation_test.rb +186 -0
  81. data/test/run +6 -0
  82. data/test/scaffolded_controller_test.rb +147 -0
  83. data/test/struct_test.rb +84 -0
  84. data/test/test_invoke_test.rb +113 -0
  85. metadata +182 -0
@@ -0,0 +1,143 @@
1
+ = Google Service example
2
+
3
+ This example shows how one would implement an API like Google
4
+ Search that uses lots of structured types.
5
+
6
+ There are examples for "Direct" and "Delegated" dispatching
7
+ modes.
8
+
9
+ There is also an example for API definition file autoloading.
10
+
11
+
12
+ = Running the examples
13
+
14
+ 1. Add the files to an Action Web Service enabled Rails project.
15
+
16
+ "Direct" example:
17
+
18
+ * Copy direct/search_controller.rb to "app/controllers"
19
+ in a Rails project.
20
+ * Copy direct/google_search_api.rb to "app/apis"
21
+ in a Rails project
22
+
23
+ "Delegated" example:
24
+
25
+ * Copy delegated/search_controller.rb to "app/controllers"
26
+ in a Rails project.
27
+ * Copy delegated/google_search_service.rb to "lib"
28
+ in a Rails project.
29
+
30
+ "Autoloading" example:
31
+
32
+ * Copy autoloading/google_search_api.rb to "app/apis" (create the directory
33
+ if it doesn't exist) in a Rails project.
34
+
35
+ * Copy autoloading/google_search_controller.rb "app/controllers"
36
+ in a Rails project.
37
+
38
+
39
+ 2. Go to the WSDL url in a browser, and check that it looks correct.
40
+
41
+ "Direct" and "Delegated" examples:
42
+ http://url_to_project/search/wsdl
43
+
44
+ "Autoloading" example:
45
+ http://url_to_project/google_search/wsdl
46
+
47
+ You can compare it to Google's hand-coded WSDL at http://api.google.com/GoogleSearch.wsdl
48
+ and see how close (or not) the generated version is.
49
+
50
+ Note that I used GoogleSearch as the canonical "best practice"
51
+ interoperable example when implementing WSDL/SOAP support, which might
52
+ explain extreme similarities :)
53
+
54
+
55
+ 3. Test that it works with .NET (Mono in this example):
56
+
57
+ $ wget WSDL_URL
58
+ $ mv wsdl GoogleSearch.wsdl
59
+ $ wsdl -out:GoogleSearch.cs GoogleSearch.wsdl
60
+
61
+ Add these lines to the GoogleSearchService class body (be mindful of the
62
+ wrapping):
63
+
64
+ public static void Main(string[] args)
65
+ {
66
+ GoogleSearchResult result;
67
+ GoogleSearchService service;
68
+
69
+ service = new GoogleSearchService();
70
+ result = service.doGoogleSearch("myApiKey", "my query", 10, 30, true, "restrict", false, "lr", "ie", "oe");
71
+ System.Console.WriteLine("documentFiltering: {0}", result.documentFiltering);
72
+ System.Console.WriteLine("searchComments: {0}", result.searchComments);
73
+ System.Console.WriteLine("estimatedTotalResultsCount: {0}", result.estimatedTotalResultsCount);
74
+ System.Console.WriteLine("estimateIsExact: {0}", result.estimateIsExact);
75
+ System.Console.WriteLine("resultElements:");
76
+ foreach (ResultElement element in result.resultElements) {
77
+ System.Console.WriteLine("\tsummary: {0}", element.summary);
78
+ System.Console.WriteLine("\tURL: {0}", element.URL);
79
+ System.Console.WriteLine("\tsnippet: {0}", element.snippet);
80
+ System.Console.WriteLine("\ttitle: {0}", element.title);
81
+ System.Console.WriteLine("\tcachedSize: {0}", element.cachedSize);
82
+ System.Console.WriteLine("\trelatedInformationPresent: {0}", element.relatedInformationPresent);
83
+ System.Console.WriteLine("\thostName: {0}", element.hostName);
84
+ System.Console.WriteLine("\tdirectoryCategory: {0}", element.directoryCategory.fullViewableName);
85
+ System.Console.WriteLine("\tdirectoryTitle: {0}", element.directoryTitle);
86
+ }
87
+ System.Console.WriteLine("searchQuery: {0}", result.searchQuery);
88
+ System.Console.WriteLine("startIndex: {0}", result.startIndex);
89
+ System.Console.WriteLine("endIndex: {0}", result.endIndex);
90
+ System.Console.WriteLine("searchTips: {0}", result.searchTips);
91
+ System.Console.WriteLine("directoryCategories:");
92
+ foreach (DirectoryCategory cat in result.directoryCategories) {
93
+ System.Console.WriteLine("\t{0} ({1})", cat.fullViewableName, cat.specialEncoding);
94
+ }
95
+ System.Console.WriteLine("searchTime: {0}", result.searchTime);
96
+ }
97
+
98
+ Now compile and run:
99
+
100
+ $ mcs -reference:System.Web.Services GoogleSearch.cs
101
+ $ mono GoogleSearch.exe
102
+
103
+
104
+ If you had the application running (on the same host you got
105
+ the WSDL from), you should see something like this:
106
+
107
+
108
+ documentFiltering: True
109
+ searchComments:
110
+ estimatedTotalResultsCount: 322000
111
+ estimateIsExact: False
112
+ resultElements:
113
+ summary: ONlamp.com: Rolling with Ruby on Rails
114
+ URL: http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html
115
+ snippet: Curt Hibbs shows off Ruby on Rails by building a simple ...
116
+ title: Teh Railz0r
117
+ cachedSize: Almost no lines of code!
118
+ relatedInformationPresent: True
119
+ hostName: rubyonrails.com
120
+ directoryCategory: Web Development
121
+ directoryTitle:
122
+ searchQuery: http://www.google.com/search?q=ruby+on+rails
123
+ startIndex: 10
124
+ endIndex: 40
125
+ searchTips: "on" is a very common word and was not included in your search [details]
126
+ directoryCategories:
127
+ Web Development (UTF-8)
128
+ Programming (US-ASCII)
129
+ searchTime: 1E-06
130
+
131
+
132
+ Also, if an API method throws an exception, it will be sent back to the
133
+ caller in the protocol's exception format, so they should get an exception
134
+ thrown on their side with a meaningful error message.
135
+
136
+ If you don't like this behaviour, you can do:
137
+
138
+ class MyController < ActionController::Base
139
+ web_service_exception_reporting false
140
+ end
141
+
142
+ 4. Crack open a beer. Publishing APIs for working with the same model as
143
+ your Rails web app should be easy from now on :)
@@ -0,0 +1,50 @@
1
+ class DirectoryCategory < ActionWebService::Struct
2
+ member :fullViewableName, :string
3
+ member :specialEncoding, :string
4
+ end
5
+
6
+ class ResultElement < ActionWebService::Struct
7
+ member :summary, :string
8
+ member :URL, :string
9
+ member :snippet, :string
10
+ member :title, :string
11
+ member :cachedSize, :string
12
+ member :relatedInformationPresent, :bool
13
+ member :hostName, :string
14
+ member :directoryCategory, DirectoryCategory
15
+ member :directoryTitle, :string
16
+ end
17
+
18
+ class GoogleSearchResult < ActionWebService::Struct
19
+ member :documentFiltering, :bool
20
+ member :searchComments, :string
21
+ member :estimatedTotalResultsCount, :int
22
+ member :estimateIsExact, :bool
23
+ member :resultElements, [ResultElement]
24
+ member :searchQuery, :string
25
+ member :startIndex, :int
26
+ member :endIndex, :int
27
+ member :searchTips, :string
28
+ member :directoryCategories, [DirectoryCategory]
29
+ member :searchTime, :float
30
+ end
31
+
32
+ class GoogleSearchAPI < ActionWebService::API::Base
33
+ inflect_names false
34
+
35
+ api_method :doGetCachedPage, :returns => [:string], :expects => [{:key=>:string}, {:url=>:string}]
36
+ api_method :doGetSpellingSuggestion, :returns => [:string], :expects => [{:key=>:string}, {:phrase=>:string}]
37
+
38
+ api_method :doGoogleSearch, :returns => [GoogleSearchResult], :expects => [
39
+ {:key=>:string},
40
+ {:q=>:string},
41
+ {:start=>:int},
42
+ {:maxResults=>:int},
43
+ {:filter=>:bool},
44
+ {:restrict=>:string},
45
+ {:safeSearch=>:bool},
46
+ {:lr=>:string},
47
+ {:ie=>:string},
48
+ {:oe=>:string}
49
+ ]
50
+ end
@@ -0,0 +1,57 @@
1
+ class GoogleSearchController < ApplicationController
2
+ wsdl_service_name 'GoogleSearch'
3
+
4
+ def doGetCachedPage
5
+ "<html><body>i am a cached page. my key was %s, url was %s</body></html>" % [@params['key'], @params['url']]
6
+ end
7
+
8
+ def doSpellingSuggestion
9
+ "%s: Did you mean '%s'?" % [@params['key'], @params['phrase']]
10
+ end
11
+
12
+ def doGoogleSearch
13
+ resultElement = ResultElement.new
14
+ resultElement.summary = "ONlamp.com: Rolling with Ruby on Rails"
15
+ resultElement.URL = "http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html"
16
+ resultElement.snippet = "Curt Hibbs shows off Ruby on Rails by building a simple application that requires " +
17
+ "almost no Ruby experience. ... Rolling with Ruby on Rails. ..."
18
+ resultElement.title = "Teh Railz0r"
19
+ resultElement.cachedSize = "Almost no lines of code!"
20
+ resultElement.relatedInformationPresent = true
21
+ resultElement.hostName = "rubyonrails.com"
22
+ resultElement.directoryCategory = category("Web Development", "UTF-8")
23
+
24
+ result = GoogleSearchResult.new
25
+ result.documentFiltering = @params['filter']
26
+ result.searchComments = ""
27
+ result.estimatedTotalResultsCount = 322000
28
+ result.estimateIsExact = false
29
+ result.resultElements = [resultElement]
30
+ result.searchQuery = "http://www.google.com/search?q=ruby+on+rails"
31
+ result.startIndex = @params['start']
32
+ result.endIndex = @params['start'] + @params['maxResults']
33
+ result.searchTips = "\"on\" is a very common word and was not included in your search [details]"
34
+ result.searchTime = 0.000001
35
+
36
+ # For Mono, we have to clone objects if they're referenced by more than one place, otherwise
37
+ # the Ruby SOAP collapses them into one instance and uses references all over the
38
+ # place, confusing Mono.
39
+ #
40
+ # This has recently been fixed:
41
+ # http://bugzilla.ximian.com/show_bug.cgi?id=72265
42
+ result.directoryCategories = [
43
+ category("Web Development", "UTF-8"),
44
+ category("Programming", "US-ASCII"),
45
+ ]
46
+
47
+ result
48
+ end
49
+
50
+ private
51
+ def category(name, encoding)
52
+ cat = DirectoryCategory.new
53
+ cat.fullViewableName = name.dup
54
+ cat.specialEncoding = encoding.dup
55
+ cat
56
+ end
57
+ end
@@ -0,0 +1,108 @@
1
+ class DirectoryCategory < ActionWebService::Struct
2
+ member :fullViewableName, :string
3
+ member :specialEncoding, :string
4
+ end
5
+
6
+ class ResultElement < ActionWebService::Struct
7
+ member :summary, :string
8
+ member :URL, :string
9
+ member :snippet, :string
10
+ member :title, :string
11
+ member :cachedSize, :string
12
+ member :relatedInformationPresent, :bool
13
+ member :hostName, :string
14
+ member :directoryCategory, DirectoryCategory
15
+ member :directoryTitle, :string
16
+ end
17
+
18
+ class GoogleSearchResult < ActionWebService::Struct
19
+ member :documentFiltering, :bool
20
+ member :searchComments, :string
21
+ member :estimatedTotalResultsCount, :int
22
+ member :estimateIsExact, :bool
23
+ member :resultElements, [ResultElement]
24
+ member :searchQuery, :string
25
+ member :startIndex, :int
26
+ member :endIndex, :int
27
+ member :searchTips, :string
28
+ member :directoryCategories, [DirectoryCategory]
29
+ member :searchTime, :float
30
+ end
31
+
32
+ class GoogleSearchAPI < ActionWebService::API::Base
33
+ inflect_names false
34
+
35
+ api_method :doGetCachedPage, :returns => [:string], :expects => [{:key=>:string}, {:url=>:string}]
36
+ api_method :doGetSpellingSuggestion, :returns => [:string], :expects => [{:key=>:string}, {:phrase=>:string}]
37
+
38
+ api_method :doGoogleSearch, :returns => [GoogleSearchResult], :expects => [
39
+ {:key=>:string},
40
+ {:q=>:string},
41
+ {:start=>:int},
42
+ {:maxResults=>:int},
43
+ {:filter=>:bool},
44
+ {:restrict=>:string},
45
+ {:safeSearch=>:bool},
46
+ {:lr=>:string},
47
+ {:ie=>:string},
48
+ {:oe=>:string}
49
+ ]
50
+ end
51
+
52
+ class GoogleSearchService < ActionWebService::Base
53
+ web_service_api GoogleSearchAPI
54
+
55
+ def doGetCachedPage(key, url)
56
+ "<html><body>i am a cached page</body></html>"
57
+ end
58
+
59
+ def doSpellingSuggestion(key, phrase)
60
+ "Did you mean 'teh'?"
61
+ end
62
+
63
+ def doGoogleSearch(key, q, start, maxResults, filter, restrict, safeSearch, lr, ie, oe)
64
+ resultElement = ResultElement.new
65
+ resultElement.summary = "ONlamp.com: Rolling with Ruby on Rails"
66
+ resultElement.URL = "http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html"
67
+ resultElement.snippet = "Curt Hibbs shows off Ruby on Rails by building a simple application that requires " +
68
+ "almost no Ruby experience. ... Rolling with Ruby on Rails. ..."
69
+ resultElement.title = "Teh Railz0r"
70
+ resultElement.cachedSize = "Almost no lines of code!"
71
+ resultElement.relatedInformationPresent = true
72
+ resultElement.hostName = "rubyonrails.com"
73
+ resultElement.directoryCategory = category("Web Development", "UTF-8")
74
+
75
+ result = GoogleSearchResult.new
76
+ result.documentFiltering = filter
77
+ result.searchComments = ""
78
+ result.estimatedTotalResultsCount = 322000
79
+ result.estimateIsExact = false
80
+ result.resultElements = [resultElement]
81
+ result.searchQuery = "http://www.google.com/search?q=ruby+on+rails"
82
+ result.startIndex = start
83
+ result.endIndex = start + maxResults
84
+ result.searchTips = "\"on\" is a very common word and was not included in your search [details]"
85
+ result.searchTime = 0.000001
86
+
87
+ # For Mono, we have to clone objects if they're referenced by more than one place, otherwise
88
+ # the Ruby SOAP collapses them into one instance and uses references all over the
89
+ # place, confusing Mono.
90
+ #
91
+ # This has recently been fixed:
92
+ # http://bugzilla.ximian.com/show_bug.cgi?id=72265
93
+ result.directoryCategories = [
94
+ category("Web Development", "UTF-8"),
95
+ category("Programming", "US-ASCII"),
96
+ ]
97
+
98
+ result
99
+ end
100
+
101
+ private
102
+ def category(name, encoding)
103
+ cat = DirectoryCategory.new
104
+ cat.fullViewableName = name.dup
105
+ cat.specialEncoding = encoding.dup
106
+ cat
107
+ end
108
+ end
@@ -0,0 +1,7 @@
1
+ require 'google_search_service'
2
+
3
+ class SearchController < ApplicationController
4
+ wsdl_service_name 'GoogleSearch'
5
+ web_service_dispatching_mode :delegated
6
+ web_service :beta3, GoogleSearchService.new
7
+ end
@@ -0,0 +1,50 @@
1
+ class DirectoryCategory < ActionWebService::Struct
2
+ member :fullViewableName, :string
3
+ member :specialEncoding, :string
4
+ end
5
+
6
+ class ResultElement < ActionWebService::Struct
7
+ member :summary, :string
8
+ member :URL, :string
9
+ member :snippet, :string
10
+ member :title, :string
11
+ member :cachedSize, :string
12
+ member :relatedInformationPresent, :bool
13
+ member :hostName, :string
14
+ member :directoryCategory, DirectoryCategory
15
+ member :directoryTitle, :string
16
+ end
17
+
18
+ class GoogleSearchResult < ActionWebService::Struct
19
+ member :documentFiltering, :bool
20
+ member :searchComments, :string
21
+ member :estimatedTotalResultsCount, :int
22
+ member :estimateIsExact, :bool
23
+ member :resultElements, [ResultElement]
24
+ member :searchQuery, :string
25
+ member :startIndex, :int
26
+ member :endIndex, :int
27
+ member :searchTips, :string
28
+ member :directoryCategories, [DirectoryCategory]
29
+ member :searchTime, :float
30
+ end
31
+
32
+ class GoogleSearchAPI < ActionWebService::API::Base
33
+ inflect_names false
34
+
35
+ api_method :doGetCachedPage, :returns => [:string], :expects => [{:key=>:string}, {:url=>:string}]
36
+ api_method :doGetSpellingSuggestion, :returns => [:string], :expects => [{:key=>:string}, {:phrase=>:string}]
37
+
38
+ api_method :doGoogleSearch, :returns => [GoogleSearchResult], :expects => [
39
+ {:key=>:string},
40
+ {:q=>:string},
41
+ {:start=>:int},
42
+ {:maxResults=>:int},
43
+ {:filter=>:bool},
44
+ {:restrict=>:string},
45
+ {:safeSearch=>:bool},
46
+ {:lr=>:string},
47
+ {:ie=>:string},
48
+ {:oe=>:string}
49
+ ]
50
+ end
@@ -0,0 +1,58 @@
1
+ class SearchController < ApplicationController
2
+ web_service_api :google_search
3
+ wsdl_service_name 'GoogleSearch'
4
+
5
+ def doGetCachedPage
6
+ "<html><body>i am a cached page. my key was %s, url was %s</body></html>" % [@params['key'], @params['url']]
7
+ end
8
+
9
+ def doSpellingSuggestion
10
+ "%s: Did you mean '%s'?" % [@params['key'], @params['phrase']]
11
+ end
12
+
13
+ def doGoogleSearch
14
+ resultElement = ResultElement.new
15
+ resultElement.summary = "ONlamp.com: Rolling with Ruby on Rails"
16
+ resultElement.URL = "http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html"
17
+ resultElement.snippet = "Curt Hibbs shows off Ruby on Rails by building a simple application that requires " +
18
+ "almost no Ruby experience. ... Rolling with Ruby on Rails. ..."
19
+ resultElement.title = "Teh Railz0r"
20
+ resultElement.cachedSize = "Almost no lines of code!"
21
+ resultElement.relatedInformationPresent = true
22
+ resultElement.hostName = "rubyonrails.com"
23
+ resultElement.directoryCategory = category("Web Development", "UTF-8")
24
+
25
+ result = GoogleSearchResult.new
26
+ result.documentFiltering = @params['filter']
27
+ result.searchComments = ""
28
+ result.estimatedTotalResultsCount = 322000
29
+ result.estimateIsExact = false
30
+ result.resultElements = [resultElement]
31
+ result.searchQuery = "http://www.google.com/search?q=ruby+on+rails"
32
+ result.startIndex = @params['start']
33
+ result.endIndex = @params['start'] + @params['maxResults']
34
+ result.searchTips = "\"on\" is a very common word and was not included in your search [details]"
35
+ result.searchTime = 0.000001
36
+
37
+ # For Mono, we have to clone objects if they're referenced by more than one place, otherwise
38
+ # the Ruby SOAP collapses them into one instance and uses references all over the
39
+ # place, confusing Mono.
40
+ #
41
+ # This has recently been fixed:
42
+ # http://bugzilla.ximian.com/show_bug.cgi?id=72265
43
+ result.directoryCategories = [
44
+ category("Web Development", "UTF-8"),
45
+ category("Programming", "US-ASCII"),
46
+ ]
47
+
48
+ result
49
+ end
50
+
51
+ private
52
+ def category(name, encoding)
53
+ cat = DirectoryCategory.new
54
+ cat.fullViewableName = name.dup
55
+ cat.specialEncoding = encoding.dup
56
+ cat
57
+ end
58
+ end
@@ -0,0 +1,17 @@
1
+ = metaWeblog example
2
+
3
+ This example shows how one might begin to go about adding metaWeblog
4
+ (http://www.xmlrpc.com/metaWeblogApi) API support to a Rails-based
5
+ blogging application.
6
+
7
+ The example APIs are more verbose than you may want to make them, for documentation
8
+ reasons.
9
+
10
+ = Running
11
+
12
+ 1. Copy the "apis" directory and its files into "app" in a Rails project.
13
+
14
+ 2. Copy the "controllers" directory and its files into "app" in a Rails project
15
+
16
+ 3. Fire up a desktop blogging application (such as w.bloggar, MarsEdit, or BloGTK),
17
+ point it at http://localhost:3000/xmlrpc/api, and try creating or editing blog posts.
@@ -0,0 +1,60 @@
1
+ #
2
+ # see the blogger API spec at http://www.blogger.com/developers/api/1_docs/
3
+ # note that the method signatures are subtly different to metaWeblog, they
4
+ # are not identical. take care to ensure you handle the different semantics
5
+ # properly if you want to support blogger API too, to get maximum compatibility.
6
+ #
7
+
8
+ module Blog
9
+ class Blog < ActionWebService::Struct
10
+ member :url, :string
11
+ member :blogid, :string
12
+ member :blogName, :string
13
+ end
14
+
15
+ class User < ActionWebService::Struct
16
+ member :nickname, :string
17
+ member :userid, :string
18
+ member :url, :string
19
+ member :email, :string
20
+ member :lastname, :string
21
+ member :firstname, :string
22
+ end
23
+ end
24
+
25
+ #
26
+ # blogger
27
+ #
28
+ class BloggerAPI < ActionWebService::API::Base
29
+ inflect_names false
30
+
31
+ api_method :newPost, :returns => [:string], :expects => [
32
+ {:appkey=>:string},
33
+ {:blogid=>:string},
34
+ {:username=>:string},
35
+ {:password=>:string},
36
+ {:content=>:string},
37
+ {:publish=>:bool}
38
+ ]
39
+
40
+ api_method :editPost, :returns => [:bool], :expects => [
41
+ {:appkey=>:string},
42
+ {:postid=>:string},
43
+ {:username=>:string},
44
+ {:password=>:string},
45
+ {:content=>:string},
46
+ {:publish=>:bool}
47
+ ]
48
+
49
+ api_method :getUsersBlogs, :returns => [[Blog::Blog]], :expects => [
50
+ {:appkey=>:string},
51
+ {:username=>:string},
52
+ {:password=>:string}
53
+ ]
54
+
55
+ api_method :getUserInfo, :returns => [Blog::User], :expects => [
56
+ {:appkey=>:string},
57
+ {:username=>:string},
58
+ {:password=>:string}
59
+ ]
60
+ end
@@ -0,0 +1,34 @@
1
+ require 'blogger_api'
2
+
3
+ class BloggerService < ActionWebService::Base
4
+ web_service_api BloggerAPI
5
+
6
+ def initialize
7
+ @postid = 0
8
+ end
9
+
10
+ def newPost(key, id, user, pw, content, publish)
11
+ $stderr.puts "id=#{id} user=#{user} pw=#{pw}, content=#{content.inspect} [#{publish}]"
12
+ (@postid += 1).to_s
13
+ end
14
+
15
+ def editPost(key, post_id, user, pw, content, publish)
16
+ $stderr.puts "id=#{post_id} user=#{user} pw=#{pw} content=#{content.inspect} [#{publish}]"
17
+ true
18
+ end
19
+
20
+ def getUsersBlogs(key, user, pw)
21
+ $stderr.puts "getting blogs for #{user}"
22
+ blog = Blog::Blog.new(
23
+ :url =>'http://blog',
24
+ :blogid => 'myblog',
25
+ :blogName => 'My Blog'
26
+ )
27
+ [blog]
28
+ end
29
+
30
+ def getUserInfo(key, user, pw)
31
+ $stderr.puts "getting user info for #{user}"
32
+ Blog::User.new(:nickname => 'user', :email => 'user@test.com')
33
+ end
34
+ end
@@ -0,0 +1,67 @@
1
+ #
2
+ # here lie structures, cousins of those on http://www.xmlrpc.com/metaWeblog
3
+ # but they don't necessarily the real world reflect
4
+ # so if you do, find that your client complains:
5
+ # please tell, of problems you suffered through
6
+ #
7
+
8
+ module Blog
9
+ class Post < ActionWebService::Struct
10
+ member :title, :string
11
+ member :link, :string
12
+ member :description, :string
13
+ member :author, :string
14
+ member :category, :string
15
+ member :comments, :string
16
+ member :guid, :string
17
+ member :pubDate, :string
18
+ end
19
+
20
+ class Category < ActionWebService::Struct
21
+ member :description, :string
22
+ member :htmlUrl, :string
23
+ member :rssUrl, :string
24
+ end
25
+ end
26
+
27
+ #
28
+ # metaWeblog
29
+ #
30
+ class MetaWeblogAPI < ActionWebService::API::Base
31
+ inflect_names false
32
+
33
+ api_method :newPost, :returns => [:string], :expects => [
34
+ {:blogid=>:string},
35
+ {:username=>:string},
36
+ {:password=>:string},
37
+ {:struct=>Blog::Post},
38
+ {:publish=>:bool}
39
+ ]
40
+
41
+ api_method :editPost, :returns => [:bool], :expects => [
42
+ {:postid=>:string},
43
+ {:username=>:string},
44
+ {:password=>:string},
45
+ {:struct=>Blog::Post},
46
+ {:publish=>:bool},
47
+ ]
48
+
49
+ api_method :getPost, :returns => [Blog::Post], :expects => [
50
+ {:postid=>:string},
51
+ {:username=>:string},
52
+ {:password=>:string},
53
+ ]
54
+
55
+ api_method :getCategories, :returns => [[Blog::Category]], :expects => [
56
+ {:blogid=>:string},
57
+ {:username=>:string},
58
+ {:password=>:string},
59
+ ]
60
+
61
+ api_method :getRecentPosts, :returns => [[Blog::Post]], :expects => [
62
+ {:blogid=>:string},
63
+ {:username=>:string},
64
+ {:password=>:string},
65
+ {:numberOfPosts=>:int},
66
+ ]
67
+ end