pelle-actionwebservice 2.3.3
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/CHANGELOG +320 -0
 - data/MIT-LICENSE +21 -0
 - data/README +381 -0
 - data/Rakefile +173 -0
 - data/TODO +32 -0
 - data/examples/googlesearch/README +143 -0
 - data/examples/googlesearch/autoloading/google_search_api.rb +50 -0
 - data/examples/googlesearch/autoloading/google_search_controller.rb +57 -0
 - data/examples/googlesearch/delegated/google_search_service.rb +108 -0
 - data/examples/googlesearch/delegated/search_controller.rb +7 -0
 - data/examples/googlesearch/direct/google_search_api.rb +50 -0
 - data/examples/googlesearch/direct/search_controller.rb +58 -0
 - data/examples/metaWeblog/README +17 -0
 - data/examples/metaWeblog/apis/blogger_api.rb +60 -0
 - data/examples/metaWeblog/apis/blogger_service.rb +34 -0
 - data/examples/metaWeblog/apis/meta_weblog_api.rb +67 -0
 - data/examples/metaWeblog/apis/meta_weblog_service.rb +48 -0
 - data/examples/metaWeblog/controllers/xmlrpc_controller.rb +16 -0
 - data/generators/web_service/USAGE +28 -0
 - data/generators/web_service/templates/api_definition.rb +5 -0
 - data/generators/web_service/templates/controller.rb +8 -0
 - data/generators/web_service/templates/functional_test.rb +19 -0
 - data/generators/web_service/web_service_generator.rb +29 -0
 - data/lib/action_web_service/api.rb +297 -0
 - data/lib/action_web_service/base.rb +38 -0
 - data/lib/action_web_service/casting.rb +149 -0
 - data/lib/action_web_service/client/base.rb +28 -0
 - data/lib/action_web_service/client/soap_client.rb +113 -0
 - data/lib/action_web_service/client/xmlrpc_client.rb +58 -0
 - data/lib/action_web_service/client.rb +3 -0
 - data/lib/action_web_service/container/action_controller_container.rb +93 -0
 - data/lib/action_web_service/container/delegated_container.rb +86 -0
 - data/lib/action_web_service/container/direct_container.rb +69 -0
 - data/lib/action_web_service/container.rb +3 -0
 - data/lib/action_web_service/dispatcher/abstract.rb +207 -0
 - data/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +379 -0
 - data/lib/action_web_service/dispatcher.rb +2 -0
 - data/lib/action_web_service/invocation.rb +202 -0
 - data/lib/action_web_service/protocol/abstract.rb +112 -0
 - data/lib/action_web_service/protocol/discovery.rb +37 -0
 - data/lib/action_web_service/protocol/soap_protocol/marshaler.rb +242 -0
 - data/lib/action_web_service/protocol/soap_protocol.rb +176 -0
 - data/lib/action_web_service/protocol/xmlrpc_protocol.rb +122 -0
 - data/lib/action_web_service/protocol.rb +4 -0
 - data/lib/action_web_service/scaffolding.rb +281 -0
 - data/lib/action_web_service/struct.rb +64 -0
 - data/lib/action_web_service/support/class_inheritable_options.rb +26 -0
 - data/lib/action_web_service/support/signature_types.rb +226 -0
 - data/lib/action_web_service/templates/scaffolds/layout.html.erb +65 -0
 - data/lib/action_web_service/templates/scaffolds/methods.html.erb +6 -0
 - data/lib/action_web_service/templates/scaffolds/parameters.html.erb +29 -0
 - data/lib/action_web_service/templates/scaffolds/result.html.erb +30 -0
 - data/lib/action_web_service/test_invoke.rb +110 -0
 - data/lib/action_web_service/version.rb +9 -0
 - data/lib/action_web_service.rb +66 -0
 - data/lib/actionwebservice.rb +1 -0
 - data/setup.rb +1379 -0
 - data/test/abstract_client.rb +183 -0
 - data/test/abstract_dispatcher.rb +548 -0
 - data/test/abstract_unit.rb +39 -0
 - data/test/api_test.rb +102 -0
 - data/test/apis/auto_load_api.rb +3 -0
 - data/test/apis/broken_auto_load_api.rb +2 -0
 - data/test/base_test.rb +42 -0
 - data/test/casting_test.rb +94 -0
 - data/test/client_soap_test.rb +155 -0
 - data/test/client_xmlrpc_test.rb +153 -0
 - data/test/container_test.rb +73 -0
 - data/test/dispatcher_action_controller_soap_test.rb +138 -0
 - data/test/dispatcher_action_controller_xmlrpc_test.rb +59 -0
 - data/test/fixtures/db_definitions/mysql.sql +8 -0
 - data/test/fixtures/users.yml +12 -0
 - data/test/gencov +3 -0
 - data/test/invocation_test.rb +185 -0
 - data/test/run +6 -0
 - data/test/scaffolded_controller_test.rb +146 -0
 - data/test/struct_test.rb +52 -0
 - data/test/test_invoke_test.rb +112 -0
 - metadata +171 -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,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
         
     |