From 9e43db5523f14fc354aedca8c44a2db64234c7e4 Mon Sep 17 00:00:00 2001 From: Alpha Chen Date: Sun, 8 Nov 2015 13:55:33 -0800 Subject: [PATCH] [alfred] Add Giphy workflow --- .../features/websearch/prefs.plist | 2 +- .../CHANGELOG.md | 3 + .../Gemfile | 4 + .../Gemfile.lock | 19 + .../README.md | 14 + .../Rakefile | 1 + .../giphy.rb | 120 ++++ .../icon.png | Bin 0 -> 24597 bytes .../info.plist | 206 ++++++ .../vendor/bundle/bundler/setup.rb | 9 + .../bundle/ruby/2.0.0/cache/alphred-1.1.1.gem | Bin 0 -> 10752 bytes .../bundle/ruby/2.0.0/cache/builder-3.2.2.gem | Bin 0 -> 31744 bytes .../bundle/ruby/2.0.0/cache/faraday-0.9.2.gem | Bin 0 -> 35840 bytes .../ruby/2.0.0/cache/multipart-post-2.0.0.gem | Bin 0 -> 11264 bytes .../ruby/2.0.0/gems/alphred-1.1.1/.gitignore | 9 + .../ruby/2.0.0/gems/alphred-1.1.1/.travis.yml | 4 + .../2.0.0/gems/alphred-1.1.1/CHANGELOG.md | 14 + .../gems/alphred-1.1.1/CODE_OF_CONDUCT.md | 13 + .../ruby/2.0.0/gems/alphred-1.1.1/Gemfile | 10 + .../ruby/2.0.0/gems/alphred-1.1.1/Guardfile | 5 + .../ruby/2.0.0/gems/alphred-1.1.1/LICENSE.txt | 21 + .../ruby/2.0.0/gems/alphred-1.1.1/README.md | 152 +++++ .../ruby/2.0.0/gems/alphred-1.1.1/Rakefile | 17 + .../2.0.0/gems/alphred-1.1.1/alphred.gemspec | 26 + .../2.0.0/gems/alphred-1.1.1/lib/alphred.rb | 10 + .../gems/alphred-1.1.1/lib/alphred/config.rb | 55 ++ .../gems/alphred-1.1.1/lib/alphred/icon.rb | 39 ++ .../gems/alphred-1.1.1/lib/alphred/item.rb | 59 ++ .../gems/alphred-1.1.1/lib/alphred/items.rb | 23 + .../gems/alphred-1.1.1/lib/alphred/mods.rb | 22 + .../gems/alphred-1.1.1/lib/alphred/tasks.rb | 40 ++ .../gems/alphred-1.1.1/lib/alphred/text.rb | 17 + .../gems/alphred-1.1.1/lib/alphred/version.rb | 3 + .../ruby/2.0.0/gems/builder-3.2.2/CHANGES | 107 +++ .../ruby/2.0.0/gems/builder-3.2.2/MIT-LICENSE | 20 + .../ruby/2.0.0/gems/builder-3.2.2/README.md | 258 ++++++++ .../ruby/2.0.0/gems/builder-3.2.2/Rakefile | 195 ++++++ .../2.0.0/gems/builder-3.2.2/doc/jamis.rb | 591 +++++++++++++++++ .../doc/releases/builder-1.2.4.rdoc | 31 + .../doc/releases/builder-2.0.0.rdoc | 46 ++ .../doc/releases/builder-2.1.1.rdoc | 58 ++ .../gems/builder-3.2.2/lib/blankslate.rb | 137 ++++ .../2.0.0/gems/builder-3.2.2/lib/builder.rb | 13 + .../builder-3.2.2/lib/builder/blankslate.rb | 23 + .../gems/builder-3.2.2/lib/builder/version.rb | 8 + .../gems/builder-3.2.2/lib/builder/xchar.rb | 197 ++++++ .../gems/builder-3.2.2/lib/builder/xmlbase.rb | 199 ++++++ .../builder-3.2.2/lib/builder/xmlevents.rb | 63 ++ .../builder-3.2.2/lib/builder/xmlmarkup.rb | 339 ++++++++++ .../gems/builder-3.2.2/rakelib/publish.rake | 17 + .../gems/builder-3.2.2/rakelib/tags.rake | 62 ++ .../gems/builder-3.2.2/test/performance.rb | 41 ++ .../2.0.0/gems/builder-3.2.2/test/preload.rb | 39 ++ .../builder-3.2.2/test/test_blankslate.rb | 217 +++++++ .../builder-3.2.2/test/test_eventbuilder.rb | 150 +++++ .../builder-3.2.2/test/test_markupbuilder.rb | 611 ++++++++++++++++++ .../builder-3.2.2/test/test_method_caching.rb | 62 ++ .../builder-3.2.2/test/test_namecollision.rb | 39 ++ .../gems/builder-3.2.2/test/test_xchar.rb | 78 +++ .../ruby/2.0.0/gems/faraday-0.9.2/LICENSE.md | 20 + .../ruby/2.0.0/gems/faraday-0.9.2/README.md | 245 +++++++ .../2.0.0/gems/faraday-0.9.2/lib/faraday.rb | 268 ++++++++ .../gems/faraday-0.9.2/lib/faraday/adapter.rb | 46 ++ .../lib/faraday/adapter/em_http.rb | 237 +++++++ .../lib/faraday/adapter/em_http_ssl_patch.rb | 56 ++ .../lib/faraday/adapter/em_synchrony.rb | 100 +++ .../adapter/em_synchrony/parallel_manager.rb | 66 ++ .../lib/faraday/adapter/excon.rb | 81 +++ .../lib/faraday/adapter/httpclient.rb | 117 ++++ .../lib/faraday/adapter/net_http.rb | 130 ++++ .../faraday/adapter/net_http_persistent.rb | 49 ++ .../lib/faraday/adapter/patron.rb | 78 +++ .../faraday-0.9.2/lib/faraday/adapter/rack.rb | 58 ++ .../faraday-0.9.2/lib/faraday/adapter/test.rb | 162 +++++ .../lib/faraday/adapter/typhoeus.rb | 123 ++++ .../faraday-0.9.2/lib/faraday/autoload.rb | 84 +++ .../faraday-0.9.2/lib/faraday/connection.rb | 437 +++++++++++++ .../gems/faraday-0.9.2/lib/faraday/error.rb | 53 ++ .../faraday-0.9.2/lib/faraday/middleware.rb | 37 ++ .../gems/faraday-0.9.2/lib/faraday/options.rb | 359 ++++++++++ .../faraday-0.9.2/lib/faraday/parameters.rb | 197 ++++++ .../faraday-0.9.2/lib/faraday/rack_builder.rb | 213 ++++++ .../gems/faraday-0.9.2/lib/faraday/request.rb | 92 +++ .../lib/faraday/request/authorization.rb | 42 ++ .../faraday/request/basic_authentication.rb | 13 + .../lib/faraday/request/instrumentation.rb | 36 ++ .../lib/faraday/request/multipart.rb | 63 ++ .../lib/faraday/request/retry.rb | 154 +++++ .../faraday/request/token_authentication.rb | 15 + .../lib/faraday/request/url_encoded.rb | 36 ++ .../faraday-0.9.2/lib/faraday/response.rb | 93 +++ .../lib/faraday/response/logger.rb | 59 ++ .../lib/faraday/response/raise_error.rb | 21 + .../faraday-0.9.2/lib/faraday/upload_io.rb | 67 ++ .../gems/faraday-0.9.2/lib/faraday/utils.rb | 309 +++++++++ .../gems/multipart-post-2.0.0/.gitignore | 6 + .../gems/multipart-post-2.0.0/.travis.yml | 7 + .../2.0.0/gems/multipart-post-2.0.0/Gemfile | 14 + .../gems/multipart-post-2.0.0/History.txt | 60 ++ .../gems/multipart-post-2.0.0/Manifest.txt | 9 + .../2.0.0/gems/multipart-post-2.0.0/README.md | 77 +++ .../2.0.0/gems/multipart-post-2.0.0/Rakefile | 9 + .../multipart-post-2.0.0/lib/composite_io.rb | 108 ++++ .../lib/multipart_post.rb | 9 + .../multipart-post-2.0.0/lib/multipartable.rb | 29 + .../lib/net/http/post/multipart.rb | 27 + .../gems/multipart-post-2.0.0/lib/parts.rb | 96 +++ .../multipart-post.gemspec | 22 + .../multipart-post-2.0.0/test/multibyte.txt | 1 + .../test/net/http/post/test_multipart.rb | 110 ++++ .../test/test_composite_io.rb | 115 ++++ .../multipart-post-2.0.0/test/test_parts.rb | 86 +++ .../specifications/alphred-1.1.1.gemspec | 37 ++ .../specifications/builder-3.2.2.gemspec | 20 + .../specifications/faraday-0.9.2.gemspec | 28 + .../multipart-post-2.0.0.gemspec | 19 + .../info.plist | 11 +- 117 files changed, 9632 insertions(+), 2 deletions(-) create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/CHANGELOG.md create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/Gemfile create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/Gemfile.lock create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/README.md create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/Rakefile create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/giphy.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/icon.png create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/info.plist create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/bundler/setup.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/cache/alphred-1.1.1.gem create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/cache/builder-3.2.2.gem create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/cache/faraday-0.9.2.gem create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/cache/multipart-post-2.0.0.gem create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/.gitignore create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/.travis.yml create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/CHANGELOG.md create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/CODE_OF_CONDUCT.md create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/Gemfile create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/Guardfile create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/LICENSE.txt create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/README.md create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/Rakefile create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/alphred.gemspec create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/config.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/icon.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/item.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/items.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/mods.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/tasks.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/text.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/version.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/CHANGES create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/MIT-LICENSE create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/README.md create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/Rakefile create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/jamis.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/releases/builder-1.2.4.rdoc create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/releases/builder-2.0.0.rdoc create mode 100755 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/releases/builder-2.1.1.rdoc create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/blankslate.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/blankslate.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/version.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xchar.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xmlbase.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xmlevents.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xmlmarkup.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/rakelib/publish.rake create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/rakelib/tags.rake create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/performance.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/preload.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_blankslate.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_eventbuilder.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_markupbuilder.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_method_caching.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_namecollision.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_xchar.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/LICENSE.md create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/README.md create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_http.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_http_ssl_patch.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_synchrony.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_synchrony/parallel_manager.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/excon.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/httpclient.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/net_http.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/net_http_persistent.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/patron.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/rack.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/test.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/typhoeus.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/autoload.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/connection.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/error.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/middleware.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/options.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/parameters.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/rack_builder.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/authorization.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/basic_authentication.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/instrumentation.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/multipart.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/retry.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/token_authentication.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/url_encoded.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/response.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/response/logger.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/response/raise_error.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/upload_io.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/utils.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/.gitignore create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/.travis.yml create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/Gemfile create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/History.txt create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/Manifest.txt create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/README.md create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/Rakefile create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/composite_io.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/multipart_post.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/multipartable.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/net/http/post/multipart.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/parts.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/multipart-post.gemspec create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/multibyte.txt create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/net/http/post/test_multipart.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/test_composite_io.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/test_parts.rb create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/alphred-1.1.1.gemspec create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/builder-3.2.2.gemspec create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/faraday-0.9.2.gemspec create mode 100644 Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/multipart-post-2.0.0.gemspec diff --git a/Alfred 2/Alfred.alfredpreferences/preferences/features/websearch/prefs.plist b/Alfred 2/Alfred.alfredpreferences/preferences/features/websearch/prefs.plist index 39cc754..4c75425 100644 --- a/Alfred 2/Alfred.alfredpreferences/preferences/features/websearch/prefs.plist +++ b/Alfred 2/Alfred.alfredpreferences/preferences/features/websearch/prefs.plist @@ -67,7 +67,7 @@ 78F38D7E-7CF4-41FC-AD5F-C4017FFCA0AE enabled - + keyword giphy plusSpaces diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/CHANGELOG.md b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/CHANGELOG.md new file mode 100644 index 0000000..a3f80b0 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/CHANGELOG.md @@ -0,0 +1,3 @@ +## Unreleased +### Added +- Initial release: search Giphy for GIFs diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/Gemfile b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/Gemfile new file mode 100644 index 0000000..922932b --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/Gemfile @@ -0,0 +1,4 @@ +source "https://rubygems.org" + +gem "alphred", "~> 1.1" +gem "faraday", "~> 0.9" diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/Gemfile.lock b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/Gemfile.lock new file mode 100644 index 0000000..0f8903a --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/Gemfile.lock @@ -0,0 +1,19 @@ +GEM + remote: https://rubygems.org/ + specs: + alphred (1.1.1) + builder (~> 3.2) + builder (3.2.2) + faraday (0.9.2) + multipart-post (>= 1.2, < 3) + multipart-post (2.0.0) + +PLATFORMS + ruby + +DEPENDENCIES + alphred (~> 1.1) + faraday (~> 0.9) + +BUNDLED WITH + 1.10.6 diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/README.md b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/README.md new file mode 100644 index 0000000..962f115 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/README.md @@ -0,0 +1,14 @@ +# Giphy.alfredworkflow + +A workflow for [Alfred][alfred] that searches [Giphy][giphy] for animated gifs. +Actioning on a search item will preview the gif using Quick Look and copy the +direct URL of the gif to the clipboard. + +[alfred]: https://www.alfredapp.com/ +[giphy]: http://giphy.com/ + +## TODO + +- Get a production Giphy API key? +- Copy the link to the Giphy page (instead of the gif) with a keyboard + modifier. diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/Rakefile b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/Rakefile new file mode 100644 index 0000000..911ecca --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/Rakefile @@ -0,0 +1 @@ +require "alphred/tasks" diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/giphy.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/giphy.rb new file mode 100644 index 0000000..68377a1 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/giphy.rb @@ -0,0 +1,120 @@ +$LOAD_PATH.unshift(File.expand_path("../vendor/bundle", __FILE__)) +require "bundler/setup" +require "json" + +require "alphred" +require "faraday" + +module Giphy + API_KEY = "dc6zaTOxFJmzC" + + class Gif + attr_reader :data + + def initialize(data) + @data = data + end + + def thumbnail + return @thumbnail if defined?(@thumbnail) + + url = self.data["images"]["fixed_width_small_still"]["url"] + @thumbnail = Thumbnail.new(self.name, url) + end + + def id + self.data["id"] + end + + def size + self.data["images"]["original"]["size"] + end + + def name + self.data["url"].split(?/).last.sub(/\-[^-]+$/, "") + end + + def urls + Hash[%w[ url mp4 webp ].map {|key| [key, self.data["images"]["original"][key]] }] + end + end + + class Thumbnail + attr_reader *%i[ name url ] + + def initialize(name, url) + @name, @url = name, url + end + + def download! + File.write(self.path, Faraday.get(url).body, mode: ?w) + end + + def path + ext = File.extname(self.url) + File.join(self.dir, "#{self.name}#{ext}") + end + + def dir + return @dir if defined?(@dir) + + dir = File.expand_path(ENV["alfred_workflow_cache"]) + Dir.mkdir(dir) unless Dir.exist?(dir) + @dir = dir + end + end + + class FileSize + attr_reader :size + + def initialize(size) + @size = size.to_i + end + + def to_s + "%.1f%s" % case self.size + when (0...1_000) + [self.size, nil] + when (1_000...1_000_000) + [self.size / 1_000.0, "KB"] + else + [self.size / 1_000_000.0, "MB"] + end + end + end +end + +if __FILE__ == $0 + query = ARGV.shift + + resp = Faraday.get("http://api.giphy.com/v1/gifs/search", + { q: query, + limit: 9, + api_key: Giphy::API_KEY }) + data = JSON.load(resp.body)["data"] + gifs = data.map {|gif| Giphy::Gif.new(gif) } + + threads = gifs.map do |gif| + Thread.new do + gif.thumbnail.download! + end + end + + threads.each(&:join) + + items = gifs.map do |gif| + Alphred::Item.new( + title: gif.name, + subtitle: "#{gif.id} - #{Giphy::FileSize.new(gif.size)}", + arg: JSON.dump(gif.urls), + icon: gif.thumbnail.path, + ) + end + + # items << Alphred::Item.new( + # title: "[Powered By Giphy]", + # icon: "icon.png", + # ) + + puts Alphred::Items.new(*items).to_xml +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/icon.png b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0836ce6da04f34459b6d4c53c2afb3c9e973b1dc GIT binary patch literal 24597 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 + + + + bundleid + com.arbitrarydefinitions.giphy + category + Internet + connections + + 0744A6DC-F5C1-4D81-8056-8C281A5494D2 + + + destinationuid + FF2DAFF4-2EF6-427C-A48F-A71F47A52E8D + modifiers + 0 + modifiersubtext + + + + destinationuid + 2C624EB9-DB8E-48FA-A0E7-152BB7F7817A + modifiers + 0 + modifiersubtext + + + + 2C624EB9-DB8E-48FA-A0E7-152BB7F7817A + + + destinationuid + 52E6556C-14D2-4D85-8BDD-4B13B2B5943D + modifiers + 0 + modifiersubtext + + + + FF2DAFF4-2EF6-427C-A48F-A71F47A52E8D + + + destinationuid + 21CA0C10-1AC1-44DA-A415-E53C081F77AE + modifiers + 0 + modifiersubtext + + + + + createdby + Alpha Chen + description + Search Giphy for animated gifs + disabled + + name + Giphy + objects + + + config + + concurrently + + escaping + 102 + script + require "json" +print JSON.load("{query}")["url"] + type + 2 + + type + alfred.workflow.action.script + uid + FF2DAFF4-2EF6-427C-A48F-A71F47A52E8D + version + 0 + + + config + + concurrently + + escaping + 102 + script + curl "{query}" --silent --output "$alfred_workflow_cache/giphy.gif" && qlmanage -p "$alfred_workflow_cache/giphy.gif" >& /dev/null + type + 0 + + type + alfred.workflow.output.script + uid + 21CA0C10-1AC1-44DA-A415-E53C081F77AE + version + 0 + + + config + + argumenttype + 0 + escaping + 102 + keyword + giphy + queuedelaycustom + 3 + queuedelayimmediatelyinitially + + queuedelaymode + 1 + queuemode + 2 + runningsubtext + Searching Giphy... + script + ruby giphy.rb "{query}" + title + Search Giphy + type + 0 + withspace + + + type + alfred.workflow.input.scriptfilter + uid + 0744A6DC-F5C1-4D81-8056-8C281A5494D2 + version + 0 + + + config + + autopaste + + clipboardtext + {query} + + type + alfred.workflow.output.clipboard + uid + 52E6556C-14D2-4D85-8BDD-4B13B2B5943D + version + 0 + + + config + + concurrently + + escaping + 102 + script + require "json" +print JSON.load("{query}")["gif"] + type + 2 + + type + alfred.workflow.action.script + uid + 2C624EB9-DB8E-48FA-A0E7-152BB7F7817A + version + 0 + + + readme + + uidata + + 0744A6DC-F5C1-4D81-8056-8C281A5494D2 + + ypos + 70 + + 21CA0C10-1AC1-44DA-A415-E53C081F77AE + + ypos + 10 + + 2C624EB9-DB8E-48FA-A0E7-152BB7F7817A + + ypos + 130 + + 52E6556C-14D2-4D85-8BDD-4B13B2B5943D + + ypos + 130 + + FF2DAFF4-2EF6-427C-A48F-A71F47A52E8D + + ypos + 10 + + + webaddress + https://github.com/kejadlen/giphy.alfredworkflow + + diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/bundler/setup.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/bundler/setup.rb new file mode 100644 index 0000000..a6f3ea0 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/bundler/setup.rb @@ -0,0 +1,9 @@ +require 'rbconfig' +# ruby 1.8.7 doesn't define RUBY_ENGINE +ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby' +ruby_version = RbConfig::CONFIG["ruby_version"] +path = File.expand_path('..', __FILE__) +$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/builder-3.2.2/lib" +$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/alphred-1.1.1/lib" +$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/multipart-post-2.0.0/lib" +$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/faraday-0.9.2/lib" diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/cache/alphred-1.1.1.gem b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/cache/alphred-1.1.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..c3ec043d7c72d59d83518a26e0258305f813afb7 GIT binary patch literal 10752 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 E0M2NKdH?_b literal 0 HcmV?d00001 diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/cache/builder-3.2.2.gem b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/cache/builder-3.2.2.gem new file mode 100644 index 0000000000000000000000000000000000000000..b59ef922ebd687bf5b6b254f410f4d511c1ccf6e GIT binary patch literal 31744 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 P;y)Ak&jkKon!x`66^mbr literal 0 HcmV?d00001 diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/cache/faraday-0.9.2.gem b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/cache/faraday-0.9.2.gem new file mode 100644 index 0000000000000000000000000000000000000000..35a1675ee119069267542dc509870d2d69c4856e GIT binary patch literal 35840 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

!@+0iCWLpYDw7 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 Gz<&d2>B5%) literal 0 HcmV?d00001 diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/.gitignore b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/.gitignore new file mode 100644 index 0000000..0cb6eeb --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/.gitignore @@ -0,0 +1,9 @@ +/.bundle/ +/.yardoc +/Gemfile.lock +/_yardoc/ +/coverage/ +/doc/ +/pkg/ +/spec/reports/ +/tmp/ diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/.travis.yml b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/.travis.yml new file mode 100644 index 0000000..ac0983c --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/.travis.yml @@ -0,0 +1,4 @@ +language: ruby +rvm: + - 2.0.0 +before_install: gem install bundler -v 1.10.6 diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/CHANGELOG.md b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/CHANGELOG.md new file mode 100644 index 0000000..f06465d --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/CHANGELOG.md @@ -0,0 +1,14 @@ +## Unreleased + +## [1.1.1] - 2015-11-05 +### Changed +- Don't crash when the config file doesn't exist. + +## [1.1.0] - 2015-11-01 +### Added +- `Config` class for handling persistent configuration across workflow updates. +- CHANGELOG + +## [1.0.0] - 2015-10-31 +### Added +- Library for making Alfred workflows. diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/CODE_OF_CONDUCT.md b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..ce9bee7 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/CODE_OF_CONDUCT.md @@ -0,0 +1,13 @@ +# Contributor Code of Conduct + +As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. + +We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion. + +Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers. + +This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/) diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/Gemfile b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/Gemfile new file mode 100644 index 0000000..32fd98d --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/Gemfile @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in alphred.gemspec +gemspec + +group :development do + gem "guard" + gem "guard-minitest" + gem "pry" +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/Guardfile b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/Guardfile new file mode 100644 index 0000000..13966bd --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/Guardfile @@ -0,0 +1,5 @@ +guard :minitest do + watch(%r{^test/(.*)\/?test_(.*)\.rb$}) + watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[1]}test_#{m[2]}.rb" } + watch(%r{^test/test_helper\.rb$}) { 'test' } +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/LICENSE.txt b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/LICENSE.txt new file mode 100644 index 0000000..a73fd4f --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Alpha Chen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/README.md b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/README.md new file mode 100644 index 0000000..3f01ad9 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/README.md @@ -0,0 +1,152 @@ +# Alphred + +Alphred is a library for making Alfred workflows in Ruby. It's designed +specifically for how I work, so assumes that you manage dependencies with +[Bundler][bundler] and Rubies with [chruby][chruby]. + +[bundler]: http://bundler.io/ +[chruby]: https://github.com/postmodern/chruby + +## Usage + +The [example script filter][scriptfilter] would look like this using Alphred: + +[scriptfilter]: https://www.alfredapp.com/help/workflows/inputs/script-filter/ + +``` ruby +items = Alphred::Items.new( + Alphred::Item.new(uid: "desktop", + arg: "~/Desktop", + valid: true, + autocomplete: "Desktop", + type: :file, + title: "Desktop", + subtitle: "~/Desktop", + icon: { value: "~/Desktop", type: :fileicon }), + Alphred::Item.new(uid: "flickr", + valid: false, + autocomplete: "flickr", + title: "Flickr", + icon: "flickr.png"), + Alphred::Item.new(uid: "image", + autocomplete: "My holiday photo", + type: :file, + title: "My holiday photo", + subtitle: "~/Pictures/My holiday photo.jpg", + icon: { value: "public.jpeg", type: :filetype }), + Alphred::Item.new(uid: "home", + arg: "~/", + valid: true, + autocomplete: "Home", + type: :file, + title: "Home Folder", + subtitle: "Home folder ~/", + icon: { value: "~/", type: :fileicon }, + mods: { shift: "Subtext when shift is pressed", + fn: "Subtext when fn is pressed", + ctrl: "Subtext when ctrl is pressed", + alt: "Subtext when alt is pressed", + cmd: "Subtext when cmd is pressed" }, + text: { copy: "Text when copying", + largetype: "Text for LargeType" })) +items.to_xml +``` + +This produces the following XML: + +``` xml + + + + Desktop + ~/Desktop + ~/Desktop + + + Flickr + flickr.png + + + My holiday photo + ~/Pictures/My holiday photo.jpg + public.jpeg + + + Home Folder + Home folder ~/ + ~/ + Subtext when shift is pressed + Subtext when fn is pressed + Subtext when ctrl is pressed + Subtext when alt is pressed + Subtext when cmd is pressed + Text when copying + Text for LargeType + + +``` + +### Workflow Configuration + +`Alphred::Config` provides some helpers for managing configuration that should +persist when updating the workflow. This configuration is stored in an JSON +file in the workflow data directory. + +``` ruby +# config.rb + +module Workflow + defaults = { foo: "bar" } + Config = Alphred::Config.new(**defaults) +``` + +The corresponding Script Filter input and Run Action output then look like this: + +``` shell +# script filter + +ruby -r./config -e'puts Workflow::Config.filter_xml("{query}")' +``` + +``` shell +# run action + +ruby -r./config -e'Forecast::Config.update!("{query}")' +``` + +### Releasing + +Including `alphred/tasks` in your `Rakefile` will allow access to Alphred's +Rake tasks for releasing a workflow. `release` will tag the current commit with +the provided version and create a .alfredworkflow package with vendored gem +dependencies. + +## TODO + +- Add development mode for easier debugging. (Nicer errors, etc.) +- Rake task for installing to Alfred + +## Development + +After checking out the repo, run `bundle install` to install dependencies. +Then, run `rake test` to run the tests. You can also run `rake console` for an +interactive prompt that will allow you to experiment. + +To install this gem onto your local machine, run `bundle exec rake install`. To +release a new version, update the version number in `version.rb`, and then run +`bundle exec rake release`, which will create a git tag for the version, push +git commits and tags, and push the `.gem` file to +[rubygems.org](https://rubygems.org). + +## Contributing + +Bug reports and pull requests are welcome on GitHub at +https://github.com/kejadlen/alphred. This project is intended to be a safe, +welcoming space for collaboration, and contributors are expected to adhere to +the [Contributor Covenant](contributor-covenant.org) code of conduct. + +## License + +The gem is available as open source under the terms of the [MIT +License](http://opensource.org/licenses/MIT). + diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/Rakefile b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/Rakefile new file mode 100644 index 0000000..96a218b --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/Rakefile @@ -0,0 +1,17 @@ +require "bundler/gem_tasks" +require "rake/testtask" + +Rake::TestTask.new(:test) do |t| + t.libs << "lib" + t.test_files = FileList['test/**/test_*.rb'] +end + +task :console do + require "bundler/setup" + require "alphred" + + require "pry" + Pry.start +end + +task :default => :test diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/alphred.gemspec b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/alphred.gemspec new file mode 100644 index 0000000..c8ffb0d --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/alphred.gemspec @@ -0,0 +1,26 @@ +# coding: utf-8 +lib = File.expand_path("../lib", __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require "alphred/version" + +Gem::Specification.new do |spec| + spec.name = "alphred" + spec.version = Alphred::VERSION + spec.authors = ["Alpha Chen"] + spec.email = ["alpha.chen@gmail.com"] + + spec.summary = %q{Helper utilities for making Alfred workflows.} + spec.homepage = "https://github.com/kejadlen/alph" + spec.license = "MIT" + + spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } + spec.bindir = "bin" + spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } + spec.require_paths = ["lib"] + + spec.add_dependency "builder", "~> 3.2" + + spec.add_development_dependency "bundler", "~> 1.10" + spec.add_development_dependency "rake", "~> 10.0" + spec.add_development_dependency "minitest" +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred.rb new file mode 100644 index 0000000..729c584 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred.rb @@ -0,0 +1,10 @@ +require "builder" + +require_relative "alphred/version" + +require_relative "alphred/config" +require_relative "alphred/icon" +require_relative "alphred/item" +require_relative "alphred/items" +require_relative "alphred/mods" +require_relative "alphred/text" diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/config.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/config.rb new file mode 100644 index 0000000..8c107b9 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/config.rb @@ -0,0 +1,55 @@ +require "json" + +module Alphred + class Config + def self.load(**defaults) + config = self.new(**defaults) + config.load! + config + end + + attr_reader :data + + def initialize(**defaults) + @data = Hash[defaults.map {|k,v| [k.to_s, v.to_s] }] + end + + def load! + return unless File.exist?(self.path) + self.data.merge!(JSON.load(File.open(self.path))) + end + + def update!(json) + data = self.data.merge(JSON.load(json)) + File.write(self.path, JSON.dump(data), mode: ?w) + end + + def [](key) + self.data[key.to_s] + end + + def filter_xml(filter=nil) + filter ||= "" + + items = self.data.map do |key, value| + title = if filter.empty? + "Unset #{key}" + else + "Set #{key} to #{filter}" + end + Item.new( + uid: key, + arg: JSON.dump(key => filter), + title: title, + subtitle: self[key] + ) + end + + Items.new(*items).to_xml + end + + def path + File.join(ENV["alfred_workflow_data"], 'config.json') + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/icon.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/icon.rb new file mode 100644 index 0000000..7a7bcdf --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/icon.rb @@ -0,0 +1,39 @@ +require "builder" + +module Alphred + class Icon + VALID_TYPES = %i[ fileicon filetype ] + + attr_accessor *%i[ value type ] + + def initialize(**kwargs) + raise ArgumentError.new("missing keyword: value") unless kwargs.has_key?(:value) + + @value = kwargs[:value] + self.type = kwargs[:type] if kwargs.has_key?(:type) + end + + def type=(type) + raise ArgumentError.new("`type` must be one of #{VALID_TYPES}") unless type.nil? || VALID_TYPES.include?(type) + + @type = type + end + + def to_xml(xml=nil) + xml ||= Builder::XmlMarkup.new(indent: 2) + attrs = {} + attrs[:type] = self.type unless self.type.nil? + xml.icon self.value, attrs + end + end +end + +module Kernel + def Icon(value) + case value + when Alphred::Icon then value + when String then Alphred::Icon.new(value: value) + when Hash then Alphred::Icon.new(**value) + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/item.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/item.rb new file mode 100644 index 0000000..d986ddb --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/item.rb @@ -0,0 +1,59 @@ +require "builder" + +require_relative "mods" +require_relative "text" + +module Alphred + class Item + VALID_TYPES = %i[ default file file_skipcheck ] + + attr_accessor *%i[ uid arg valid autocomplete title subtitle mods icon text ] + + def initialize(**kwargs) + raise ArgumentError.new("missing keyword: title") unless kwargs.has_key?(:title) + + @title = kwargs[:title] + + %i[ uid arg valid autocomplete subtitle ].each do |attr| + self.instance_variable_set("@#{attr}", kwargs[attr]) if kwargs.has_key?(attr) + end + + @icon = Icon(kwargs[:icon]) if kwargs.has_key?(:icon) + @text = Text.new(kwargs[:text]) if kwargs.has_key?(:text) + @mods = Mods.new(kwargs[:mods]) if kwargs.has_key?(:mods) + + self.type = kwargs[:type] if kwargs.has_key?(:type) + end + + def type=(type) + raise ArgumentError.new("`type` must be one of #{VALID_TYPES}") unless type.nil? || VALID_TYPES.include?(type) + + @type = type + end + + def type + @type && @type.to_s.gsub(?_, ?:) + end + + def to_xml(xml=nil) + xml ||= Builder::XmlMarkup.new(indent: 2) + xml.item self.attrs do + xml.title self.title + xml.subtitle self.subtitle unless self.subtitle.nil? + self.icon.to_xml(xml) unless self.icon.nil? + self.mods.to_xml(xml) unless self.mods.nil? + self.text.to_xml(xml) unless self.text.nil? + end + end + + def attrs + attrs = {} + %i[ uid arg autocomplete type ].each do |attr| + value = self.send(attr) + attrs[attr] = value unless value.nil? + end + attrs[:valid] = (self.valid) ? "yes" : "no" unless self.valid.nil? + attrs + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/items.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/items.rb new file mode 100644 index 0000000..71dd6e5 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/items.rb @@ -0,0 +1,23 @@ +require "builder" +require "delegate" + +module Alphred + class Items < DelegateClass(Array) + attr_reader :items + + def initialize(*items) + @items = items + super(@items) + end + + def to_xml + xml = Builder::XmlMarkup.new(indent: 2) + xml.instruct! :xml + xml.items do + self.items.each do |item| + item.to_xml(xml) + end + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/mods.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/mods.rb new file mode 100644 index 0000000..01da3f0 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/mods.rb @@ -0,0 +1,22 @@ +require "builder" + +module Alphred + class Mods + MODS = %i[ shift fn ctrl alt cmd ] + + attr_accessor *MODS + + def initialize(**kwargs) + MODS.each do |mod| + self.instance_variable_set("@#{mod}", kwargs[mod]) if kwargs.has_key?(mod) + end + end + + def to_xml(xml) + MODS.each do |mod| + value = self.send(mod) + xml.subtitle value, mod: mod unless value.nil? + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/tasks.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/tasks.rb new file mode 100644 index 0000000..1e4bde8 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/tasks.rb @@ -0,0 +1,40 @@ +require "rake" + +namespace :alphred do + desc "Prepare a release, named after the directory" + task :release, [:version] => [:tag, :package] + + desc "Tag the current commit in git with VERSION" + task :tag, [:version] do |t, args| + version = args[:version] + + git_status = `git status --porcelain` + fail <<-FAIL unless git_status.empty? +Can't tag #{version}: dirty working directory. + FAIL + + sh "git tag #{version}" + end + + desc "Create an alfredworkflow package with vendored dependencies" + task :package do + restore_bundler_config do + cmd = "bundle install --standalone --path vendor/bundle --without development test" + sh "chruby-exec 2.0.0 -- #{cmd}" + end + sh "zip -r #{application_dir.pathmap("%n.alfredworkflow")} *" + rm_rf "vendor" + end + + def application_dir + Rake.application.original_dir + end + + def restore_bundler_config + path = File.join(application_dir, ".bundle", "config") + config = File.read(path) + yield + ensure + File.write(path, config, mode: ?w) + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/text.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/text.rb new file mode 100644 index 0000000..0f24576 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/text.rb @@ -0,0 +1,17 @@ +require "builder" + +module Alphred + class Text + attr_accessor *%i[ copy largetype ] + + def initialize(copy: nil, largetype: nil) + @copy = copy + @largetype = largetype + end + + def to_xml(xml) + xml.text copy, type: :copy unless self.copy.nil? + xml.text largetype, type: :largetype unless self.largetype.nil? + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/version.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/version.rb new file mode 100644 index 0000000..1b0a62e --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/alphred-1.1.1/lib/alphred/version.rb @@ -0,0 +1,3 @@ +module Alphred + VERSION = "1.1.1" +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/CHANGES b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/CHANGES new file mode 100644 index 0000000..0f608fe --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/CHANGES @@ -0,0 +1,107 @@ += Change Log + +== Version 3.2.0 + +* Ruby 2.0 compatibility changes. + +* Allow single quoted attributes. + +== Version 3.1.0 + +* Included the to_xs arity patch needed for weird Rails compatibility + issue. + +* Escaping newlines in attributes now. + +* Allow method caching + +== Version 3.0.0 + +* Ruby 1.9 compatiblity issues. + +== Version 2.2.0 + +* Applied patch from Thijs van der Vossen to allow UTF-8 encoded + output when the encoding is UTF-8 and $KCODE is UTF8. + +== Version 2.1.2 + +* Fixed bug where private methods in kernel could leak through using + tag!(). Thanks to Hagen Overdick for finding and diagnosing this + bug. + +== Version 2.1.1 + +* Fixed typo in XmlMarkup class docs (ident => indent). (from Martin + Fowler). +* Removed extra directory indirection from legacy CVS to SVN move. +* Removed some extraneous tabs from source. +* Fixed test on private methods in blankslate to differentiate between + targetted and untargetted private methods. +* Removed legacy capture of @self in XmlBase (@self was used back when + we used instance eval). +* Added additional tests for global functions (both direct and included). + +== Version 2.1.0 + +* Fixed bug in BlankSlate where including a module into Object could + cause methods to leak into BlankSlate. +* Made BlankSlate available as its own gem. Currently the builder gem + still directly includes the BlankSlate code. +* Added reveal capability to BlankSlate. + +== Version 2.0.0 + +* Added doc directory +* Added unit tests for XmlEvents. +* Added XChar module and used it in the _escape method. +* Attributes are now quoted by default when strings. Use Symbol + attribute values for unquoted behavior. + +== Version 1.2.4 + +* Added a cdata! command to an XML Builder (from Josh Knowles). + +== Version 1.2.3 + +The attributes in the instruction will be ordered: +version, encoding, standalone. + +== Version 1.2.2 + +Another fix for BlankSlate. The Kernal/Object traps added in 1.2.1 +failed when a method was defined late more than once. Since the +method was already marked as removed, another attempt to undefine it +raised an error. The fix was to check the list of instance methods +before attempting the undef operation. Thanks to Florian Gross and +David Heinemeier Hansson for the patch. + +== Version 1.2.1 + +BlankSlate now traps method definitions in Kernel and Object to avoid +late method definitions inadvertently becoming part of the definition +of BlankSlate as well. + +== Version 1.2.0 + +Improved support for entity declarations by allowing nested +declarations and removal of the attribute processing. + +Added namespace support. + +== Version 1.1.0 + +Added support for comments, entity declarations and processing instructions. + +== Version 1.0.0 + +Removed use of instace_eval making the use of XmlMarkup much +less prone to error. + +== Version 0.1.1 + +Bug fix. + +== Version 0.1.0 + +Initial version release. diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/MIT-LICENSE b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/MIT-LICENSE new file mode 100644 index 0000000..7d9be51 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2003-2012 Jim Weirich (jim.weirich@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/README.md b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/README.md new file mode 100644 index 0000000..81928cc --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/README.md @@ -0,0 +1,258 @@ +# Project: Builder + +## Goal + +Provide a simple way to create XML markup and data structures. + +## Classes + +Builder::XmlMarkup:: Generate XML markup notation +Builder::XmlEvents:: Generate XML events (i.e. SAX-like) + +**Notes:** + +* An Builder::XmlTree class to generate XML tree + (i.e. DOM-like) structures is also planned, but not yet implemented. + Also, the events builder is currently lagging the markup builder in + features. + +## Usage + +```ruby + require 'rubygems' + require_gem 'builder', '~> 2.0' + + builder = Builder::XmlMarkup.new +` xml = builder.person { |b| b.name("Jim"); b.phone("555-1234") } + xml #=> Jim555-1234 +``` + +or + +```ruby + require 'rubygems' + require_gem 'builder' + + builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2) + builder.person { |b| b.name("Jim"); b.phone("555-1234") } + # + # Prints: + # + # Jim + # 555-1234 + # +``` + +## Compatibility + +### Version 2.0.0 Compatibility Changes + +Version 2.0.0 introduces automatically escaped attribute values for +the first time. Versions prior to 2.0.0 did not insert escape +characters into attribute values in the XML markup. This allowed +attribute values to explicitly reference entities, which was +occasionally used by a small number of developers. Since strings +could always be explicitly escaped by hand, this was not a major +restriction in functionality. + +However, it did surprise most users of builder. Since the body text is +normally escaped, everybody expected the attribute values to be +escaped as well. Escaped attribute values were the number one support +request on the 1.x Builder series. + +Starting with Builder version 2.0.0, all attribute values expressed as +strings will be processed and the appropriate characters will be +escaped (e.g. "&" will be translated to "&"). Attribute values +that are expressed as Symbol values will not be processed for escaped +characters and will be unchanged in output. (Yes, this probably counts +as Symbol abuse, but the convention is convenient and flexible). + +Example: + +```ruby + xml = Builder::XmlMarkup.new + xml.sample(:escaped=>"This&That", :unescaped=>:"Here&There") + xml.target! => + +``` + +### Version 1.0.0 Compatibility Changes + +Version 1.0.0 introduces some changes that are not backwards +compatible with earlier releases of builder. The main areas of +incompatibility are: + +* Keyword based arguments to +new+ (rather than positional based). It + was found that a developer would often like to specify indentation + without providing an explicit target, or specify a target without + indentation. Keyword based arguments handle this situation nicely. + +* Builder must now be an explicit target for markup tags. Instead of + writing + +```ruby + xml_markup = Builder::XmlMarkup.new + xml_markup.div { strong("text") } +``` + + you need to write + +```ruby + xml_markup = Builder::XmlMarkup.new + xml_markup.div { xml_markup.strong("text") } +``` + +* The builder object is passed as a parameter to all nested markup + blocks. This allows you to create a short alias for the builder + object that can be used within the block. For example, the previous + example can be written as: + +```ruby + xml_markup = Builder::XmlMarkup.new + xml_markup.div { |xml| xml.strong("text") } +``` + +* If you have both a pre-1.0 and a post-1.0 gem of builder installed, + you can choose which version to use through the RubyGems + +require_gem+ facility. + +```ruby + require_gem 'builder', "~> 0.0" # Gets the old version + require_gem 'builder', "~> 1.0" # Gets the new version +``` + +## Features + +* XML Comments are supported ... + +```ruby + xml_markup.comment! "This is a comment" + #=> +``` + +* XML processing instructions are supported ... + +```ruby + xml_markup.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8" + #=> +``` + + If the processing instruction is omitted, it defaults to "xml". + When the processing instruction is "xml", the defaults attributes + are: + + version: 1.0 + encoding: "UTF-8" + + (NOTE: if the encoding is set to "UTF-8" and $KCODE is set to + "UTF8", then Builder will emit UTF-8 encoded strings rather than + encoding non-ASCII characters as entities.) + +* XML entity declarations are now supported to a small degree. + +```ruby + xml_markup.declare! :DOCTYPE, :chapter, :SYSTEM, "../dtds/chapter.dtd" + #=> +``` + + The parameters to a declare! method must be either symbols or + strings. Symbols are inserted without quotes, and strings are + inserted with double quotes. Attribute-like arguments in hashes are + not allowed. + + If you need to have an argument to declare! be inserted without + quotes, but the argument does not conform to the typical Ruby + syntax for symbols, then use the :"string" form to specify a symbol. + + For example: + +```ruby + xml_markup.declare! :ELEMENT, :chapter, :"(title,para+)" + #=> +``` + + Nested entity declarations are allowed. For example: + +```ruby + @xml_markup.declare! :DOCTYPE, :chapter do |x| + x.declare! :ELEMENT, :chapter, :"(title,para+)" + x.declare! :ELEMENT, :title, :"(#PCDATA)" + x.declare! :ELEMENT, :para, :"(#PCDATA)" + end + + #=> + + + + + ]> +``` + +* Some support for XML namespaces is now available. If the first + argument to a tag call is a symbol, it will be joined to the tag to + produce a namespace:tag combination. It is easier to show this than + describe it. + +```ruby + xml.SOAP :Envelope do ... end +``` + + Just put a space before the colon in a namespace to produce the + right form for builder (e.g. "SOAP:Envelope" => + "xml.SOAP :Envelope") + +* String attribute values are now escaped by default by + Builder (NOTE: this is _new_ behavior as of version 2.0). + + However, occasionally you need to use entities in attribute values. + Using a symbol (rather than a string) for an attribute value will + cause Builder to not run its quoting/escaping algorithm on that + particular value. + + (Note: The +escape_attrs+ option for builder is now + obsolete). + + Example: + +```ruby + xml = Builder::XmlMarkup.new + xml.sample(:escaped=>"This&That", :unescaped=>:"Here&There") + xml.target! => + +``` + +* UTF-8 Support + + Builder correctly translates UTF-8 characters into valid XML. (New + in version 2.0.0). Thanks to Sam Ruby for the translation code. + + You can get UTF-8 encoded output by making sure that the XML + encoding is set to "UTF-8" and that the $KCODE variable is set to + "UTF8". + +```ruby + $KCODE = 'UTF8' + xml = Builder::Markup.new + xml.instruct!(:xml, :encoding => "UTF-8") + xml.sample("Iñtërnâtiônàl") + xml.target! => + "Iñtërnâtiônàl" +``` + +## Links + +| Description | Link | +| :----: | :----: | +| Documents | http://builder.rubyforge.org/ | +| Github Clone | git://github.com/jimweirich/builder.git | +| Issue / Bug Reports | https://github.com/jimweirich/builder/issues?state=open | + +## Contact + +| Description | Value | +| :----: | :----: | +| Author | Jim Weirich | +| Email | jim.weirich@gmail.com | +| Home Page | http://onestepback.org | +| License | MIT Licence (http://www.opensource.org/licenses/mit-license.html) | diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/Rakefile b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/Rakefile new file mode 100644 index 0000000..b082fbe --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/Rakefile @@ -0,0 +1,195 @@ +# Rakefile for rake -*- ruby -*- + +# Copyright 2004, 2005, 2006 by Jim Weirich (jim@weirichhouse.org). +# All rights reserved. + +# Permission is granted for use, copying, modification, distribution, +# and distribution of modified versions of this work as long as the +# above copyright notice is included. + +require 'rake/clean' +require 'rake/testtask' +begin + require 'rubygems' + require 'rubygems/package_task' + require 'rdoc/task' +rescue Exception + nil +end + +require './lib/builder/version' + +# Determine the current version of the software + +CLOBBER.include('pkg', 'html') +CLEAN.include('pkg/builder-*').include('pkg/blankslate-*').exclude('pkg/*.gem') + +PKG_VERSION = Builder::VERSION + +SRC_RB = FileList['lib/**/*.rb'] + +# The default task is run if rake is given no explicit arguments. + +desc "Default Task" +task :default => :test_all + +# Test Tasks --------------------------------------------------------- + +desc "Run all tests" +task :test_all => [:test_units] +task :ta => [:test_all] + +task :tu => [:test_units] + +Rake::TestTask.new("test_units") do |t| + t.test_files = FileList['test/test*.rb'] + t.libs << "." + t.verbose = false +end + +# Create a task to build the RDOC documentation tree. + +if defined?(RDoc) + rd = RDoc::Task.new("rdoc") { |rdoc| + rdoc.rdoc_dir = 'html' + rdoc.title = "Builder for Markup" + rdoc.options << '--line-numbers' << '--inline-source' << '--main' << 'README.rdoc' + rdoc.rdoc_files.include('lib/**/*.rb', '[A-Z]*', 'doc/**/*.rdoc').exclude("TAGS") + rdoc.template = 'doc/jamis.rb' + } +else + rd = Struct.new(:rdoc_files).new([]) +end + +# ==================================================================== +# Create a task that will package the Rake software into distributable +# gem files. + +PKG_FILES = FileList[ + '[A-Z]*', + 'doc/**/*', + 'lib/**/*.rb', + 'test/**/*.rb', + 'rakelib/**/*' +] +PKG_FILES.exclude('test/test_cssbuilder.rb') +PKG_FILES.exclude('lib/builder/css.rb') +PKG_FILES.exclude('TAGS') + +BLANKSLATE_FILES = FileList[ + 'lib/blankslate.rb', + 'test/test_blankslate.rb' +] + +if ! defined?(Gem) + puts "Package Target requires RubyGEMs" +else + spec = Gem::Specification.new do |s| + + #### Basic information. + + s.name = 'builder' + s.version = PKG_VERSION + s.summary = "Builders for MarkUp." + s.description = %{\ +Builder provides a number of builder objects that make creating structured data +simple to do. Currently the following builder objects are supported: + +* XML Markup +* XML Events +} + + s.files = PKG_FILES.to_a + s.require_path = 'lib' + + s.test_files = PKG_FILES.select { |fn| fn =~ /^test\/test/ } + + s.has_rdoc = true + s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a + s.rdoc_options << + '--title' << 'Builder -- Easy XML Building' << + '--main' << 'README.rdoc' << + '--line-numbers' + + s.author = "Jim Weirich" + s.email = "jim.weirich@gmail.com" + s.homepage = "http://onestepback.org" + s.license = 'MIT' + end + + blankslate_spec = Gem::Specification.new do |s| + + #### Basic information. + + s.name = 'blankslate' + s.version = PKG_VERSION + s.summary = "Blank Slate base class." + s.description = %{\ +BlankSlate provides a base class where almost all of the methods from Object and +Kernel have been removed. This is useful when providing proxy object and other +classes that make heavy use of method_missing. +} + + s.files = BLANKSLATE_FILES.to_a + s.require_path = 'lib' + + s.test_files = PKG_FILES.select { |fn| fn =~ /^test\/test/ } + + s.has_rdoc = true + s.extra_rdoc_files = rd.rdoc_files.reject { |fn| fn =~ /\.rb$/ }.to_a + s.rdoc_options << + '--title' << 'BlankSlate -- Base Class for building proxies.' << + '--main' << 'README.rdoc' << + '--line-numbers' + + s.author = "Jim Weirich" + s.email = "jim.weirich@gmail.com" + s.homepage = "http://onestepback.org" + s.license = 'MIT' + end + + namespace 'builder' do + Gem::PackageTask.new(spec) do |t| + t.need_tar = false + end + end + + namespace 'blankslate' do + Gem::PackageTask.new(blankslate_spec) do |t| + t.need_tar = false + end + end + + task :package => [:remove_tags, 'builder:package', 'blankslate:package'] +end + +task :remove_tags do + rm "TAGS" rescue nil +end + +# RCov --------------------------------------------------------------- +begin + require 'rcov/rcovtask' + + Rcov::RcovTask.new do |t| + t.libs << "test" + t.rcov_opts = [ + '-xRakefile', '--text-report' + ] + t.test_files = FileList[ + 'test/test*.rb' + ] + t.output_dir = 'coverage' + t.verbose = true + end +rescue LoadError + # No rcov available +end + +desc "Install the jamis RDoc template" +task :install_jamis_template do + require 'rbconfig' + dest_dir = File.join(Config::CONFIG['rubylibdir'], "rdoc/generators/template/html") + fail "Unabled to write to #{dest_dir}" unless File.writable?(dest_dir) + install "doc/jamis.rb", dest_dir, :verbose => true +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/jamis.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/jamis.rb new file mode 100644 index 0000000..a00b583 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/jamis.rb @@ -0,0 +1,591 @@ +module RDoc +module Page + +FONTS = "\"Bitstream Vera Sans\", Verdana, Arial, Helvetica, sans-serif" + +STYLE = < pre { + padding: 0.5em; + border: 1px dotted black; + background: #FFE; +} + +CSS + +XHTML_PREAMBLE = %{ + +} + +HEADER = XHTML_PREAMBLE + < + + %title% + + + + + + + +ENDHEADER + +FILE_PAGE = < + + + + +
File
%short_name%
+ + + + + + + + + +
Path:%full_path% +IF:cvsurl +  (CVS) +ENDIF:cvsurl +
Modified:%dtm_modified%
+
+ +
+HTML + +################################################################### + +CLASS_PAGE = < + %classmod%
%full_name% + + + + + + +IF:parent + + + + +ENDIF:parent +
In: +START:infiles +HREF:full_path_url:full_path: +IF:cvsurl + (CVS) +ENDIF:cvsurl +END:infiles +
Parent: +IF:par_url + +ENDIF:par_url +%parent% +IF:par_url + +ENDIF:par_url +
+ + + +HTML + +################################################################### + +METHOD_LIST = < +IF:diagram +
+ %diagram% +
+ENDIF:diagram + +IF:description +

%description%
+ENDIF:description + +IF:requires +
Required Files
+
    +START:requires +
  • HREF:aref:name:
  • +END:requires +
+ENDIF:requires + +IF:toc +
Contents
+
+ENDIF:toc + +IF:methods +
Methods
+
    +START:methods +
  • HREF:aref:name:
  • +END:methods +
+ENDIF:methods + +IF:includes +
Included Modules
+
    +START:includes +
  • HREF:aref:name:
  • +END:includes +
+ENDIF:includes + +START:sections +IF:sectitle + +IF:seccomment +
+%seccomment% +
+ENDIF:seccomment +ENDIF:sectitle + +IF:classlist +
Classes and Modules
+ %classlist% +ENDIF:classlist + +IF:constants +
Constants
+ +START:constants + + + + + +IF:desc + + + + +ENDIF:desc +END:constants +
%name%=%value%
 %desc%
+ENDIF:constants + +IF:attributes +
Attributes
+ +START:attributes + + + + + +END:attributes +
+IF:rw +[%rw%] +ENDIF:rw + %name%%a_desc%
+ENDIF:attributes + +IF:method_list +START:method_list +IF:methods +
%type% %category% methods
+START:methods +
+
+IF:callseq + %callseq% +ENDIF:callseq +IFNOT:callseq + %name%%params% +ENDIF:callseq +IF:codeurl +[ source ] +ENDIF:codeurl +
+IF:m_desc +
+ %m_desc% +
+ENDIF:m_desc +IF:aka +
+ This method is also aliased as +START:aka + %name% +END:aka +
+ENDIF:aka +IF:sourcecode +
+ +
+
+%sourcecode%
+
+
+
+ENDIF:sourcecode +
+END:methods +ENDIF:methods +END:method_list +ENDIF:method_list +END:sections + +HTML + +FOOTER = < + +ENDFOOTER + +BODY = HEADER + < + +
+ #{METHOD_LIST} +
+ + #{FOOTER} +ENDBODY + +########################## Source code ########################## + +SRC_PAGE = XHTML_PREAMBLE + < +%title% + + + + +
%code%
+ + +HTML + +########################## Index ################################ + +FR_INDEX_BODY = < + + + + + + + +
+START:entries +%name%
+END:entries +
+ +HTML + +CLASS_INDEX = FILE_INDEX +METHOD_INDEX = FILE_INDEX + +INDEX = XHTML_PREAMBLE + < + + %title% + + + + + + + + + +IF:inline_source + +ENDIF:inline_source +IFNOT:inline_source + + + + +ENDIF:inline_source + + <body bgcolor="white"> + Click <a href="html/index.html">here</a> for a non-frames + version of this page. + </body> + + + + +HTML + +end +end + + diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/releases/builder-1.2.4.rdoc b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/releases/builder-1.2.4.rdoc new file mode 100644 index 0000000..a1cf54f --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/releases/builder-1.2.4.rdoc @@ -0,0 +1,31 @@ += Builder 1.2.4 Released. + +Added a "CDATA" method to the XML Markup builder (from Josh Knowles). + +== What is Builder? + +Builder::XmlMarkup allows easy programmatic creation of XML markup. +For example: + + builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2) + builder.person { |b| b.name("Jim"); b.phone("555-1234") } + puts builder.target! + +will generate: + + + Jim + 555-1234 + + +== Availability + +The easiest way to get and install builder is via RubyGems ... + + gem install builder (you may need root/admin privileges) + +== Thanks + +* Josh Knowles for the cdata! patch. + +-- Jim Weirich diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/releases/builder-2.0.0.rdoc b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/releases/builder-2.0.0.rdoc new file mode 100644 index 0000000..ed9e086 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/releases/builder-2.0.0.rdoc @@ -0,0 +1,46 @@ += Builder 2.0.0 Released. + +== Changes in 2.0.0 + +* UTF-8 characters in data are now correctly translated to their XML + equivalents. (Thanks to Sam Ruby) + +* Attribute values are now escaped by default. See the README + file for details. + +NOTE: The escaping attribute values by default is different +than in previous releases of Builder. This makes version 2.0.0 +somewhat incompatible with the 1.x series of Builder. If you use "&", +"<", or ">" in attributes values, you may have to change your +code. (Essentially you remove the manual escaping. The new way is +easier, believe me). + +== What is Builder? + +Builder::XmlMarkup is a library that allows easy programmatic creation +of XML markup. For example: + + builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2) + builder.person { |b| b.name("Jim"); b.phone("555-1234") } + +will generate: + + + Jim + 555-1234 + + +== Availability + +The easiest way to get and install builder is via RubyGems ... + + gem install builder (you may need root/admin privileges) + +== Thanks + +* Sam Ruby for the XChar module and the related UTF-8 translation + tools. +* Also to Sam Ruby for gently persuading me to start quoting attribute + values. + +-- Jim Weirich diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/releases/builder-2.1.1.rdoc b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/releases/builder-2.1.1.rdoc new file mode 100755 index 0000000..dbbf121 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/doc/releases/builder-2.1.1.rdoc @@ -0,0 +1,58 @@ += Builder 2.1.1 Released. + +Release 2.1.1 of Builder is mainly a bug fix release. + +== Changes in 2.1.1 + +* Added reveal capability to BlankSlate. + +* Fixed a bug in BlankSlate where including a module into Object could + cause methods to leak into BlankSlate. + +* Fixed typo in XmlMarkup class docs (from Martin Fowler). + +* Fixed test on private methods to differentiate between targetted and + untargetted private methods. + +* Removed legacy capture of @self in XmlBase (@self was used back when + we used instance eval). + +* Added additional tests for global functions (both direct and + included). + +* Several misc internal cleanups, including rearranging the source + code tree. + +NOTE: The escaping attribute values by default is different +than in previous releases of Builder. This makes version 2.0.x +somewhat incompatible with the 1.x series of Builder. If you use "&", +"<", or ">" in attributes values, you may have to change your +code. (Essentially you remove the manual escaping. The new way is +easier, believe me). + +== What is Builder? + +Builder::XmlMarkup is a library that allows easy programmatic creation +of XML markup. For example: + + builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2) + builder.person { |b| b.name("Jim"); b.phone("555-1234") } + +will generate: + + + Jim + 555-1234 + + +== Availability + +The easiest way to get and install builder is via RubyGems ... + + gem install builder (you may need root/admin privileges) + +== Thanks + +* Martin Fowler for spotting some typos in the documentation. + +-- Jim Weirich diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/blankslate.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/blankslate.rb new file mode 100644 index 0000000..931c8a7 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/blankslate.rb @@ -0,0 +1,137 @@ +#!/usr/bin/env ruby +#-- +# Copyright 2004, 2006 by Jim Weirich (jim@weirichhouse.org). +# All rights reserved. + +# Permission is granted for use, copying, modification, distribution, +# and distribution of modified versions of this work as long as the +# above copyright notice is included. +#++ + +class String + if instance_methods.first.is_a?(Symbol) + def _blankslate_as_name + to_sym + end + else + def _blankslate_as_name + self + end + end +end + +class Symbol + if instance_methods.first.is_a?(Symbol) + def _blankslate_as_name + self + end + else + def _blankslate_as_name + to_s + end + end +end + +###################################################################### +# BlankSlate provides an abstract base class with no predefined +# methods (except for \_\_send__ and \_\_id__). +# BlankSlate is useful as a base class when writing classes that +# depend upon method_missing (e.g. dynamic proxies). +# +class BlankSlate + class << self + + # Hide the method named +name+ in the BlankSlate class. Don't + # hide +instance_eval+ or any method beginning with "__". + def hide(name) + warn_level = $VERBOSE + $VERBOSE = nil + if instance_methods.include?(name._blankslate_as_name) && + name !~ /^(__|instance_eval$)/ + @hidden_methods ||= {} + @hidden_methods[name.to_sym] = instance_method(name) + undef_method name + end + ensure + $VERBOSE = warn_level + end + + def find_hidden_method(name) + @hidden_methods ||= {} + @hidden_methods[name] || superclass.find_hidden_method(name) + end + + # Redefine a previously hidden method so that it may be called on a blank + # slate object. + def reveal(name) + hidden_method = find_hidden_method(name) + fail "Don't know how to reveal method '#{name}'" unless hidden_method + define_method(name, hidden_method) + end + end + + instance_methods.each { |m| hide(m) } +end + +###################################################################### +# Since Ruby is very dynamic, methods added to the ancestors of +# BlankSlate after BlankSlate is defined will show up in the +# list of available BlankSlate methods. We handle this by defining a +# hook in the Object and Kernel classes that will hide any method +# defined after BlankSlate has been loaded. +# +module Kernel + class << self + alias_method :blank_slate_method_added, :method_added + + # Detect method additions to Kernel and remove them in the + # BlankSlate class. + def method_added(name) + result = blank_slate_method_added(name) + return result if self != Kernel + BlankSlate.hide(name) + result + end + end +end + +###################################################################### +# Same as above, except in Object. +# +class Object + class << self + alias_method :blank_slate_method_added, :method_added + + # Detect method additions to Object and remove them in the + # BlankSlate class. + def method_added(name) + result = blank_slate_method_added(name) + return result if self != Object + BlankSlate.hide(name) + result + end + + def find_hidden_method(name) + nil + end + end +end + +###################################################################### +# Also, modules included into Object need to be scanned and have their +# instance methods removed from blank slate. In theory, modules +# included into Kernel would have to be removed as well, but a +# "feature" of Ruby prevents late includes into modules from being +# exposed in the first place. +# +class Module + alias blankslate_original_append_features append_features + def append_features(mod) + result = blankslate_original_append_features(mod) + return result if mod != Object + instance_methods.each do |name| + BlankSlate.hide(name) + end + result + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder.rb new file mode 100644 index 0000000..9719277 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder.rb @@ -0,0 +1,13 @@ +#!/usr/bin/env ruby + +#-- +# Copyright 2004 by Jim Weirich (jim@weirichhouse.org). +# All rights reserved. + +# Permission is granted for use, copying, modification, distribution, +# and distribution of modified versions of this work as long as the +# above copyright notice is included. +#++ + +require 'builder/xmlmarkup' +require 'builder/xmlevents' diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/blankslate.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/blankslate.rb new file mode 100644 index 0000000..67d2f24 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/blankslate.rb @@ -0,0 +1,23 @@ +#!/usr/bin/env ruby +#-- +# Copyright 2004, 2006 by Jim Weirich (jim@weirichhouse.org). +# All rights reserved. + +# Permission is granted for use, copying, modification, distribution, +# and distribution of modified versions of this work as long as the +# above copyright notice is included. +#++ + +###################################################################### +# BlankSlate has been promoted to a top level name and is now +# available as a standalone gem. We make the name available in the +# Builder namespace for compatibility. +# +module Builder + if Object::const_defined?(:BasicObject) + BlankSlate = ::BasicObject + else + require 'blankslate' + BlankSlate = ::BlankSlate + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/version.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/version.rb new file mode 100644 index 0000000..cbe7bc4 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/version.rb @@ -0,0 +1,8 @@ +module Builder + VERSION_NUMBERS = [ + VERSION_MAJOR = 3, + VERSION_MINOR = 2, + VERSION_BUILD = 2, + ] + VERSION = VERSION_NUMBERS.join(".") +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xchar.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xchar.rb new file mode 100644 index 0000000..c7daa48 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xchar.rb @@ -0,0 +1,197 @@ +#!/usr/bin/env ruby + +# The XChar library is provided courtesy of Sam Ruby (See +# http://intertwingly.net/stories/2005/09/28/xchar.rb) + +# -------------------------------------------------------------------- + +# If the Builder::XChar module is not currently defined, fail on any +# name clashes in standard library classes. + +module Builder + def self.check_for_name_collision(klass, method_name, defined_constant=nil) + if klass.method_defined?(method_name.to_s) + fail RuntimeError, + "Name Collision: Method '#{method_name}' is already defined in #{klass}" + end + end +end + +if ! defined?(Builder::XChar) and ! String.method_defined?(:encode) + Builder.check_for_name_collision(String, "to_xs") + Builder.check_for_name_collision(Fixnum, "xchr") +end + +###################################################################### +module Builder + + #################################################################### + # XML Character converter, from Sam Ruby: + # (see http://intertwingly.net/stories/2005/09/28/xchar.rb). + # + module XChar # :nodoc: + + # See + # http://intertwingly.net/stories/2004/04/14/i18n.html#CleaningWindows + # for details. + CP1252 = { # :nodoc: + 128 => 8364, # euro sign + 130 => 8218, # single low-9 quotation mark + 131 => 402, # latin small letter f with hook + 132 => 8222, # double low-9 quotation mark + 133 => 8230, # horizontal ellipsis + 134 => 8224, # dagger + 135 => 8225, # double dagger + 136 => 710, # modifier letter circumflex accent + 137 => 8240, # per mille sign + 138 => 352, # latin capital letter s with caron + 139 => 8249, # single left-pointing angle quotation mark + 140 => 338, # latin capital ligature oe + 142 => 381, # latin capital letter z with caron + 145 => 8216, # left single quotation mark + 146 => 8217, # right single quotation mark + 147 => 8220, # left double quotation mark + 148 => 8221, # right double quotation mark + 149 => 8226, # bullet + 150 => 8211, # en dash + 151 => 8212, # em dash + 152 => 732, # small tilde + 153 => 8482, # trade mark sign + 154 => 353, # latin small letter s with caron + 155 => 8250, # single right-pointing angle quotation mark + 156 => 339, # latin small ligature oe + 158 => 382, # latin small letter z with caron + 159 => 376, # latin capital letter y with diaeresis + } + + # See http://www.w3.org/TR/REC-xml/#dt-chardata for details. + PREDEFINED = { + 38 => '&', # ampersand + 60 => '<', # left angle bracket + 62 => '>', # right angle bracket + } + + # See http://www.w3.org/TR/REC-xml/#charsets for details. + VALID = [ + 0x9, 0xA, 0xD, + (0x20..0xD7FF), + (0xE000..0xFFFD), + (0x10000..0x10FFFF) + ] + + # http://www.fileformat.info/info/unicode/char/fffd/index.htm + REPLACEMENT_CHAR = + if String.method_defined?(:encode) + "\uFFFD" + elsif $KCODE == 'UTF8' + "\xEF\xBF\xBD" + else + '*' + end + end + +end + + +if String.method_defined?(:encode) + module Builder + module XChar # :nodoc: + CP1252_DIFFERENCES, UNICODE_EQUIVALENT = Builder::XChar::CP1252.each. + inject([[],[]]) {|(domain,range),(key,value)| + [domain << key,range << value] + }.map {|seq| seq.pack('U*').force_encoding('utf-8')} + + XML_PREDEFINED = Regexp.new('[' + + Builder::XChar::PREDEFINED.keys.pack('U*').force_encoding('utf-8') + + ']') + + INVALID_XML_CHAR = Regexp.new('[^'+ + Builder::XChar::VALID.map { |item| + case item + when Fixnum + [item].pack('U').force_encoding('utf-8') + when Range + [item.first, '-'.ord, item.last].pack('UUU').force_encoding('utf-8') + end + }.join + + ']') + + ENCODING_BINARY = Encoding.find('BINARY') + ENCODING_UTF8 = Encoding.find('UTF-8') + ENCODING_ISO1 = Encoding.find('ISO-8859-1') + + # convert a string to valid UTF-8, compensating for a number of + # common errors. + def XChar.unicode(string) + if string.encoding == ENCODING_BINARY + if string.ascii_only? + string + else + string = string.clone.force_encoding(ENCODING_UTF8) + if string.valid_encoding? + string + else + string.encode(ENCODING_UTF8, ENCODING_ISO1) + end + end + + elsif string.encoding == ENCODING_UTF8 + if string.valid_encoding? + string + else + string.encode(ENCODING_UTF8, ENCODING_ISO1) + end + + else + string.encode(ENCODING_UTF8) + end + end + + # encode a string per XML rules + def XChar.encode(string) + unicode(string). + tr(CP1252_DIFFERENCES, UNICODE_EQUIVALENT). + gsub(INVALID_XML_CHAR, REPLACEMENT_CHAR). + gsub(XML_PREDEFINED) {|c| PREDEFINED[c.ord]} + end + end + end + +else + + ###################################################################### + # Enhance the Fixnum class with a XML escaped character conversion. + # + class Fixnum + XChar = Builder::XChar if ! defined?(XChar) + + # XML escaped version of chr. When escape is set to false + # the CP1252 fix is still applied but utf-8 characters are not + # converted to character entities. + def xchr(escape=true) + n = XChar::CP1252[self] || self + case n when *XChar::VALID + XChar::PREDEFINED[n] or + (n<128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*'))) + else + Builder::XChar::REPLACEMENT_CHAR + end + end + end + + + ###################################################################### + # Enhance the String class with a XML escaped character version of + # to_s. + # + class String + # XML escaped version of to_s. When escape is set to false + # the CP1252 fix is still applied but utf-8 characters are not + # converted to character entities. + def to_xs(escape=true) + unpack('U*').map {|n| n.xchr(escape)}.join # ASCII, UTF-8 + rescue + unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252 + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xmlbase.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xmlbase.rb new file mode 100644 index 0000000..8f03a82 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xmlbase.rb @@ -0,0 +1,199 @@ +#!/usr/bin/env ruby + +require 'builder/blankslate' + +module Builder + + # Generic error for builder + class IllegalBlockError < RuntimeError; end + + # XmlBase is a base class for building XML builders. See + # Builder::XmlMarkup and Builder::XmlEvents for examples. + class XmlBase < BlankSlate + + class << self + attr_accessor :cache_method_calls + end + + # Create an XML markup builder. + # + # out :: Object receiving the markup. +out+ must respond to + # <<. + # indent :: Number of spaces used for indentation (0 implies no + # indentation and no line breaks). + # initial :: Level of initial indentation. + # encoding :: When encoding and $KCODE are set to 'utf-8' + # characters aren't converted to character entities in + # the output stream. + def initialize(indent=0, initial=0, encoding='utf-8') + @indent = indent + @level = initial + @encoding = encoding.downcase + end + + def explicit_nil_handling? + @explicit_nil_handling + end + + # Create a tag named +sym+. Other than the first argument which + # is the tag name, the arguments are the same as the tags + # implemented via method_missing. + def tag!(sym, *args, &block) + text = nil + attrs = nil + sym = "#{sym}:#{args.shift}" if args.first.kind_of?(::Symbol) + sym = sym.to_sym unless sym.class == ::Symbol + args.each do |arg| + case arg + when ::Hash + attrs ||= {} + attrs.merge!(arg) + when nil + attrs ||= {} + attrs.merge!({:nil => true}) if explicit_nil_handling? + else + text ||= '' + text << arg.to_s + end + end + if block + unless text.nil? + ::Kernel::raise ::ArgumentError, + "XmlMarkup cannot mix a text argument with a block" + end + _indent + _start_tag(sym, attrs) + _newline + begin + _nested_structures(block) + ensure + _indent + _end_tag(sym) + _newline + end + elsif text.nil? + _indent + _start_tag(sym, attrs, true) + _newline + else + _indent + _start_tag(sym, attrs) + text! text + _end_tag(sym) + _newline + end + @target + end + + # Create XML markup based on the name of the method. This method + # is never invoked directly, but is called for each markup method + # in the markup block that isn't cached. + def method_missing(sym, *args, &block) + cache_method_call(sym) if ::Builder::XmlBase.cache_method_calls + tag!(sym, *args, &block) + end + + # Append text to the output target. Escape any markup. May be + # used within the markup brackets as: + # + # builder.p { |b| b.br; b.text! "HI" } #=>


HI

+ def text!(text) + _text(_escape(text)) + end + + # Append text to the output target without escaping any markup. + # May be used within the markup brackets as: + # + # builder.p { |x| x << "
HI" } #=>


HI

+ # + # This is useful when using non-builder enabled software that + # generates strings. Just insert the string directly into the + # builder without changing the inserted markup. + # + # It is also useful for stacking builder objects. Builders only + # use << to append to the target, so by supporting this + # method/operation builders can use other builders as their + # targets. + def <<(text) + _text(text) + end + + # For some reason, nil? is sent to the XmlMarkup object. If nil? + # is not defined and method_missing is invoked, some strange kind + # of recursion happens. Since nil? won't ever be an XML tag, it + # is pretty safe to define it here. (Note: this is an example of + # cargo cult programming, + # cf. http://fishbowl.pastiche.org/2004/10/13/cargo_cult_programming). + def nil? + false + end + + private + + require 'builder/xchar' + if ::String.method_defined?(:encode) + def _escape(text) + result = XChar.encode(text) + begin + encoding = ::Encoding::find(@encoding) + raise Exception if encoding.dummy? + result.encode(encoding) + rescue + # if the encoding can't be supported, use numeric character references + result. + gsub(/[^\u0000-\u007F]/) {|c| "&##{c.ord};"}. + force_encoding('ascii') + end + end + else + def _escape(text) + if (text.method(:to_xs).arity == 0) + text.to_xs + else + text.to_xs((@encoding != 'utf-8' or $KCODE != 'UTF8')) + end + end + end + + def _escape_attribute(text) + _escape(text).gsub("\n", " ").gsub("\r", " "). + gsub(%r{"}, '"') # " WART + end + + def _newline + return if @indent == 0 + text! "\n" + end + + def _indent + return if @indent == 0 || @level == 0 + text!(" " * (@level * @indent)) + end + + def _nested_structures(block) + @level += 1 + block.call(self) + ensure + @level -= 1 + end + + # If XmlBase.cache_method_calls = true, we dynamicly create the method + # missed as an instance method on the XMLBase object. Because XML + # documents are usually very repetative in nature, the next node will + # be handled by the new method instead of method_missing. As + # method_missing is very slow, this speeds up document generation + # significantly. + def cache_method_call(sym) + class << self; self; end.class_eval do + unless method_defined?(sym) + define_method(sym) do |*args, &block| + tag!(sym, *args, &block) + end + end + end + end + end + + XmlBase.cache_method_calls = true + +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xmlevents.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xmlevents.rb new file mode 100644 index 0000000..91fcd21 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xmlevents.rb @@ -0,0 +1,63 @@ +#!/usr/bin/env ruby + +#-- +# Copyright 2004 by Jim Weirich (jim@weirichhouse.org). +# All rights reserved. + +# Permission is granted for use, copying, modification, distribution, +# and distribution of modified versions of this work as long as the +# above copyright notice is included. +#++ + +require 'builder/xmlmarkup' + +module Builder + + # Create a series of SAX-like XML events (e.g. start_tag, end_tag) + # from the markup code. XmlEvent objects are used in a way similar + # to XmlMarkup objects, except that a series of events are generated + # and passed to a handler rather than generating character-based + # markup. + # + # Usage: + # xe = Builder::XmlEvents.new(hander) + # xe.title("HI") # Sends start_tag/end_tag/text messages to the handler. + # + # Indentation may also be selected by providing value for the + # indentation size and initial indentation level. + # + # xe = Builder::XmlEvents.new(handler, indent_size, initial_indent_level) + # + # == XML Event Handler + # + # The handler object must expect the following events. + # + # [start_tag(tag, attrs)] + # Announces that a new tag has been found. +tag+ is the name of + # the tag and +attrs+ is a hash of attributes for the tag. + # + # [end_tag(tag)] + # Announces that an end tag for +tag+ has been found. + # + # [text(text)] + # Announces that a string of characters (+text+) has been found. + # A series of characters may be broken up into more than one + # +text+ call, so the client cannot assume that a single + # callback contains all the text data. + # + class XmlEvents < XmlMarkup + def text!(text) + @target.text(text) + end + + def _start_tag(sym, attrs, end_too=false) + @target.start_tag(sym, attrs) + _end_tag(sym) if end_too + end + + def _end_tag(sym) + @target.end_tag(sym) + end + end + +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xmlmarkup.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xmlmarkup.rb new file mode 100644 index 0000000..4730d09 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/lib/builder/xmlmarkup.rb @@ -0,0 +1,339 @@ +#!/usr/bin/env ruby +#-- +# Copyright 2004, 2005 by Jim Weirich (jim@weirichhouse.org). +# All rights reserved. + +# Permission is granted for use, copying, modification, distribution, +# and distribution of modified versions of this work as long as the +# above copyright notice is included. +#++ + +# Provide a flexible and easy to use Builder for creating XML markup. +# See XmlBuilder for usage details. + +require 'builder/xmlbase' + +module Builder + + # Create XML markup easily. All (well, almost all) methods sent to + # an XmlMarkup object will be translated to the equivalent XML + # markup. Any method with a block will be treated as an XML markup + # tag with nested markup in the block. + # + # Examples will demonstrate this easier than words. In the + # following, +xm+ is an +XmlMarkup+ object. + # + # xm.em("emphasized") # => emphasized + # xm.em { xm.b("emp & bold") } # => emph & bold + # xm.a("A Link", "href"=>"http://onestepback.org") + # # => A Link + # xm.div { xm.br } # =>

+ # xm.target("name"=>"compile", "option"=>"fast") + # # => + # # NOTE: order of attributes is not specified. + # + # xm.instruct! # + # xm.html { # + # xm.head { # + # xm.title("History") # History + # } # + # xm.body { # + # xm.comment! "HI" # + # xm.h1("Header") #

Header

+ # xm.p("paragraph") #

paragraph

+ # } # + # } # + # + # == Notes: + # + # * The order that attributes are inserted in markup tags is + # undefined. + # + # * Sometimes you wish to insert text without enclosing tags. Use + # the text! method to accomplish this. + # + # Example: + # + # xm.div { #
+ # xm.text! "line"; xm.br # line
+ # xm.text! "another line"; xmbr # another line
+ # } #
+ # + # * The special XML characters <, >, and & are converted to <, + # > and & automatically. Use the << operation to + # insert text without modification. + # + # * Sometimes tags use special characters not allowed in ruby + # identifiers. Use the tag! method to handle these + # cases. + # + # Example: + # + # xml.tag!("SOAP:Envelope") { ... } + # + # will produce ... + # + # ... " + # + # tag! will also take text and attribute arguments (after + # the tag name) like normal markup methods. (But see the next + # bullet item for a better way to handle XML namespaces). + # + # * Direct support for XML namespaces is now available. If the + # first argument to a tag call is a symbol, it will be joined to + # the tag to produce a namespace:tag combination. It is easier to + # show this than describe it. + # + # xml.SOAP :Envelope do ... end + # + # Just put a space before the colon in a namespace to produce the + # right form for builder (e.g. "SOAP:Envelope" => + # "xml.SOAP :Envelope") + # + # * XmlMarkup builds the markup in any object (called a _target_) + # that accepts the << method. If no target is given, + # then XmlMarkup defaults to a string target. + # + # Examples: + # + # xm = Builder::XmlMarkup.new + # result = xm.title("yada") + # # result is a string containing the markup. + # + # buffer = "" + # xm = Builder::XmlMarkup.new(buffer) + # # The markup is appended to buffer (using <<) + # + # xm = Builder::XmlMarkup.new(STDOUT) + # # The markup is written to STDOUT (using <<) + # + # xm = Builder::XmlMarkup.new + # x2 = Builder::XmlMarkup.new(:target=>xm) + # # Markup written to +x2+ will be send to +xm+. + # + # * Indentation is enabled by providing the number of spaces to + # indent for each level as a second argument to XmlBuilder.new. + # Initial indentation may be specified using a third parameter. + # + # Example: + # + # xm = Builder.new(:indent=>2) + # # xm will produce nicely formatted and indented XML. + # + # xm = Builder.new(:indent=>2, :margin=>4) + # # xm will produce nicely formatted and indented XML with 2 + # # spaces per indent and an over all indentation level of 4. + # + # builder = Builder::XmlMarkup.new(:target=>$stdout, :indent=>2) + # builder.name { |b| b.first("Jim"); b.last("Weirich) } + # # prints: + # # + # # Jim + # # Weirich + # # + # + # * The instance_eval implementation which forces self to refer to + # the message receiver as self is now obsolete. We now use normal + # block calls to execute the markup block. This means that all + # markup methods must now be explicitly send to the xml builder. + # For instance, instead of + # + # xml.div { strong("text") } + # + # you need to write: + # + # xml.div { xml.strong("text") } + # + # Although more verbose, the subtle change in semantics within the + # block was found to be prone to error. To make this change a + # little less cumbersome, the markup block now gets the markup + # object sent as an argument, allowing you to use a shorter alias + # within the block. + # + # For example: + # + # xml_builder = Builder::XmlMarkup.new + # xml_builder.div { |xml| + # xml.stong("text") + # } + # + class XmlMarkup < XmlBase + + # Create an XML markup builder. Parameters are specified by an + # option hash. + # + # :target => target_object:: + # Object receiving the markup. +target_object+ must respond to + # the <<(a_string) operator and return + # itself. The default target is a plain string target. + # + # :indent => indentation:: + # Number of spaces used for indentation. The default is no + # indentation and no line breaks. + # + # :margin => initial_indentation_level:: + # Amount of initial indentation (specified in levels, not + # spaces). + # + # :quote => :single:: + # Use single quotes for attributes rather than double quotes. + # + # :escape_attrs => OBSOLETE:: + # The :escape_attrs option is no longer supported by builder + # (and will be quietly ignored). String attribute values are + # now automatically escaped. If you need unescaped attribute + # values (perhaps you are using entities in the attribute + # values), then give the value as a Symbol. This allows much + # finer control over escaping attribute values. + # + def initialize(options={}) + indent = options[:indent] || 0 + margin = options[:margin] || 0 + @quote = (options[:quote] == :single) ? "'" : '"' + @explicit_nil_handling = options[:explicit_nil_handling] + super(indent, margin) + @target = options[:target] || "" + end + + # Return the target of the builder. + def target! + @target + end + + def comment!(comment_text) + _ensure_no_block ::Kernel::block_given? + _special("", comment_text, nil) + end + + # Insert an XML declaration into the XML markup. + # + # For example: + # + # xml.declare! :ELEMENT, :blah, "yada" + # # => + def declare!(inst, *args, &block) + _indent + @target << "" + _newline + end + + # Insert a processing instruction into the XML markup. E.g. + # + # For example: + # + # xml.instruct! + # #=> + # xml.instruct! :aaa, :bbb=>"ccc" + # #=> + # + # Note: If the encoding is setup to "UTF-8" and the value of + # $KCODE is "UTF8", then builder will emit UTF-8 encoded strings + # rather than the entity encoding normally used. + def instruct!(directive_tag=:xml, attrs={}) + _ensure_no_block ::Kernel::block_given? + if directive_tag == :xml + a = { :version=>"1.0", :encoding=>"UTF-8" } + attrs = a.merge attrs + @encoding = attrs[:encoding].downcase + end + _special( + "", + nil, + attrs, + [:version, :encoding, :standalone]) + end + + # Insert a CDATA section into the XML markup. + # + # For example: + # + # xml.cdata!("text to be included in cdata") + # #=> + # + def cdata!(text) + _ensure_no_block ::Kernel::block_given? + _special("", text.gsub(']]>', ']]]]>'), nil) + end + + private + + # NOTE: All private methods of a builder object are prefixed when + # a "_" character to avoid possible conflict with XML tag names. + + # Insert text directly in to the builder's target. + def _text(text) + @target << text + end + + # Insert special instruction. + def _special(open, close, data=nil, attrs=nil, order=[]) + _indent + @target << open + @target << data if data + _insert_attributes(attrs, order) if attrs + @target << close + _newline + end + + # Start an XML tag. If end_too is true, then the start + # tag is also the end tag (e.g.
+ def _start_tag(sym, attrs, end_too=false) + @target << "<#{sym}" + _insert_attributes(attrs) + @target << "/" if end_too + @target << ">" + end + + # Insert an ending tag. + def _end_tag(sym) + @target << "" + end + + # Insert the attributes (given in the hash). + def _insert_attributes(attrs, order=[]) + return if attrs.nil? + order.each do |k| + v = attrs[k] + @target << %{ #{k}=#{@quote}#{_attr_value(v)}#{@quote}} if v + end + attrs.each do |k, v| + @target << %{ #{k}=#{@quote}#{_attr_value(v)}#{@quote}} unless order.member?(k) # " WART + end + end + + def _attr_value(value) + case value + when ::Symbol + value.to_s + else + _escape_attribute(value.to_s) + end + end + + def _ensure_no_block(got_block) + if got_block + ::Kernel::raise IllegalBlockError.new( + "Blocks are not allowed on XML instructions" + ) + end + end + + end + +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/rakelib/publish.rake b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/rakelib/publish.rake new file mode 100644 index 0000000..9849e0d --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/rakelib/publish.rake @@ -0,0 +1,17 @@ +# Optional publish task for Rake + +require 'rake/contrib/sshpublisher' +require 'rake/contrib/rubyforgepublisher' + +publisher = Rake::CompositePublisher.new +publisher.add Rake::RubyForgePublisher.new('builder', 'jimweirich') +publisher.add Rake::SshFilePublisher.new( + 'linode', + 'htdocs/software/builder', + '.', + 'builder.blurb') + +desc "Publish the Documentation to RubyForge." +task :publish => [:rdoc] do + publisher.upload +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/rakelib/tags.rake b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/rakelib/tags.rake new file mode 100644 index 0000000..93b47df --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/rakelib/tags.rake @@ -0,0 +1,62 @@ +#!/usr/bin/env ruby + +module Tags + extend Rake::DSL if defined?(Rake::DSL) + + PROG = ENV['TAGS'] || 'ctags' + + RAKEFILES = FileList['Rakefile', '**/*.rake'] + + FILES = FileList['**/*.rb', '**/*.js'] + RAKEFILES + FILES.exclude('pkg', 'dist') + + PROJECT_DIR = ['.'] + + RVM_GEMDIR = File.join(`rvm gemdir`.strip, "gems") + SYSTEM_DIRS = File.exists?(RVM_GEMDIR) ? RVM_GEMDIR : [] + + module_function + + # Convert key_word to --key-word. + def keyword(key) + k = key.to_s.gsub(/_/, '-') + (k.length == 1) ? "-#{k}" : "--#{k}" + end + + # Run ctags command + def run(*args) + opts = { + :e => true, + :totals => true, + :recurse => true, + } + opts = opts.merge(args.pop) if args.last.is_a?(Hash) + command_args = opts.map { |k, v| + (v == true) ? keyword(k) : "#{keyword(k)}=#{v}" + }.join(" ") + sh %{#{Tags::PROG} #{command_args} #{args.join(' ')}} + end +end + +namespace "tags" do + desc "Generate an Emacs TAGS file" + task :emacs, [:all] => Tags::FILES do |t, args| + puts "Making Emacs TAGS file" + verbose(true) do + Tags.run(Tags::PROJECT_DIR) + Tags.run(Tags::RAKEFILES, + :language_force => "ruby", + :append => true) + if args.all + Tags::SYSTEM_DIRS.each do |dir| + Tags.run(dir, + :language_force => "ruby", + :append => true) + end + end + end + end +end + +desc "Generate the TAGS file" +task :tags, [:all] => ["tags:emacs"] diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/performance.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/performance.rb new file mode 100644 index 0000000..e764205 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/performance.rb @@ -0,0 +1,41 @@ +#!/usr/bin/env ruby +# encoding: iso-8859-1 + +#-- +# Portions copyright 2004 by Jim Weirich (jim@weirichhouse.org). +# Portions copyright 2005 by Sam Ruby (rubys@intertwingly.net). +# All rights reserved. + +# Permission is granted for use, copying, modification, distribution, +# and distribution of modified versions of this work as long as the +# above copyright notice is included. +#++ + +require 'builder/xmlmarkup' +require 'benchmark' + +text = "This is a test of the new xml markup. I�t�rn�ti�n�liz�ti�n\n" * 10000 + +include Benchmark # we need the CAPTION and FMTSTR constants +include Builder +n = 50 +Benchmark.benchmark do |bm| + tf = bm.report("base") { + n.times do + x = XmlMarkup.new + x.text(text) + x.target! + end + } + def XmlMarkup._escape(text) + text.to_xs + end + tf = bm.report("to_xs") { + n.times do + x = XmlMarkup.new + x.text(text) + x.target! + end + } +end + diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/preload.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/preload.rb new file mode 100644 index 0000000..395e043 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/preload.rb @@ -0,0 +1,39 @@ +#!/usr/bin/env ruby + +#-- +# Portions copyright 2004 by Jim Weirich (jim@weirichhouse.org). +# Portions copyright 2005 by Sam Ruby (rubys@intertwingly.net). +# All rights reserved. + +# Permission is granted for use, copying, modification, distribution, +# and distribution of modified versions of this work as long as the +# above copyright notice is included. +#++ + +# We are defining method_added in Kernel and Object so that when +# BlankSlate overrides them later, we can verify that it correctly +# calls the older hooks. + +module Kernel + class << self + attr_reader :k_added_names + alias_method :preload_method_added, :method_added + def method_added(name) + preload_method_added(name) + @k_added_names ||= [] + @k_added_names << name + end + end +end + +class Object + class << self + attr_reader :o_added_names + alias_method :preload_method_added, :method_added + def method_added(name) + preload_method_added(name) + @o_added_names ||= [] + @o_added_names << name + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_blankslate.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_blankslate.rb new file mode 100644 index 0000000..ea38ced --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_blankslate.rb @@ -0,0 +1,217 @@ +#!/usr/bin/env ruby + +#-- +# Portions copyright 2004 by Jim Weirich (jim@weirichhouse.org). +# Portions copyright 2005 by Sam Ruby (rubys@intertwingly.net). +# All rights reserved. + +# Permission is granted for use, copying, modification, distribution, +# and distribution of modified versions of this work as long as the +# above copyright notice is included. +#++ + +require 'test/unit' +require 'test/preload' +require 'blankslate' +require 'stringio' + +# Methods to be introduced into the Object class late. +module LateObject + def late_object + 33 + end + def LateObject.included(mod) + # Modules defining an included method should not prevent blank + # slate erasure! + end +end + +# Methods to be introduced into the Kernel module late. +module LateKernel + def late_kernel + 44 + end + def LateKernel.included(mod) + # Modules defining an included method should not prevent blank + # slate erasure! + end +end + +# Introduce some late methods (both module and direct) into the Kernel +# module. +module Kernel + include LateKernel + + def late_addition + 1234 + end + + def double_late_addition + 11 + end + + def double_late_addition + 22 + end +end + + +# Introduce some late methods (both module and direct) into the Object +# class. +class Object + include LateObject + def another_late_addition + 4321 + end +end + +# Introduce some late methods by inclusion. +module GlobalModule + def global_inclusion + 42 + end +end +include GlobalModule + +def direct_global + 43 +end + +###################################################################### +# Test case for blank slate. +# +class TestBlankSlate < Test::Unit::TestCase + def setup + @bs = BlankSlate.new + end + + def test_undefined_methods_remain_undefined + assert_raise(NoMethodError) { @bs.no_such_method } + assert_raise(NoMethodError) { @bs.nil? } + end + + + # NOTE: NameError is acceptable because the lack of a '.' means that + # Ruby can't tell if it is a method or a local variable. + def test_undefined_methods_remain_undefined_during_instance_eval + assert_raise(NoMethodError, NameError) do + @bs.instance_eval do nil? end + end + assert_raise(NoMethodError, NameError) do + @bs.instance_eval do no_such_method end + end + end + + def test_private_methods_are_undefined + assert_raise(NoMethodError) do + @bs.puts "HI" + end + end + + def test_targetted_private_methods_are_undefined_during_instance_eval + assert_raise(NoMethodError, NameError) do + @bs.instance_eval do self.puts "HI" end + end + end + + def test_untargetted_private_methods_are_defined_during_instance_eval + oldstdout = $stdout + $stdout = StringIO.new + @bs.instance_eval do + puts "HI" + end + ensure + $stdout = oldstdout + end + + def test_methods_added_late_to_kernel_remain_undefined + assert_equal 1234, nil.late_addition + assert_raise(NoMethodError) { @bs.late_addition } + end + + def test_methods_added_late_to_object_remain_undefined + assert_equal 4321, nil.another_late_addition + assert_raise(NoMethodError) { @bs.another_late_addition } + end + + def test_methods_added_late_to_global_remain_undefined + assert_equal 42, global_inclusion + assert_raise(NoMethodError) { @bs.global_inclusion } + end + + def test_preload_method_added + assert Kernel.k_added_names.include?(:late_addition) + assert Object.o_added_names.include?(:another_late_addition) + end + + def test_method_defined_late_multiple_times_remain_undefined + assert_equal 22, nil.double_late_addition + assert_raise(NoMethodError) { @bs.double_late_addition } + end + + def test_late_included_module_in_object_is_ok + assert_equal 33, 1.late_object + assert_raise(NoMethodError) { @bs.late_object } + end + + def test_late_included_module_in_kernel_is_ok + assert_raise(NoMethodError) { @bs.late_kernel } + end + + def test_revealing_previously_hidden_methods_are_callable + with_to_s = Class.new(BlankSlate) do + reveal :to_s + end + assert_match(/^#<.*>$/, with_to_s.new.to_s) + end + + def test_revealing_previously_hidden_methods_are_callable_with_block + Object.class_eval <<-EOS + def given_block(&block) + block + end + EOS + + with_given_block = Class.new(BlankSlate) do + reveal :given_block + end + assert_not_nil with_given_block.new.given_block {} + end + + def test_revealing_a_hidden_method_twice_is_ok + with_to_s = Class.new(BlankSlate) do + reveal :to_s + reveal :to_s + end + assert_match(/^#<.*>$/, with_to_s.new.to_s) + end + + def test_revealing_unknown_hidden_method_is_an_error + assert_raises(RuntimeError) do + Class.new(BlankSlate) do + reveal :xyz + end + end + end + + def test_global_includes_still_work + assert_nothing_raised do + assert_equal 42, global_inclusion + assert_equal 42, Object.new.global_inclusion + assert_equal 42, "magic number".global_inclusion + assert_equal 43, direct_global + end + end + + def test_reveal_should_not_bind_to_an_instance + with_object_id = Class.new(BlankSlate) do + reveal(:object_id) + end + + obj1 = with_object_id.new + obj2 = with_object_id.new + + assert obj1.object_id != obj2.object_id, + "Revealed methods should not be bound to a particular instance" + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_eventbuilder.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_eventbuilder.rb new file mode 100644 index 0000000..f434470 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_eventbuilder.rb @@ -0,0 +1,150 @@ +#!/usr/bin/env ruby + +#-- +# Portions copyright 2004 by Jim Weirich (jim@weirichhouse.org). +# Portions copyright 2005 by Sam Ruby (rubys@intertwingly.net). +# All rights reserved. + +# Permission is granted for use, copying, modification, distribution, +# and distribution of modified versions of this work as long as the +# above copyright notice is included. +#++ + +require 'test/unit' +require 'test/preload' +require 'builder' +require 'builder/xmlevents' + +class TestEvents < Test::Unit::TestCase + + class Target + attr_reader :events + + def initialize + @events = [] + end + + def start_tag(tag, attrs) + @events << [:start_tag, tag, attrs] + end + + def end_tag(tag) + @events << [:end_tag, tag] + end + + def text(string) + @events << [:text, string] + end + + end + + + def setup + @target = Target.new + @xml = Builder::XmlEvents.new(:target=>@target) + end + + def test_simple + @xml.one + expect [:start_tag, :one, nil] + expect [:end_tag, :one] + expect_done + end + + def test_nested + @xml.one { @xml.two } + expect [:start_tag, :one, nil] + expect [:start_tag, :two, nil] + expect [:end_tag, :two] + expect [:end_tag, :one] + expect_done + end + + def test_text + @xml.one("a") + expect [:start_tag, :one, nil] + expect [:text, "a"] + expect [:end_tag, :one] + expect_done + end + + def test_special_text + @xml.one("H&R") + expect [:start_tag, :one, nil] + expect [:text, "H&R"] + expect [:end_tag, :one] + expect_done + end + + def test_text_with_entity + @xml.one("H&R") + expect [:start_tag, :one, nil] + expect [:text, "H&R"] + expect [:end_tag, :one] + expect_done + end + + def test_attributes + @xml.a(:b=>"c", :x=>"y") + expect [:start_tag, :a, {:x => "y", :b => "c"}] + expect [:end_tag, :a] + expect_done + end + + def test_moderately_complex + @xml.tag! "address-book" do |x| + x.entry :id=>"1" do + x.name { + x.first "Bill" + x.last "Smith" + } + x.address "Cincinnati" + end + x.entry :id=>"2" do + x.name { + x.first "John" + x.last "Doe" + } + x.address "Columbus" + end + end + expect [:start_tag, "address-book".intern, nil] + expect [:start_tag, :entry, {:id => "1"}] + expect [:start_tag, :name, nil] + expect [:start_tag, :first, nil] + expect [:text, "Bill"] + expect [:end_tag, :first] + expect [:start_tag, :last, nil] + expect [:text, "Smith"] + expect [:end_tag, :last] + expect [:end_tag, :name] + expect [:start_tag, :address, nil] + expect [:text, "Cincinnati"] + expect [:end_tag, :address] + expect [:end_tag, :entry] + expect [:start_tag, :entry, {:id => "2"}] + expect [:start_tag, :name, nil] + expect [:start_tag, :first, nil] + expect [:text, "John"] + expect [:end_tag, :first] + expect [:start_tag, :last, nil] + expect [:text, "Doe"] + expect [:end_tag, :last] + expect [:end_tag, :name] + expect [:start_tag, :address, nil] + expect [:text, "Columbus"] + expect [:end_tag, :address] + expect [:end_tag, :entry] + expect [:end_tag, "address-book".intern] + expect_done + end + + def expect(value) + assert_equal value, @target.events.shift + end + + def expect_done + assert_nil @target.events.shift + end + +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_markupbuilder.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_markupbuilder.rb new file mode 100644 index 0000000..562b12a --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_markupbuilder.rb @@ -0,0 +1,611 @@ +#!/usr/bin/env ruby + +#-- +# Portions copyright 2004 by Jim Weirich (jim@weirichhouse.org). +# Portions copyright 2005 by Sam Ruby (rubys@intertwingly.net). +# All rights reserved. + +# Permission is granted for use, copying, modification, distribution, +# and distribution of modified versions of this work as long as the +# above copyright notice is included. +#++ + +require 'test/unit' +require 'test/preload' +require 'builder' +require 'builder/xmlmarkup' + +class TestMarkup < Test::Unit::TestCase + def setup + @xml = Builder::XmlMarkup.new + end + + def test_create + assert_not_nil @xml + end + + def test_simple + @xml.simple + assert_equal "", @xml.target! + end + + def test_value + @xml.value("hi") + assert_equal "hi", @xml.target! + end + + def test_empty_value + @xml.value("") + assert_equal "", @xml.target! + end + + def test_nil_value + @xml.value(nil) + assert_equal "", @xml.target! + end + + def test_no_value + @xml.value() + assert_equal "", @xml.target! + end + + def test_nested + @xml.outer { |x| x.inner("x") } + assert_equal "x", @xml.target! + end + + def test_attributes + @xml.ref(:id => 12) + assert_equal %{}, @xml.target! + end + + def test_single_quotes_for_attrs + @xml = Builder::XmlMarkup.new(:quote => :single) + @xml.ref(:id => 12) + assert_equal %{}, @xml.target! + end + + def test_mixed_quotes_for_attrs + @xml = Builder::XmlMarkup.new(:quote => :single) + x = Builder::XmlMarkup.new(:target=>@xml, :quote => :double) + @xml.ref(:id => 12) do + x.link(:id => 13) + end + assert_equal %{}, @xml.target! + end + + def test_string_attributes_are_escaped_by_default + @xml.ref(:id => "H&R") + assert_equal %{}, @xml.target! + end + + def test_symbol_attributes_are_unescaped_by_default + @xml.ref(:id => :"H&R") + assert_equal %{}, @xml.target! + end + + def test_attributes_escaping_can_be_turned_on + @xml = Builder::XmlMarkup.new + @xml.ref(:id => "") + assert_equal %{}, @xml.target! + end + + def test_mixed_attribute_escaping_with_nested_builders + x = Builder::XmlMarkup.new(:target=>@xml) + @xml.ref(:id=>:"H&R") { + x.element(:tag=>"Long&Short") + } + assert_equal "", + @xml.target! + end + + def test_multiple_attributes + @xml.ref(:id => 12, :name => "bill") + assert_match %r{^$}, @xml.target! + end + + def test_attributes_with_text + @xml.a("link", :href=>"http://onestepback.org") + assert_equal %{link}, @xml.target! + end + + def test_attributes_with_newlines + @xml.abbr("W3C", :title=>"World\nWide\rWeb\r\nConsortium") + assert_equal %{W3C}, + @xml.target! + end + + def test_complex + @xml.body(:bg=>"#ffffff") { |x| + x.title("T", :style=>"red") + } + assert_equal %{T}, @xml.target! + end + + def test_funky_symbol + @xml.tag!("non-ruby-token", :id=>1) { |x| x.ok } + assert_equal %{}, @xml.target! + end + + def test_tag_can_handle_private_method + @xml.tag!("loop", :id=>1) { |x| x.ok } + assert_equal %{}, @xml.target! + end + + def test_no_explicit_marker + @xml.p { |x| x.b("HI") } + assert_equal "

HI

", @xml.target! + end + + def test_reference_local_vars + n = 3 + @xml.ol { |x| n.times { x.li(n) } } + assert_equal "
  1. 3
  2. 3
  3. 3
", @xml.target! + end + + def test_reference_methods + @xml.title { |x| x.a { x.b(name) } } + assert_equal "<a><b>bob</b></a>", @xml.target! + end + + def test_append_text + @xml.p { |x| x.br; x.text! "HI" } + assert_equal "


HI

", @xml.target! + end + + def test_ambiguous_markup + ex = assert_raise(ArgumentError) { + @xml.h1("data1") { b } + } + assert_match(/\btext\b/, ex.message) + assert_match(/\bblock\b/, ex.message) + end + + def test_capitalized_method + @xml.P { |x| x.B("hi"); x.BR(); x.EM { x.text! "world" } } + assert_equal "

hi
world

", @xml.target! + end + + def test_escaping + @xml.div { |x| x.text! ""; x.em("H&R Block") } + assert_equal %{
<hi>H&R Block
}, @xml.target! + end + + def test_nil + b = Builder::XmlMarkup.new + b.tag! "foo", nil + assert_equal %{}, b.target! + end + + def test_nil_without_explicit_nil_handling + b = Builder::XmlMarkup.new(:explicit_nil_handling => false) + b.tag! "foo", nil + assert_equal %{}, b.target! + end + + def test_nil_with_explicit_nil_handling + b = Builder::XmlMarkup.new(:explicit_nil_handling => true) + b.tag! "foo", nil + assert_equal %{}, b.target! + end + + def test_non_escaping + @xml.div("ns:xml"=>:"&xml;") { |x| x << ""; x.em("H&R Block") } + assert_equal %{
H&R Block
}, @xml.target! + end + + def test_return_value + str = @xml.x("men") + assert_equal @xml.target!, str + end + + def test_stacked_builders + b = Builder::XmlMarkup.new( :target => @xml ) + b.div { @xml.span { @xml.a("text", :href=>"ref") } } + assert_equal "", @xml.target! + end + + def name + "bob" + end +end + +class TestAttributeEscaping < Test::Unit::TestCase + + def setup + @xml = Builder::XmlMarkup.new + end + + def test_element_gt + @xml.title('1<2') + assert_equal '1<2', @xml.target! + end + + def test_element_amp + @xml.title('AT&T') + assert_equal 'AT&T', @xml.target! + end + + def test_element_amp2 + @xml.title('&') + assert_equal '&amp;', @xml.target! + end + + def test_attr_less + @xml.a(:title => '2>1') + assert_equal '', @xml.target! + end + + def test_attr_amp + @xml.a(:title => 'AT&T') + assert_equal '', @xml.target! + end + + def test_attr_quot + @xml.a(:title => '"x"') + assert_equal '', @xml.target! + end + +end + +class TestNameSpaces < Test::Unit::TestCase + def setup + @xml = Builder::XmlMarkup.new(:indent=>2) + end + + def test_simple_name_spaces + @xml.rdf :RDF + assert_equal "\n", @xml.target! + end + + def test_long + xml = Builder::XmlMarkup.new(:indent=>2) + xml.instruct! + xml.rdf :RDF, + "xmlns:rdf" => :"&rdf;", + "xmlns:rdfs" => :"&rdfs;", + "xmlns:xsd" => :"&xsd;", + "xmlns:owl" => :"&owl;" do + xml.owl :Class, :'rdf:ID'=>'Bird' do + xml.rdfs :label, 'bird' + xml.rdfs :subClassOf do + xml.owl :Restriction do + xml.owl :onProperty, 'rdf:resource'=>'#wingspan' + xml.owl :maxCardinality,1,'rdf:datatype'=>'&xsd;nonNegativeInteger' + end + end + end + end + assert_match(/^<\?xml/, xml.target!) + assert_match(/\n/m, xml.target!) + end + + def test_ensure + xml = Builder::XmlMarkup.new + xml.html do + xml.body do + begin + xml.p do + raise Exception.new('boom') + end + rescue Exception => e + xml.pre e + end + end + end + assert_match %r{

}, xml.target! + assert_match %r{

}, xml.target! + end +end + +class TestDeclarations < Test::Unit::TestCase + def setup + @xml = Builder::XmlMarkup.new(:indent=>2) + end + + def test_declare + @xml.declare! :element + assert_equal "\n", @xml.target! + end + + def test_bare_arg + @xml.declare! :element, :arg + assert_equal"\n", @xml.target! + end + + def test_string_arg + @xml.declare! :element, "string" + assert_equal"\n", @xml.target! + end + + def test_mixed_args + @xml.declare! :element, :x, "y", :z, "-//OASIS//DTD DocBook XML//EN" + assert_equal "\n", @xml.target! + end + + def test_nested_declarations + @xml = Builder::XmlMarkup.new + @xml.declare! :DOCTYPE, :chapter do |x| + x.declare! :ELEMENT, :chapter, "(title,para+)".intern + end + assert_equal "]>", @xml.target! + end + + def test_nested_indented_declarations + @xml.declare! :DOCTYPE, :chapter do |x| + x.declare! :ELEMENT, :chapter, "(title,para+)".intern + end + assert_equal "\n]>\n", @xml.target! + end + + def test_complex_declaration + @xml.declare! :DOCTYPE, :chapter do |x| + x.declare! :ELEMENT, :chapter, "(title,para+)".intern + x.declare! :ELEMENT, :title, "(#PCDATA)".intern + x.declare! :ELEMENT, :para, "(#PCDATA)".intern + end + expected = %{ + + +]> +} + assert_equal expected, @xml.target! + end +end + + +class TestSpecialMarkup < Test::Unit::TestCase + def setup + @xml = Builder::XmlMarkup.new(:indent=>2) + end + + def test_comment + @xml.comment!("COMMENT") + assert_equal "\n", @xml.target! + end + + def test_indented_comment + @xml.p { @xml.comment! "OK" } + assert_equal "

\n \n

\n", @xml.target! + end + + def test_instruct + @xml.instruct! :abc, :version=>"0.9" + assert_equal "\n", @xml.target! + end + + def test_indented_instruct + @xml.p { @xml.instruct! :xml } + assert_match %r{

\n <\?xml version="1.0" encoding="UTF-8"\?>\n

\n}, + @xml.target! + end + + def test_instruct_without_attributes + @xml.instruct! :zz + assert_equal "\n", @xml.target! + end + + def test_xml_instruct + @xml.instruct! + assert_match(/^<\?xml version="1.0" encoding="UTF-8"\?>$/, @xml.target!) + end + + def test_xml_instruct_with_overrides + @xml.instruct! :xml, :encoding=>"UCS-2" + assert_match(/^<\?xml version="1.0" encoding="UCS-2"\?>$/, @xml.target!) + end + + def test_xml_instruct_with_standalong + @xml.instruct! :xml, :encoding=>"UCS-2", :standalone=>"yes" + assert_match(/^<\?xml version="1.0" encoding="UCS-2" standalone="yes"\?>$/, @xml.target!) + end + + def test_no_blocks + assert_raise(Builder::IllegalBlockError) do + @xml.instruct! { |x| x.hi } + end + assert_raise(Builder::IllegalBlockError) do + @xml.comment!(:element) { |x| x.hi } + end + end + + def test_cdata + @xml.cdata!("TEST") + assert_equal "\n", @xml.target! + end + + def test_cdata_with_ampersand + @xml.cdata!("TEST&CHECK") + assert_equal "\n", @xml.target! + end + + def test_cdata_with_included_close + @xml.cdata!("TEST]]>CHECK") + assert_equal "CHECK]]>\n", @xml.target! + end +end + +class TestIndentedXmlMarkup < Test::Unit::TestCase + def setup + @xml = Builder::XmlMarkup.new(:indent=>2) + end + + def test_one_level + @xml.ol { |x| x.li "text" } + assert_equal "
    \n
  1. text
  2. \n
\n", @xml.target! + end + + def test_two_levels + @xml.p { |x| + x.ol { x.li "text" } + x.br + } + assert_equal "

\n

    \n
  1. text
  2. \n
\n
\n

\n", @xml.target! + end + + def test_initial_level + @xml = Builder::XmlMarkup.new(:indent=>2, :margin=>4) + @xml.name { |x| x.first("Jim") } + assert_equal " \n Jim\n \n", @xml.target! + end + + class TestUtfMarkup < Test::Unit::TestCase + if ! String.method_defined?(:encode) + def setup + @old_kcode = $KCODE + end + + def teardown + $KCODE = @old_kcode + end + + def test_use_entities_if_no_encoding_is_given_and_kcode_is_none + $KCODE = 'NONE' + xml = Builder::XmlMarkup.new + xml.p("\xE2\x80\x99") + assert_match(%r(

), xml.target!) # + end + + def test_use_entities_if_encoding_is_utf_but_kcode_is_not + $KCODE = 'NONE' + xml = Builder::XmlMarkup.new + xml.instruct!(:xml, :encoding => 'UTF-8') + xml.p("\xE2\x80\x99") + assert_match(%r(

), xml.target!) # + end + else + # change in behavior. As there is no $KCODE anymore, the default + # moves from "does not understand utf-8" to "supports utf-8". + + def test_use_entities_if_no_encoding_is_given_and_kcode_is_none + xml = Builder::XmlMarkup.new + xml.p("\xE2\x80\x99") + assert_match("

\u2019

", xml.target!) # + end + + def test_use_entities_if_encoding_is_utf_but_kcode_is_not + xml = Builder::XmlMarkup.new + xml.instruct!(:xml, :encoding => 'UTF-8') + xml.p("\xE2\x80\x99") + assert_match("

\u2019

", xml.target!) # + end + end + + def encode string, encoding + if !String.method_defined?(:encode) + $KCODE = encoding + string + elsif encoding == 'UTF8' + string.force_encoding('UTF-8') + else + string + end + end + + def test_use_entities_if_kcode_is_utf_but_encoding_is_dummy_encoding + xml = Builder::XmlMarkup.new + xml.instruct!(:xml, :encoding => 'UTF-16') + xml.p(encode("\xE2\x80\x99", 'UTF8')) + assert_match(%r(

), xml.target!) # + end + + def test_use_entities_if_kcode_is_utf_but_encoding_is_unsupported_encoding + xml = Builder::XmlMarkup.new + xml.instruct!(:xml, :encoding => 'UCS-2') + xml.p(encode("\xE2\x80\x99", 'UTF8')) + assert_match(%r(

), xml.target!) # + end + + def test_use_utf8_if_encoding_defaults_and_kcode_is_utf8 + xml = Builder::XmlMarkup.new + xml.p(encode("\xE2\x80\x99",'UTF8')) + assert_equal encode("

\xE2\x80\x99

",'UTF8'), xml.target! + end + + def test_use_utf8_if_both_encoding_and_kcode_are_utf8 + xml = Builder::XmlMarkup.new + xml.instruct!(:xml, :encoding => 'UTF-8') + xml.p(encode("\xE2\x80\x99",'UTF8')) + assert_match encode("

\xE2\x80\x99

",'UTF8'), xml.target! + end + + def test_use_utf8_if_both_encoding_and_kcode_are_utf8_with_lowercase + xml = Builder::XmlMarkup.new + xml.instruct!(:xml, :encoding => 'utf-8') + xml.p(encode("\xE2\x80\x99",'UTF8')) + assert_match encode("

\xE2\x80\x99

",'UTF8'), xml.target! + end + end + + class TestXmlEvents < Test::Unit::TestCase + def setup + @handler = EventHandler.new + @xe = Builder::XmlEvents.new(:target=>@handler) + end + + def test_simple + @xe.p + assert_equal [:start, :p, nil], @handler.events.shift + assert_equal [:end, :p], @handler.events.shift + end + + def test_text + @xe.p("HI") + assert_equal [:start, :p, nil], @handler.events.shift + assert_equal [:text, "HI"], @handler.events.shift + assert_equal [:end, :p], @handler.events.shift + end + + def test_attributes + @xe.p("id"=>"2") + ev = @handler.events.shift + assert_equal [:start, :p], ev[0,2] + assert_equal "2", ev[2]['id'] + assert_equal [:end, :p], @handler.events.shift + end + + def test_indented + @xml = Builder::XmlEvents.new(:indent=>2, :target=>@handler) + @xml.p { |x| x.b("HI") } + assert_equal [:start, :p, nil], @handler.events.shift + assert_equal "\n ", pop_text + assert_equal [:start, :b, nil], @handler.events.shift + assert_equal "HI", pop_text + assert_equal [:end, :b], @handler.events.shift + assert_equal "\n", pop_text + assert_equal [:end, :p], @handler.events.shift + end + + def pop_text + result = '' + while ! @handler.events.empty? && @handler.events[0][0] == :text + result << @handler.events[0][1] + @handler.events.shift + end + result + end + + class EventHandler + attr_reader :events + def initialize + @events = [] + end + + def start_tag(sym, attrs) + @events << [:start, sym, attrs] + end + + def end_tag(sym) + @events << [:end, sym] + end + + def text(txt) + @events << [:text, txt] + end + end + end + +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_method_caching.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_method_caching.rb new file mode 100644 index 0000000..91f7aca --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_method_caching.rb @@ -0,0 +1,62 @@ +#!/usr/bin/env ruby + +#-- +# Portions copyright 2011 by Bart ten Brinke (info@retrosync.com). +# All rights reserved. + +# Permission is granted for use, copying, modification, distribution, +# and distribution of modified versions of this work as long as the +# above copyright notice is included. +#++ + +require 'test/unit' +require 'test/preload' +require 'builder' + +class TestMethodCaching < Test::Unit::TestCase + + # We can directly ask if xml object responds to the cache_me or + # do_not_cache_me methods because xml is derived from BasicObject + # (and repond_to? is not defined in BasicObject). + # + # Instead we are going to stub out method_missing so that it throws + # an error, and then make sure that error is either thrown or not + # thrown as appropriate. + + def teardown + super + Builder::XmlBase.cache_method_calls = true + end + + def test_caching_does_not_break_weird_symbols + xml = Builder::XmlMarkup.new + xml.__send__("work-order", 1) + assert_equal "1", xml.target! + end + + def test_method_call_caching + xml = Builder::XmlMarkup.new + xml.cache_me + + def xml.method_missing(*args) + ::Kernel.fail StandardError, "SHOULD NOT BE CALLED" + end + assert_nothing_raised do + xml.cache_me + end + end + + def test_method_call_caching_disabled + Builder::XmlBase.cache_method_calls = false + xml = Builder::XmlMarkup.new + xml.do_not_cache_me + + def xml.method_missing(*args) + ::Kernel.fail StandardError, "SHOULD BE CALLED" + end + assert_raise(StandardError, "SHOULD BE CALLED") do + xml.do_not_cache_me + end + end + +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_namecollision.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_namecollision.rb new file mode 100644 index 0000000..5b16b30 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_namecollision.rb @@ -0,0 +1,39 @@ +#!/usr/bin/env ruby + +#-- +# Portions copyright 2004 by Jim Weirich (jim@weirichhouse.org). +# Portions copyright 2005 by Sam Ruby (rubys@intertwingly.net). +# All rights reserved. + +# Permission is granted for use, copying, modification, distribution, +# and distribution of modified versions of this work as long as the +# above copyright notice is included. +#++ + +require 'test/unit' +require 'builder/xchar' + +class TestNameCollisions < Test::Unit::TestCase + module Collide + def xchr + end + end + + def test_no_collision + assert_nothing_raised do + Builder.check_for_name_collision(Collide, :not_defined) + end + end + + def test_collision + assert_raise RuntimeError do + Builder.check_for_name_collision(Collide, "xchr") + end + end + + def test_collision_with_symbol + assert_raise RuntimeError do + Builder.check_for_name_collision(Collide, :xchr) + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_xchar.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_xchar.rb new file mode 100644 index 0000000..6a00716 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/builder-3.2.2/test/test_xchar.rb @@ -0,0 +1,78 @@ +#!/usr/bin/env ruby +# encoding: us-ascii + +#-- +# Portions copyright 2004 by Jim Weirich (jim@weirichhouse.org). +# Portions copyright 2005 by Sam Ruby (rubys@intertwingly.net). +# All rights reserved. + +# Permission is granted for use, copying, modification, distribution, +# and distribution of modified versions of this work as long as the +# above copyright notice is included. +#++ + +#!/usr/bin/env ruby + +require 'test/unit' +require 'builder/xchar' + +if String.method_defined?(:encode) + class String + ENCODING_BINARY = Encoding.find('BINARY') + + # shim method for testing purposes + def to_xs(escape=true) + raise NameError.new('to_xs') unless caller[0].index(__FILE__) + + result = Builder::XChar.encode(self) + if escape + result.gsub(/[^\u0000-\u007F]/) {|c| "&##{c.ord};"} + else + # really only useful for testing purposes + result.force_encoding(ENCODING_BINARY) + end + end + end +end + +class TestXmlEscaping < Test::Unit::TestCase + REPLACEMENT_CHAR = Builder::XChar::REPLACEMENT_CHAR.to_xs + + def test_ascii + assert_equal 'abc', 'abc'.to_xs + end + + def test_predefined + assert_equal '&', '&'.to_xs # ampersand + assert_equal '<', '<'.to_xs # left angle bracket + assert_equal '>', '>'.to_xs # right angle bracket + end + + def test_invalid + assert_equal REPLACEMENT_CHAR, "\x00".to_xs # null + assert_equal REPLACEMENT_CHAR, "\x0C".to_xs # form feed + assert_equal REPLACEMENT_CHAR, "\xEF\xBF\xBF".to_xs # U+FFFF + end + + def test_iso_8859_1 + assert_equal 'ç', "\xE7".to_xs # small c cedilla + assert_equal '©', "\xA9".to_xs # copyright symbol + end + + def test_win_1252 + assert_equal '’', "\x92".to_xs # smart quote + assert_equal '€', "\x80".to_xs # euro + end + + def test_utf8 + assert_equal '’', "\xE2\x80\x99".to_xs # right single quote + assert_equal '©', "\xC2\xA9".to_xs # copy + end + + def test_utf8_verbatim + assert_equal "\xE2\x80\x99", "\xE2\x80\x99".to_xs(false) # right single quote + assert_equal "\xC2\xA9", "\xC2\xA9".to_xs(false) # copy + assert_equal "\xC2\xA9&\xC2\xA9", + "\xC2\xA9&\xC2\xA9".to_xs(false) # copy with ampersand + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/LICENSE.md b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/LICENSE.md new file mode 100644 index 0000000..372e935 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/LICENSE.md @@ -0,0 +1,20 @@ +Copyright (c) 2009-2015 Rick Olson, Zack Hobson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/README.md b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/README.md new file mode 100644 index 0000000..afbbb85 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/README.md @@ -0,0 +1,245 @@ +# Faraday + +Faraday is an HTTP client lib that provides a common interface over many +adapters (such as Net::HTTP) and embraces the concept of Rack middleware when +processing the request/response cycle. + +Faraday supports these adapters: + +* [Net::HTTP][net_http] _(default)_ +* [Net::HTTP::Persistent][persistent] +* [Excon][] +* [Typhoeus][] +* [Patron][] +* [EventMachine][] +* [HTTPClient][] + +It also includes a Rack adapter for hitting loaded Rack applications through +Rack::Test, and a Test adapter for stubbing requests by hand. + +## Usage + +```ruby +conn = Faraday.new(:url => 'http://sushi.com') do |faraday| + faraday.request :url_encoded # form-encode POST params + faraday.response :logger # log requests to STDOUT + faraday.adapter Faraday.default_adapter # make requests with Net::HTTP +end + +## GET ## + +response = conn.get '/nigiri/sake.json' # GET http://sushi.com/nigiri/sake.json +response.body + +conn.get '/nigiri', { :name => 'Maguro' } # GET http://sushi.com/nigiri?name=Maguro + +conn.get do |req| # GET http://sushi.com/search?page=2&limit=100 + req.url '/search', :page => 2 + req.params['limit'] = 100 +end + +## POST ## + +conn.post '/nigiri', { :name => 'Maguro' } # POST "name=maguro" to http://sushi.com/nigiri + +# post payload as JSON instead of "www-form-urlencoded" encoding: +conn.post do |req| + req.url '/nigiri' + req.headers['Content-Type'] = 'application/json' + req.body = '{ "name": "Unagi" }' +end + +## Per-request options ## + +conn.get do |req| + req.url '/search' + req.options.timeout = 5 # open/read timeout in seconds + req.options.open_timeout = 2 # connection open timeout in seconds +end +``` + +If you don't need to set up anything, you can roll with just the default middleware +stack and default adapter (see [Faraday::RackBuilder#initialize](https://github.com/lostisland/faraday/blob/master/lib/faraday/rack_builder.rb)): + +```ruby +response = Faraday.get 'http://sushi.com/nigiri/sake.json' +``` + +### Changing how parameters are serialized + +Sometimes you need to send the same URL parameter multiple times with different +values. This requires manually setting the parameter encoder and can be done on +either per-connection or per-request basis. + +```ruby +# per-connection setting +conn = Faraday.new :params_encoder => Faraday::FlatParamsEncoder + +conn.get do |req| + # per-request setting: + # req.options.params_encoder = my_encoder + req.params['roll'] = ['california', 'philadelphia'] +end +# GET 'http://sushi.com?roll=california&roll=philadelphia' +``` + +The value of Faraday `params_encoder` can be any object that responds to: + +* `encode(hash) #=> String` +* `decode(string) #=> Hash` + +The encoder will affect both how query strings are processed and how POST bodies +get serialized. The default encoder is Faraday::NestedParamsEncoder. + +## Advanced middleware usage + +The order in which middleware is stacked is important. Like with Rack, the +first middleware on the list wraps all others, while the last middleware is the +innermost one, so that must be the adapter. + +```ruby +Faraday.new(...) do |conn| + # POST/PUT params encoders: + conn.request :multipart + conn.request :url_encoded + + conn.adapter :net_http +end +``` + +This request middleware setup affects POST/PUT requests in the following way: + +1. `Request::Multipart` checks for files in the payload, otherwise leaves + everything untouched; +2. `Request::UrlEncoded` encodes as "application/x-www-form-urlencoded" if not + already encoded or of another type + +Swapping middleware means giving the other priority. Specifying the +"Content-Type" for the request is explicitly stating which middleware should +process it. + +Examples: + +```ruby +# uploading a file: +payload[:profile_pic] = Faraday::UploadIO.new('/path/to/avatar.jpg', 'image/jpeg') + +# "Multipart" middleware detects files and encodes with "multipart/form-data": +conn.put '/profile', payload +``` + +## Writing middleware + +Middleware are classes that implement a `call` instance method. They hook into +the request/response cycle. + +```ruby +def call(request_env) + # do something with the request + # request_env[:request_headers].merge!(...) + + @app.call(request_env).on_complete do |response_env| + # do something with the response + # response_env[:response_headers].merge!(...) + end +end +``` + +It's important to do all processing of the response only in the `on_complete` +block. This enables middleware to work in parallel mode where requests are +asynchronous. + +The `env` is a hash with symbol keys that contains info about the request and, +later, response. Some keys are: + +``` +# request phase +:method - :get, :post, ... +:url - URI for the current request; also contains GET parameters +:body - POST parameters for :post/:put requests +:request_headers + +# response phase +:status - HTTP response status code, such as 200 +:body - the response body +:response_headers +``` + +## Using Faraday for testing + +```ruby +# It's possible to define stubbed request outside a test adapter block. +stubs = Faraday::Adapter::Test::Stubs.new do |stub| + stub.get('/tamago') { |env| [200, {}, 'egg'] } +end + +# You can pass stubbed request to the test adapter or define them in a block +# or a combination of the two. +test = Faraday.new do |builder| + builder.adapter :test, stubs do |stub| + stub.get('/ebi') { |env| [ 200, {}, 'shrimp' ]} + end +end + +# It's also possible to stub additional requests after the connection has +# been initialized. This is useful for testing. +stubs.get('/uni') { |env| [ 200, {}, 'urchin' ]} + +resp = test.get '/tamago' +resp.body # => 'egg' +resp = test.get '/ebi' +resp.body # => 'shrimp' +resp = test.get '/uni' +resp.body # => 'urchin' +resp = test.get '/else' #=> raises "no such stub" error + +# If you like, you can treat your stubs as mocks by verifying that all of +# the stubbed calls were made. NOTE that this feature is still fairly +# experimental: It will not verify the order or count of any stub, only that +# it was called once during the course of the test. +stubs.verify_stubbed_calls +``` + +## TODO + +* support streaming requests/responses +* better stubbing API + +## Supported Ruby versions + +This library aims to support and is [tested against][travis] the following Ruby +implementations: + +* Ruby 1.8.7+ +* [JRuby][] 1.7+ +* [Rubinius][] 2+ + +If something doesn't work on one of these Ruby versions, it's a bug. + +This library may inadvertently work (or seem to work) on other Ruby +implementations, however support will only be provided for the versions listed +above. + +If you would like this library to support another Ruby version, you may +volunteer to be a maintainer. Being a maintainer entails making sure all tests +run and pass on that implementation. When something breaks on your +implementation, you will be responsible for providing patches in a timely +fashion. If critical issues for a particular implementation exist at the time +of a major release, support for that Ruby version may be dropped. + +## Copyright + +Copyright (c) 2009-2013 [Rick Olson](mailto:technoweenie@gmail.com), Zack Hobson. +See [LICENSE][] for details. + +[net_http]: http://ruby-doc.org/stdlib/libdoc/net/http/rdoc/Net/HTTP.html +[persistent]: https://github.com/drbrain/net-http-persistent +[travis]: http://travis-ci.org/lostisland/faraday +[excon]: https://github.com/geemus/excon#readme +[typhoeus]: https://github.com/typhoeus/typhoeus#readme +[patron]: http://toland.github.com/patron/ +[eventmachine]: https://github.com/igrigorik/em-http-request#readme +[httpclient]: https://github.com/nahi/httpclient +[jruby]: http://jruby.org/ +[rubinius]: http://rubini.us/ +[license]: LICENSE.md diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday.rb new file mode 100644 index 0000000..38dbf93 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday.rb @@ -0,0 +1,268 @@ +require 'thread' +require 'cgi' +require 'set' +require 'forwardable' + +# Public: This is the main namespace for Faraday. You can either use it to +# create Faraday::Connection objects, or access it directly. +# +# Examples +# +# Faraday.get "http://faraday.com" +# +# conn = Faraday.new "http://faraday.com" +# conn.get '/' +# +module Faraday + VERSION = "0.9.2" + + class << self + # Public: Gets or sets the root path that Faraday is being loaded from. + # This is the root from where the libraries are auto-loaded from. + attr_accessor :root_path + + # Public: Gets or sets the path that the Faraday libs are loaded from. + attr_accessor :lib_path + + # Public: Gets or sets the Symbol key identifying a default Adapter to use + # for the default Faraday::Connection. + attr_reader :default_adapter + + # Public: Sets the default Faraday::Connection for simple scripts that + # access the Faraday constant directly. + # + # Faraday.get "https://faraday.com" + attr_writer :default_connection + + # Public: Sets the default options used when calling Faraday#new. + attr_writer :default_connection_options + + # Public: Initializes a new Faraday::Connection. + # + # url - The optional String base URL to use as a prefix for all + # requests. Can also be the options Hash. + # options - The optional Hash used to configure this Faraday::Connection. + # Any of these values will be set on every request made, unless + # overridden for a specific request. + # :url - String base URL. + # :params - Hash of URI query unencoded key/value pairs. + # :headers - Hash of unencoded HTTP header key/value pairs. + # :request - Hash of request options. + # :ssl - Hash of SSL options. + # :proxy - Hash of Proxy options. + # + # Examples + # + # Faraday.new 'http://faraday.com' + # + # # http://faraday.com?page=1 + # Faraday.new 'http://faraday.com', :params => {:page => 1} + # + # # same + # + # Faraday.new :url => 'http://faraday.com', + # :params => {:page => 1} + # + # Returns a Faraday::Connection. + def new(url = nil, options = nil) + block = block_given? ? Proc.new : nil + options = options ? default_connection_options.merge(options) : default_connection_options.dup + Faraday::Connection.new(url, options, &block) + end + + # Internal: Requires internal Faraday libraries. + # + # *libs - One or more relative String names to Faraday classes. + # + # Returns nothing. + def require_libs(*libs) + libs.each do |lib| + require "#{lib_path}/#{lib}" + end + end + + # Public: Updates default adapter while resetting + # #default_connection. + # + # Returns the new default_adapter. + def default_adapter=(adapter) + @default_connection = nil + @default_adapter = adapter + end + + alias require_lib require_libs + + private + # Internal: Proxies method calls on the Faraday constant to + # #default_connection. + def method_missing(name, *args, &block) + default_connection.send(name, *args, &block) + end + end + + self.root_path = File.expand_path "..", __FILE__ + self.lib_path = File.expand_path "../faraday", __FILE__ + self.default_adapter = :net_http + + # Gets the default connection used for simple scripts. + # + # Returns a Faraday::Connection, configured with the #default_adapter. + def self.default_connection + @default_connection ||= Connection.new + end + + # Gets the default connection options used when calling Faraday#new. + # + # Returns a Faraday::ConnectionOptions. + def self.default_connection_options + @default_connection_options ||= ConnectionOptions.new + end + + if (!defined?(RUBY_ENGINE) || "ruby" == RUBY_ENGINE) && RUBY_VERSION < '1.9' + begin + require 'system_timer' + Timer = SystemTimer + rescue LoadError + warn "Faraday: you may want to install system_timer for reliable timeouts" + end + end + + unless const_defined? :Timer + require 'timeout' + Timer = Timeout + end + + # Public: Adds the ability for other modules to register and lookup + # middleware classes. + module MiddlewareRegistry + # Public: Register middleware class(es) on the current module. + # + # mapping - A Hash mapping Symbol keys to classes. Classes can be expressed + # as fully qualified constant, or a Proc that will be lazily + # called to return the former. + # + # Examples + # + # module Faraday + # class Whatever + # # Middleware looked up by :foo returns Faraday::Whatever::Foo. + # register_middleware :foo => Foo + # + # # Middleware looked up by :bar returns Faraday::Whatever.const_get(:Bar) + # register_middleware :bar => :Bar + # + # # Middleware looked up by :baz requires 'baz' and returns Faraday::Whatever.const_get(:Baz) + # register_middleware :baz => [:Baz, 'baz'] + # end + # end + # + # Returns nothing. + def register_middleware(autoload_path = nil, mapping = nil) + if mapping.nil? + mapping = autoload_path + autoload_path = nil + end + middleware_mutex do + @middleware_autoload_path = autoload_path if autoload_path + (@registered_middleware ||= {}).update(mapping) + end + end + + # Public: Lookup middleware class with a registered Symbol shortcut. + # + # key - The Symbol key for the registered middleware. + # + # Examples + # + # module Faraday + # class Whatever + # register_middleware :foo => Foo + # end + # end + # + # Faraday::Whatever.lookup_middleware(:foo) + # # => Faraday::Whatever::Foo + # + # Returns a middleware Class. + def lookup_middleware(key) + load_middleware(key) || + raise(Faraday::Error.new("#{key.inspect} is not registered on #{self}")) + end + + def middleware_mutex(&block) + @middleware_mutex ||= begin + require 'monitor' + Monitor.new + end + @middleware_mutex.synchronize(&block) + end + + def fetch_middleware(key) + defined?(@registered_middleware) && @registered_middleware[key] + end + + def load_middleware(key) + value = fetch_middleware(key) + case value + when Module + value + when Symbol, String + middleware_mutex do + @registered_middleware[key] = const_get(value) + end + when Proc + middleware_mutex do + @registered_middleware[key] = value.call + end + when Array + middleware_mutex do + const, path = value + if root = @middleware_autoload_path + path = "#{root}/#{path}" + end + require(path) + @registered_middleware[key] = const + end + load_middleware(key) + end + end + end + + def self.const_missing(name) + if name.to_sym == :Builder + warn "Faraday::Builder is now Faraday::RackBuilder." + const_set name, RackBuilder + else + super + end + end + + require_libs "utils", "options", "connection", "rack_builder", "parameters", + "middleware", "adapter", "request", "response", "upload_io", "error" + + if !ENV["FARADAY_NO_AUTOLOAD"] + require_lib 'autoload' + end +end + +# not pulling in active-support JUST for this method. And I love this method. +class Object + # The primary purpose of this method is to "tap into" a method chain, + # in order to perform operations on intermediate results within the chain. + # + # Examples + # + # (1..10).tap { |x| puts "original: #{x.inspect}" }.to_a. + # tap { |x| puts "array: #{x.inspect}" }. + # select { |x| x%2 == 0 }. + # tap { |x| puts "evens: #{x.inspect}" }. + # map { |x| x*x }. + # tap { |x| puts "squares: #{x.inspect}" } + # + # Yields self. + # Returns self. + def tap + yield(self) + self + end unless Object.respond_to?(:tap) +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter.rb new file mode 100644 index 0000000..f018b50 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter.rb @@ -0,0 +1,46 @@ +module Faraday + # Public: This is a base class for all Faraday adapters. Adapters are + # responsible for fulfilling a Faraday request. + class Adapter < Middleware + CONTENT_LENGTH = 'Content-Length'.freeze + + register_middleware File.expand_path('../adapter', __FILE__), + :test => [:Test, 'test'], + :net_http => [:NetHttp, 'net_http'], + :net_http_persistent => [:NetHttpPersistent, 'net_http_persistent'], + :typhoeus => [:Typhoeus, 'typhoeus'], + :patron => [:Patron, 'patron'], + :em_synchrony => [:EMSynchrony, 'em_synchrony'], + :em_http => [:EMHttp, 'em_http'], + :excon => [:Excon, 'excon'], + :rack => [:Rack, 'rack'], + :httpclient => [:HTTPClient, 'httpclient'] + + # Public: This module marks an Adapter as supporting parallel requests. + module Parallelism + attr_writer :supports_parallel + def supports_parallel?() @supports_parallel end + + def inherited(subclass) + super + subclass.supports_parallel = self.supports_parallel? + end + end + + extend Parallelism + self.supports_parallel = false + + def call(env) + env.clear_body if env.needs_body? + end + + def save_response(env, status, body, headers = nil) + env.status = status + env.body = body + env.response_headers = Utils::Headers.new.tap do |response_headers| + response_headers.update headers unless headers.nil? + yield(response_headers) if block_given? + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_http.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_http.rb new file mode 100644 index 0000000..a248fcf --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_http.rb @@ -0,0 +1,237 @@ +module Faraday + class Adapter + # EventMachine adapter is useful for either asynchronous requests + # when in EM reactor loop or for making parallel requests in + # synchronous code. + class EMHttp < Faraday::Adapter + module Options + def connection_config(env) + options = {} + configure_proxy(options, env) + configure_timeout(options, env) + configure_socket(options, env) + configure_ssl(options, env) + options + end + + def request_config(env) + options = { + :body => read_body(env), + :head => env[:request_headers], + # :keepalive => true, + # :file => 'path/to/file', # stream data off disk + } + configure_compression(options, env) + options + end + + def read_body(env) + body = env[:body] + body.respond_to?(:read) ? body.read : body + end + + def configure_proxy(options, env) + if proxy = request_options(env)[:proxy] + options[:proxy] = { + :host => proxy[:uri].host, + :port => proxy[:uri].port, + :authorization => [proxy[:user], proxy[:password]] + } + end + end + + def configure_socket(options, env) + if bind = request_options(env)[:bind] + options[:bind] = { + :host => bind[:host], + :port => bind[:port] + } + end + end + + def configure_ssl(options, env) + if env[:url].scheme == 'https' && env[:ssl] + options[:ssl] = { + :cert_chain_file => env[:ssl][:ca_file], + :verify_peer => env[:ssl].fetch(:verify, true) + } + end + end + + def configure_timeout(options, env) + timeout, open_timeout = request_options(env).values_at(:timeout, :open_timeout) + options[:connect_timeout] = options[:inactivity_timeout] = timeout + options[:connect_timeout] = open_timeout if open_timeout + end + + def configure_compression(options, env) + if env[:method] == :get and not options[:head].key? 'accept-encoding' + options[:head]['accept-encoding'] = 'gzip, compressed' + end + end + + def request_options(env) + env[:request] + end + end + + include Options + + dependency 'em-http' + + self.supports_parallel = true + + def self.setup_parallel_manager(options = nil) + Manager.new + end + + def call(env) + super + perform_request env + @app.call env + end + + def perform_request(env) + if parallel?(env) + manager = env[:parallel_manager] + manager.add { + perform_single_request(env). + callback { env[:response].finish(env) } + } + else + unless EventMachine.reactor_running? + error = nil + # start EM, block until request is completed + EventMachine.run do + perform_single_request(env). + callback { EventMachine.stop }. + errback { |client| + error = error_message(client) + EventMachine.stop + } + end + raise_error(error) if error + else + # EM is running: instruct upstream that this is an async request + env[:parallel_manager] = true + perform_single_request(env). + callback { env[:response].finish(env) }. + errback { + # TODO: no way to communicate the error in async mode + raise NotImplementedError + } + end + end + rescue EventMachine::Connectify::CONNECTError => err + if err.message.include?("Proxy Authentication Required") + raise Error::ConnectionFailed, %{407 "Proxy Authentication Required "} + else + raise Error::ConnectionFailed, err + end + rescue => err + if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err + raise Faraday::SSLError, err + else + raise + end + end + + # TODO: reuse the connection to support pipelining + def perform_single_request(env) + req = EventMachine::HttpRequest.new(env[:url], connection_config(env)) + req.setup_request(env[:method], request_config(env)).callback { |client| + save_response(env, client.response_header.status, client.response) do |resp_headers| + client.response_header.each do |name, value| + resp_headers[name.to_sym] = value + end + end + } + end + + def error_message(client) + client.error or "request failed" + end + + def raise_error(msg) + errklass = Faraday::Error::ClientError + if msg == Errno::ETIMEDOUT + errklass = Faraday::Error::TimeoutError + msg = "request timed out" + elsif msg == Errno::ECONNREFUSED + errklass = Faraday::Error::ConnectionFailed + msg = "connection refused" + elsif msg == "connection closed by server" + errklass = Faraday::Error::ConnectionFailed + end + raise errklass, msg + end + + def parallel?(env) + !!env[:parallel_manager] + end + + # The parallel manager is designed to start an EventMachine loop + # and block until all registered requests have been completed. + class Manager + def initialize + reset + end + + def reset + @registered_procs = [] + @num_registered = 0 + @num_succeeded = 0 + @errors = [] + @running = false + end + + def running?() @running end + + def add + if running? + perform_request { yield } + else + @registered_procs << Proc.new + end + @num_registered += 1 + end + + def run + if @num_registered > 0 + @running = true + EventMachine.run do + @registered_procs.each do |proc| + perform_request(&proc) + end + end + if @errors.size > 0 + raise Faraday::Error::ClientError, @errors.first || "connection failed" + end + end + ensure + reset + end + + def perform_request + client = yield + client.callback { @num_succeeded += 1; check_finished } + client.errback { @errors << client.error; check_finished } + end + + def check_finished + if @num_succeeded + @errors.size == @num_registered + EventMachine.stop + end + end + end + end + end +end + +begin + require 'openssl' +rescue LoadError + warn "Warning: no such file to load -- openssl. Make sure it is installed if you want HTTPS support" +else + require 'faraday/adapter/em_http_ssl_patch' +end if Faraday::Adapter::EMHttp.loaded? diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_http_ssl_patch.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_http_ssl_patch.rb new file mode 100644 index 0000000..8bbfcbc --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_http_ssl_patch.rb @@ -0,0 +1,56 @@ +require 'openssl' +require 'em-http' + +module EmHttpSslPatch + def ssl_verify_peer(cert_string) + cert = nil + begin + cert = OpenSSL::X509::Certificate.new(cert_string) + rescue OpenSSL::X509::CertificateError + return false + end + + @last_seen_cert = cert + + if certificate_store.verify(@last_seen_cert) + begin + certificate_store.add_cert(@last_seen_cert) + rescue OpenSSL::X509::StoreError => e + raise e unless e.message == 'cert already in hash table' + end + true + else + raise OpenSSL::SSL::SSLError.new(%(unable to verify the server certificate for "#{host}")) + end + end + + def ssl_handshake_completed + return true unless verify_peer? + + unless OpenSSL::SSL.verify_certificate_identity(@last_seen_cert, host) + raise OpenSSL::SSL::SSLError.new(%(host "#{host}" does not match the server certificate)) + else + true + end + end + + def verify_peer? + parent.connopts.tls[:verify_peer] + end + + def host + parent.connopts.host + end + + def certificate_store + @certificate_store ||= begin + store = OpenSSL::X509::Store.new + store.set_default_paths + ca_file = parent.connopts.tls[:cert_chain_file] + store.add_file(ca_file) if ca_file + store + end + end +end + +EventMachine::HttpStubConnection.send(:include, EmHttpSslPatch) diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_synchrony.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_synchrony.rb new file mode 100644 index 0000000..cb7ee87 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_synchrony.rb @@ -0,0 +1,100 @@ +require 'uri' + +module Faraday + class Adapter + class EMSynchrony < Faraday::Adapter + include EMHttp::Options + + dependency do + require 'em-synchrony/em-http' + require 'em-synchrony/em-multi' + require 'fiber' + end + + self.supports_parallel = true + + def self.setup_parallel_manager(options = {}) + ParallelManager.new + end + + def call(env) + super + request = EventMachine::HttpRequest.new(Utils::URI(env[:url].to_s), connection_config(env)) + + http_method = env[:method].to_s.downcase.to_sym + + # Queue requests for parallel execution. + if env[:parallel_manager] + env[:parallel_manager].add(request, http_method, request_config(env)) do |resp| + save_response(env, resp.response_header.status, resp.response) do |resp_headers| + resp.response_header.each do |name, value| + resp_headers[name.to_sym] = value + end + end + + # Finalize the response object with values from `env`. + env[:response].finish(env) + end + + # Execute single request. + else + client = nil + block = lambda { request.send(http_method, request_config(env)) } + + if !EM.reactor_running? + EM.run do + Fiber.new { + client = block.call + EM.stop + }.resume + end + else + client = block.call + end + + raise client.error if client.error + + save_response(env, client.response_header.status, client.response) do |resp_headers| + client.response_header.each do |name, value| + resp_headers[name.to_sym] = value + end + end + end + + @app.call env + rescue Errno::ECONNREFUSED + raise Error::ConnectionFailed, $! + rescue EventMachine::Connectify::CONNECTError => err + if err.message.include?("Proxy Authentication Required") + raise Error::ConnectionFailed, %{407 "Proxy Authentication Required "} + else + raise Error::ConnectionFailed, err + end + rescue Errno::ETIMEDOUT => err + raise Error::TimeoutError, err + rescue RuntimeError => err + if err.message == "connection closed by server" + raise Error::ConnectionFailed, err + else + raise + end + rescue => err + if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err + raise Faraday::SSLError, err + else + raise + end + end + end + end +end + +require 'faraday/adapter/em_synchrony/parallel_manager' + +begin + require 'openssl' +rescue LoadError + warn "Warning: no such file to load -- openssl. Make sure it is installed if you want HTTPS support" +else + require 'faraday/adapter/em_http_ssl_patch' +end if Faraday::Adapter::EMSynchrony.loaded? diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_synchrony/parallel_manager.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_synchrony/parallel_manager.rb new file mode 100644 index 0000000..12a1baf --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/em_synchrony/parallel_manager.rb @@ -0,0 +1,66 @@ +module Faraday + class Adapter + class EMSynchrony < Faraday::Adapter + class ParallelManager + + # Add requests to queue. The `request` argument should be a + # `EM::HttpRequest` object. + def add(request, method, *args, &block) + queue << { + :request => request, + :method => method, + :args => args, + :block => block + } + end + + # Run all requests on queue with `EM::Synchrony::Multi`, wrapping + # it in a reactor and fiber if needed. + def run + result = nil + if !EM.reactor_running? + EM.run { + Fiber.new do + result = perform + EM.stop + end.resume + } + else + result = perform + end + result + end + + + private + + # The request queue. + def queue + @queue ||= [] + end + + # Main `EM::Synchrony::Multi` performer. + def perform + multi = ::EM::Synchrony::Multi.new + + queue.each do |item| + method = "a#{item[:method]}".to_sym + + req = item[:request].send(method, *item[:args]) + req.callback(&item[:block]) + + req_name = "req_#{multi.requests.size}".to_sym + multi.add(req_name, req) + end + + # Clear the queue, so parallel manager objects can be reused. + @queue = [] + + # Block fiber until all requests have returned. + multi.perform + end + + end # ParallelManager + end # EMSynchrony + end # Adapter +end # Faraday diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/excon.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/excon.rb new file mode 100644 index 0000000..2fab2e6 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/excon.rb @@ -0,0 +1,81 @@ +module Faraday + class Adapter + class Excon < Faraday::Adapter + dependency 'excon' + + def initialize(app, connection_options = {}) + @connection_options = connection_options + super(app) + end + + def call(env) + super + + opts = {} + if env[:url].scheme == 'https' && ssl = env[:ssl] + opts[:ssl_verify_peer] = !!ssl.fetch(:verify, true) + opts[:ssl_ca_path] = ssl[:ca_path] if ssl[:ca_path] + opts[:ssl_ca_file] = ssl[:ca_file] if ssl[:ca_file] + opts[:client_cert] = ssl[:client_cert] if ssl[:client_cert] + opts[:client_key] = ssl[:client_key] if ssl[:client_key] + opts[:certificate] = ssl[:certificate] if ssl[:certificate] + opts[:private_key] = ssl[:private_key] if ssl[:private_key] + + # https://github.com/geemus/excon/issues/106 + # https://github.com/jruby/jruby-ossl/issues/19 + opts[:nonblock] = false + end + + if ( req = env[:request] ) + if req[:timeout] + opts[:read_timeout] = req[:timeout] + opts[:connect_timeout] = req[:timeout] + opts[:write_timeout] = req[:timeout] + end + + if req[:open_timeout] + opts[:connect_timeout] = req[:open_timeout] + opts[:write_timeout] = req[:open_timeout] + end + + if req[:proxy] + opts[:proxy] = { + :host => req[:proxy][:uri].host, + :hostname => req[:proxy][:uri].hostname, + :port => req[:proxy][:uri].port, + :scheme => req[:proxy][:uri].scheme, + :user => req[:proxy][:user], + :password => req[:proxy][:password] + } + end + end + + conn = ::Excon.new(env[:url].to_s, opts.merge(@connection_options)) + + resp = conn.request \ + :method => env[:method].to_s.upcase, + :headers => env[:request_headers], + :body => read_body(env) + + save_response(env, resp.status.to_i, resp.body, resp.headers) + + @app.call env + rescue ::Excon::Errors::SocketError => err + if err.message =~ /\btimeout\b/ + raise Error::TimeoutError, err + elsif err.message =~ /\bcertificate\b/ + raise Faraday::SSLError, err + else + raise Error::ConnectionFailed, err + end + rescue ::Excon::Errors::Timeout => err + raise Error::TimeoutError, err + end + + # TODO: support streaming requests + def read_body(env) + env[:body].respond_to?(:read) ? env[:body].read : env[:body] + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/httpclient.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/httpclient.rb new file mode 100644 index 0000000..4839257 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/httpclient.rb @@ -0,0 +1,117 @@ +module Faraday + class Adapter + class HTTPClient < Faraday::Adapter + dependency 'httpclient' + + def client + @client ||= ::HTTPClient.new + end + + def call(env) + super + + # enable compression + client.transparent_gzip_decompression = true + + if req = env[:request] + if proxy = req[:proxy] + configure_proxy proxy + end + + if bind = req[:bind] + configure_socket bind + end + + configure_timeouts req + end + + if env[:url].scheme == 'https' && ssl = env[:ssl] + configure_ssl ssl + end + + # TODO Don't stream yet. + # https://github.com/nahi/httpclient/pull/90 + env[:body] = env[:body].read if env[:body].respond_to? :read + + resp = client.request env[:method], env[:url], + :body => env[:body], + :header => env[:request_headers] + + save_response env, resp.status, resp.body, resp.headers + + @app.call env + rescue ::HTTPClient::TimeoutError, Errno::ETIMEDOUT + raise Faraday::Error::TimeoutError, $! + rescue ::HTTPClient::BadResponseError => err + if err.message.include?('status 407') + raise Faraday::Error::ConnectionFailed, %{407 "Proxy Authentication Required "} + else + raise Faraday::Error::ClientError, $! + end + rescue Errno::ECONNREFUSED, EOFError + raise Faraday::Error::ConnectionFailed, $! + rescue => err + if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err + raise Faraday::SSLError, err + else + raise + end + end + + def configure_socket(bind) + client.socket_local.host = bind[:host] + client.socket_local.port = bind[:port] + end + + def configure_proxy(proxy) + client.proxy = proxy[:uri] + if proxy[:user] && proxy[:password] + client.set_proxy_auth proxy[:user], proxy[:password] + end + end + + def configure_ssl(ssl) + ssl_config = client.ssl_config + ssl_config.verify_mode = ssl_verify_mode(ssl) + ssl_config.cert_store = ssl_cert_store(ssl) + + ssl_config.add_trust_ca ssl[:ca_file] if ssl[:ca_file] + ssl_config.add_trust_ca ssl[:ca_path] if ssl[:ca_path] + ssl_config.client_cert = ssl[:client_cert] if ssl[:client_cert] + ssl_config.client_key = ssl[:client_key] if ssl[:client_key] + ssl_config.verify_depth = ssl[:verify_depth] if ssl[:verify_depth] + end + + def configure_timeouts(req) + if req[:timeout] + client.connect_timeout = req[:timeout] + client.receive_timeout = req[:timeout] + client.send_timeout = req[:timeout] + end + + if req[:open_timeout] + client.connect_timeout = req[:open_timeout] + client.send_timeout = req[:open_timeout] + end + end + + def ssl_cert_store(ssl) + return ssl[:cert_store] if ssl[:cert_store] + # Use the default cert store by default, i.e. system ca certs + cert_store = OpenSSL::X509::Store.new + cert_store.set_default_paths + cert_store + end + + def ssl_verify_mode(ssl) + ssl[:verify_mode] || begin + if ssl.fetch(:verify, true) + OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT + else + OpenSSL::SSL::VERIFY_NONE + end + end + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/net_http.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/net_http.rb new file mode 100644 index 0000000..ad59ddd --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/net_http.rb @@ -0,0 +1,130 @@ +begin + require 'net/https' +rescue LoadError + warn "Warning: no such file to load -- net/https. Make sure openssl is installed if you want ssl support" + require 'net/http' +end +require 'zlib' + +module Faraday + class Adapter + class NetHttp < Faraday::Adapter + NET_HTTP_EXCEPTIONS = [ + EOFError, + Errno::ECONNABORTED, + Errno::ECONNREFUSED, + Errno::ECONNRESET, + Errno::EHOSTUNREACH, + Errno::EINVAL, + Errno::ENETUNREACH, + Net::HTTPBadResponse, + Net::HTTPHeaderSyntaxError, + Net::ProtocolError, + SocketError, + Zlib::GzipFile::Error, + ] + + NET_HTTP_EXCEPTIONS << OpenSSL::SSL::SSLError if defined?(OpenSSL) + NET_HTTP_EXCEPTIONS << Net::OpenTimeout if defined?(Net::OpenTimeout) + + def call(env) + super + with_net_http_connection(env) do |http| + configure_ssl(http, env[:ssl]) if env[:url].scheme == 'https' and env[:ssl] + + req = env[:request] + http.read_timeout = http.open_timeout = req[:timeout] if req[:timeout] + http.open_timeout = req[:open_timeout] if req[:open_timeout] + + begin + http_response = perform_request(http, env) + rescue *NET_HTTP_EXCEPTIONS => err + if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err + raise Faraday::SSLError, err + else + raise Error::ConnectionFailed, err + end + end + + save_response(env, http_response.code.to_i, http_response.body || '') do |response_headers| + http_response.each_header do |key, value| + response_headers[key] = value + end + end + end + + @app.call env + rescue Timeout::Error, Errno::ETIMEDOUT => err + raise Faraday::Error::TimeoutError, err + end + + def create_request(env) + request = Net::HTTPGenericRequest.new \ + env[:method].to_s.upcase, # request method + !!env[:body], # is there request body + :head != env[:method], # is there response body + env[:url].request_uri, # request uri path + env[:request_headers] # request headers + + if env[:body].respond_to?(:read) + request.body_stream = env[:body] + else + request.body = env[:body] + end + request + end + + def perform_request(http, env) + if :get == env[:method] and !env[:body] + # prefer `get` to `request` because the former handles gzip (ruby 1.9) + http.get env[:url].request_uri, env[:request_headers] + else + http.request create_request(env) + end + end + + def with_net_http_connection(env) + yield net_http_connection(env) + end + + def net_http_connection(env) + if proxy = env[:request][:proxy] + Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:user], proxy[:password]) + else + Net::HTTP + end.new(env[:url].host, env[:url].port || (env[:url].scheme == 'https' ? 443 : 80)) + end + + def configure_ssl(http, ssl) + http.use_ssl = true + http.verify_mode = ssl_verify_mode(ssl) + http.cert_store = ssl_cert_store(ssl) + + http.cert = ssl[:client_cert] if ssl[:client_cert] + http.key = ssl[:client_key] if ssl[:client_key] + http.ca_file = ssl[:ca_file] if ssl[:ca_file] + http.ca_path = ssl[:ca_path] if ssl[:ca_path] + http.verify_depth = ssl[:verify_depth] if ssl[:verify_depth] + http.ssl_version = ssl[:version] if ssl[:version] + end + + def ssl_cert_store(ssl) + return ssl[:cert_store] if ssl[:cert_store] + # Use the default cert store by default, i.e. system ca certs + cert_store = OpenSSL::X509::Store.new + cert_store.set_default_paths + cert_store + end + + def ssl_verify_mode(ssl) + ssl[:verify_mode] || begin + if ssl.fetch(:verify, true) + OpenSSL::SSL::VERIFY_PEER + else + OpenSSL::SSL::VERIFY_NONE + end + end + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/net_http_persistent.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/net_http_persistent.rb new file mode 100644 index 0000000..d285e93 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/net_http_persistent.rb @@ -0,0 +1,49 @@ +# Rely on autoloading instead of explicit require; helps avoid the "already +# initialized constant" warning on Ruby 1.8.7 when NetHttp is refereced below. +# require 'faraday/adapter/net_http' + +module Faraday + class Adapter + class NetHttpPersistent < NetHttp + dependency 'net/http/persistent' + + def with_net_http_connection(env) + if proxy = env[:request][:proxy] + proxy_uri = ::URI::HTTP === proxy[:uri] ? proxy[:uri].dup : ::URI.parse(proxy[:uri].to_s) + proxy_uri.user = proxy_uri.password = nil + # awful patch for net-http-persistent 2.8 not unescaping user/password + (class << proxy_uri; self; end).class_eval do + define_method(:user) { proxy[:user] } + define_method(:password) { proxy[:password] } + end if proxy[:user] + end + + yield Net::HTTP::Persistent.new 'Faraday', proxy_uri + end + + def perform_request(http, env) + http.request env[:url], create_request(env) + rescue Errno::ETIMEDOUT => error + raise Faraday::Error::TimeoutError, error + rescue Net::HTTP::Persistent::Error => error + if error.message.include? 'Timeout' + raise Faraday::Error::TimeoutError, error + elsif error.message.include? 'connection refused' + raise Faraday::Error::ConnectionFailed, error + else + raise + end + end + + def configure_ssl(http, ssl) + http.verify_mode = ssl_verify_mode(ssl) + http.cert_store = ssl_cert_store(ssl) + + http.certificate = ssl[:client_cert] if ssl[:client_cert] + http.private_key = ssl[:client_key] if ssl[:client_key] + http.ca_file = ssl[:ca_file] if ssl[:ca_file] + http.ssl_version = ssl[:version] if ssl[:version] + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/patron.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/patron.rb new file mode 100644 index 0000000..a43c57d --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/patron.rb @@ -0,0 +1,78 @@ +module Faraday + class Adapter + class Patron < Faraday::Adapter + dependency 'patron' + + def initialize(app, &block) + super(app) + @block = block + end + + def call(env) + super + + # TODO: support streaming requests + env[:body] = env[:body].read if env[:body].respond_to? :read + + session = @session ||= create_session + + if req = env[:request] + session.timeout = session.connect_timeout = req[:timeout] if req[:timeout] + session.connect_timeout = req[:open_timeout] if req[:open_timeout] + + if proxy = req[:proxy] + proxy_uri = proxy[:uri].dup + proxy_uri.user = proxy[:user] && Utils.escape(proxy[:user]).gsub('+', '%20') + proxy_uri.password = proxy[:password] && Utils.escape(proxy[:password]).gsub('+', '%20') + session.proxy = proxy_uri.to_s + end + end + + response = begin + data = env[:body] ? env[:body].to_s : nil + session.request(env[:method], env[:url].to_s, env[:request_headers], :data => data) + rescue Errno::ECONNREFUSED, ::Patron::ConnectionFailed + raise Error::ConnectionFailed, $! + end + + save_response(env, response.status, response.body, response.headers) + + @app.call env + rescue ::Patron::TimeoutError => err + if err.message == "Connection time-out" + raise Faraday::Error::ConnectionFailed, err + else + raise Faraday::Error::TimeoutError, err + end + rescue ::Patron::Error => err + if err.message.include?("code 407") + raise Error::ConnectionFailed, %{407 "Proxy Authentication Required "} + else + raise Error::ConnectionFailed, err + end + end + + if loaded? && defined?(::Patron::Request::VALID_ACTIONS) + # HAX: helps but doesn't work completely + # https://github.com/toland/patron/issues/34 + ::Patron::Request::VALID_ACTIONS.tap do |actions| + if actions[0].is_a?(Symbol) + actions << :patch unless actions.include? :patch + actions << :options unless actions.include? :options + else + # Patron 0.4.20 and up + actions << "PATCH" unless actions.include? "PATCH" + actions << "OPTIONS" unless actions.include? "OPTIONS" + end + end + end + + def create_session + session = ::Patron::Session.new + session.insecure = true + @block.call(session) if @block + session + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/rack.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/rack.rb new file mode 100644 index 0000000..0d21464 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/rack.rb @@ -0,0 +1,58 @@ +module Faraday + class Adapter + # Sends requests to a Rack app. + # + # Examples + # + # class MyRackApp + # def call(env) + # [200, {'Content-Type' => 'text/html'}, ["hello world"]] + # end + # end + # + # Faraday.new do |conn| + # conn.adapter :rack, MyRackApp.new + # end + class Rack < Faraday::Adapter + dependency 'rack/test' + + # not prefixed with "HTTP_" + SPECIAL_HEADERS = %w[ CONTENT_LENGTH CONTENT_TYPE ] + + def initialize(faraday_app, rack_app) + super(faraday_app) + mock_session = ::Rack::MockSession.new(rack_app) + @session = ::Rack::Test::Session.new(mock_session) + end + + def call(env) + super + rack_env = { + :method => env[:method], + :input => env[:body].respond_to?(:read) ? env[:body].read : env[:body], + 'rack.url_scheme' => env[:url].scheme + } + + env[:request_headers].each do |name, value| + name = name.upcase.tr('-', '_') + name = "HTTP_#{name}" unless SPECIAL_HEADERS.include? name + rack_env[name] = value + end if env[:request_headers] + + timeout = env[:request][:timeout] || env[:request][:open_timeout] + response = if timeout + Timer.timeout(timeout, Faraday::Error::TimeoutError) { execute_request(env, rack_env) } + else + execute_request(env, rack_env) + end + + save_response(env, response.status, response.body, response.headers) + @app.call env + end + + def execute_request(env, rack_env) + @session.request(env[:url].to_s, rack_env) + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/test.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/test.rb new file mode 100644 index 0000000..9a34575 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/test.rb @@ -0,0 +1,162 @@ +module Faraday + class Adapter + # test = Faraday::Connection.new do + # use Faraday::Adapter::Test do |stub| + # stub.get '/nigiri/sake.json' do + # [200, {}, 'hi world'] + # end + # end + # end + # + # resp = test.get '/nigiri/sake.json' + # resp.body # => 'hi world' + # + class Test < Faraday::Adapter + attr_accessor :stubs + + class Stubs + class NotFound < StandardError + end + + def initialize + # {:get => [Stub, Stub]} + @stack, @consumed = {}, {} + yield(self) if block_given? + end + + def empty? + @stack.empty? + end + + def match(request_method, path, headers, body) + return false if !@stack.key?(request_method) + stack = @stack[request_method] + consumed = (@consumed[request_method] ||= []) + + if stub = matches?(stack, path, headers, body) + consumed << stack.delete(stub) + stub + else + matches?(consumed, path, headers, body) + end + end + + def get(path, headers = {}, &block) + new_stub(:get, path, headers, &block) + end + + def head(path, headers = {}, &block) + new_stub(:head, path, headers, &block) + end + + def post(path, body=nil, headers = {}, &block) + new_stub(:post, path, headers, body, &block) + end + + def put(path, body=nil, headers = {}, &block) + new_stub(:put, path, headers, body, &block) + end + + def patch(path, body=nil, headers = {}, &block) + new_stub(:patch, path, headers, body, &block) + end + + def delete(path, headers = {}, &block) + new_stub(:delete, path, headers, &block) + end + + def options(path, headers = {}, &block) + new_stub(:options, path, headers, &block) + end + + # Raises an error if any of the stubbed calls have not been made. + def verify_stubbed_calls + failed_stubs = [] + @stack.each do |method, stubs| + unless stubs.size == 0 + failed_stubs.concat(stubs.map {|stub| + "Expected #{method} #{stub}." + }) + end + end + raise failed_stubs.join(" ") unless failed_stubs.size == 0 + end + + protected + + def new_stub(request_method, path, headers = {}, body=nil, &block) + normalized_path = Faraday::Utils.normalize_path(path) + (@stack[request_method] ||= []) << Stub.new(normalized_path, headers, body, block) + end + + def matches?(stack, path, headers, body) + stack.detect { |stub| stub.matches?(path, headers, body) } + end + end + + class Stub < Struct.new(:path, :params, :headers, :body, :block) + def initialize(full, headers, body, block) + path, query = full.split('?') + params = query ? + Faraday::Utils.parse_nested_query(query) : + {} + super(path, params, headers, body, block) + end + + def matches?(request_uri, request_headers, request_body) + request_path, request_query = request_uri.split('?') + request_params = request_query ? + Faraday::Utils.parse_nested_query(request_query) : + {} + request_path == path && + params_match?(request_params) && + (body.to_s.size.zero? || request_body == body) && + headers_match?(request_headers) + end + + def params_match?(request_params) + params.keys.all? do |key| + request_params[key] == params[key] + end + end + + def headers_match?(request_headers) + headers.keys.all? do |key| + request_headers[key] == headers[key] + end + end + + def to_s + "#{path} #{body}" + end + end + + def initialize(app, stubs=nil, &block) + super(app) + @stubs = stubs || Stubs.new + configure(&block) if block + end + + def configure + yield(stubs) + end + + def call(env) + super + normalized_path = Faraday::Utils.normalize_path(env[:url]) + params_encoder = env.request.params_encoder || Faraday::Utils.default_params_encoder + + if stub = stubs.match(env[:method], normalized_path, env.request_headers, env[:body]) + env[:params] = (query = env[:url].query) ? + params_encoder.decode(query) : + {} + status, headers, body = stub.block.call(env) + save_response(env, status, body, headers) + else + raise Stubs::NotFound, "no stubbed request for #{env[:method]} #{normalized_path} #{env[:body]}" + end + @app.call(env) + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/typhoeus.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/typhoeus.rb new file mode 100644 index 0000000..69b6a51 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/adapter/typhoeus.rb @@ -0,0 +1,123 @@ +module Faraday + class Adapter + class Typhoeus < Faraday::Adapter + self.supports_parallel = true + + def self.setup_parallel_manager(options = {}) + options.empty? ? ::Typhoeus::Hydra.hydra : ::Typhoeus::Hydra.new(options) + end + + dependency 'typhoeus' + + def call(env) + super + perform_request env + @app.call env + end + + def perform_request(env) + read_body env + + hydra = env[:parallel_manager] || self.class.setup_parallel_manager + hydra.queue request(env) + hydra.run unless parallel?(env) + rescue Errno::ECONNREFUSED + raise Error::ConnectionFailed, $! + end + + # TODO: support streaming requests + def read_body(env) + env[:body] = env[:body].read if env[:body].respond_to? :read + end + + def request(env) + method = env[:method] + # For some reason, prevents Typhoeus from using "100-continue". + # We want this because Webrick 1.3.1 can't seem to handle it w/ PUT. + method = method.to_s.upcase if method == :put + + req = ::Typhoeus::Request.new env[:url].to_s, + :method => method, + :body => env[:body], + :headers => env[:request_headers], + :disable_ssl_peer_verification => (env[:ssl] && env[:ssl].disable?) + + configure_ssl req, env + configure_proxy req, env + configure_timeout req, env + configure_socket req, env + + req.on_complete do |resp| + if resp.timed_out? + if parallel?(env) + # TODO: error callback in async mode + else + raise Faraday::Error::TimeoutError, "request timed out" + end + end + + case resp.curl_return_code + when 0 + # everything OK + when 7 + raise Error::ConnectionFailed, resp.curl_error_message + when 60 + raise Faraday::SSLError, resp.curl_error_message + else + raise Error::ClientError, resp.curl_error_message + end + + save_response(env, resp.code, resp.body) do |response_headers| + response_headers.parse resp.headers + end + # in async mode, :response is initialized at this point + env[:response].finish(env) if parallel?(env) + end + + req + end + + def configure_ssl(req, env) + ssl = env[:ssl] + + req.ssl_version = ssl[:version] if ssl[:version] + req.ssl_cert = ssl[:client_cert] if ssl[:client_cert] + req.ssl_key = ssl[:client_key] if ssl[:client_key] + req.ssl_cacert = ssl[:ca_file] if ssl[:ca_file] + req.ssl_capath = ssl[:ca_path] if ssl[:ca_path] + end + + def configure_proxy(req, env) + proxy = request_options(env)[:proxy] + return unless proxy + + req.proxy = "#{proxy[:uri].host}:#{proxy[:uri].port}" + + if proxy[:user] && proxy[:password] + req.proxy_username = proxy[:user] + req.proxy_password = proxy[:password] + end + end + + def configure_timeout(req, env) + env_req = request_options(env) + req.timeout = req.connect_timeout = (env_req[:timeout] * 1000) if env_req[:timeout] + req.connect_timeout = (env_req[:open_timeout] * 1000) if env_req[:open_timeout] + end + + def configure_socket(req, env) + if bind = request_options(env)[:bind] + req.interface = bind[:host] + end + end + + def request_options(env) + env[:request] + end + + def parallel?(env) + !!env[:parallel_manager] + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/autoload.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/autoload.rb new file mode 100644 index 0000000..cd390cc --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/autoload.rb @@ -0,0 +1,84 @@ +module Faraday + # Internal: Adds the ability for other modules to manage autoloadable + # constants. + module AutoloadHelper + # Internal: Registers the constants to be auto loaded. + # + # prefix - The String require prefix. If the path is inside Faraday, then + # it will be prefixed with the root path of this loaded Faraday + # version. + # options - Hash of Symbol => String library names. + # + # Examples. + # + # Faraday.autoload_all 'faraday/foo', + # :Bar => 'bar' + # + # # requires faraday/foo/bar to load Faraday::Bar. + # Faraday::Bar + # + # + # Returns nothing. + def autoload_all(prefix, options) + if prefix =~ /^faraday(\/|$)/i + prefix = File.join(Faraday.root_path, prefix) + end + options.each do |const_name, path| + autoload const_name, File.join(prefix, path) + end + end + + # Internal: Loads each autoloaded constant. If thread safety is a concern, + # wrap this in a Mutex. + # + # Returns nothing. + def load_autoloaded_constants + constants.each do |const| + const_get(const) if autoload?(const) + end + end + + # Internal: Filters the module's contents with those that have been already + # autoloaded. + # + # Returns an Array of Class/Module objects. + def all_loaded_constants + constants.map { |c| const_get(c) }. + select { |a| a.respond_to?(:loaded?) && a.loaded? } + end + end + + class Adapter + extend AutoloadHelper + autoload_all 'faraday/adapter', + :NetHttp => 'net_http', + :NetHttpPersistent => 'net_http_persistent', + :Typhoeus => 'typhoeus', + :EMSynchrony => 'em_synchrony', + :EMHttp => 'em_http', + :Patron => 'patron', + :Excon => 'excon', + :Test => 'test', + :Rack => 'rack', + :HTTPClient => 'httpclient' + end + + class Request + extend AutoloadHelper + autoload_all 'faraday/request', + :UrlEncoded => 'url_encoded', + :Multipart => 'multipart', + :Retry => 'retry', + :Authorization => 'authorization', + :BasicAuthentication => 'basic_authentication', + :TokenAuthentication => 'token_authentication', + :Instrumentation => 'instrumentation' + end + + class Response + extend AutoloadHelper + autoload_all 'faraday/response', + :RaiseError => 'raise_error', + :Logger => 'logger' + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/connection.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/connection.rb new file mode 100644 index 0000000..241e919 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/connection.rb @@ -0,0 +1,437 @@ +module Faraday + # Public: Connection objects manage the default properties and the middleware + # stack for fulfilling an HTTP request. + # + # Examples + # + # conn = Faraday::Connection.new 'http://sushi.com' + # + # # GET http://sushi.com/nigiri + # conn.get 'nigiri' + # # => # + # + class Connection + # A Set of allowed HTTP verbs. + METHODS = Set.new [:get, :post, :put, :delete, :head, :patch, :options] + + # Public: Returns a Hash of URI query unencoded key/value pairs. + attr_reader :params + + # Public: Returns a Hash of unencoded HTTP header key/value pairs. + attr_reader :headers + + # Public: Returns a URI with the prefix used for all requests from this + # Connection. This includes a default host name, scheme, port, and path. + attr_reader :url_prefix + + # Public: Returns the Faraday::Builder for this Connection. + attr_reader :builder + + # Public: Returns a Hash of the request options. + attr_reader :options + + # Public: Returns a Hash of the SSL options. + attr_reader :ssl + + # Public: Returns the parallel manager for this Connection. + attr_reader :parallel_manager + + # Public: Sets the default parallel manager for this connection. + attr_writer :default_parallel_manager + + # Public: Initializes a new Faraday::Connection. + # + # url - URI or String base URL to use as a prefix for all + # requests (optional). + # options - Hash or Faraday::ConnectionOptions. + # :url - URI or String base URL (default: "http:/"). + # :params - Hash of URI query unencoded key/value pairs. + # :headers - Hash of unencoded HTTP header key/value pairs. + # :request - Hash of request options. + # :ssl - Hash of SSL options. + # :proxy - URI, String or Hash of HTTP proxy options + # (default: "http_proxy" environment variable). + # :uri - URI or String + # :user - String (optional) + # :password - String (optional) + def initialize(url = nil, options = nil) + if url.is_a?(Hash) + options = ConnectionOptions.from(url) + url = options.url + else + options = ConnectionOptions.from(options) + end + + @parallel_manager = nil + @headers = Utils::Headers.new + @params = Utils::ParamsHash.new + @options = options.request + @ssl = options.ssl + @default_parallel_manager = options.parallel_manager + + @builder = options.builder || begin + # pass an empty block to Builder so it doesn't assume default middleware + options.new_builder(block_given? ? Proc.new { |b| } : nil) + end + + self.url_prefix = url || 'http:/' + + @params.update(options.params) if options.params + @headers.update(options.headers) if options.headers + + @proxy = nil + proxy(options.fetch(:proxy) { + uri = ENV['http_proxy'] + if uri && !uri.empty? + uri = 'http://' + uri if uri !~ /^http/i + uri + end + }) + + yield(self) if block_given? + + @headers[:user_agent] ||= "Faraday v#{VERSION}" + end + + # Public: Sets the Hash of URI query unencoded key/value pairs. + def params=(hash) + @params.replace hash + end + + # Public: Sets the Hash of unencoded HTTP header key/value pairs. + def headers=(hash) + @headers.replace hash + end + + extend Forwardable + + def_delegators :builder, :build, :use, :request, :response, :adapter, :app + + # Public: Makes an HTTP request without a body. + # + # url - The optional String base URL to use as a prefix for all + # requests. Can also be the options Hash. + # params - Hash of URI query unencoded key/value pairs. + # headers - Hash of unencoded HTTP header key/value pairs. + # + # Examples + # + # conn.get '/items', {:page => 1}, :accept => 'application/json' + # conn.head '/items/1' + # + # # ElasticSearch example sending a body with GET. + # conn.get '/twitter/tweet/_search' do |req| + # req.headers[:content_type] = 'application/json' + # req.params[:routing] = 'kimchy' + # req.body = JSON.generate(:query => {...}) + # end + # + # Yields a Faraday::Response for further request customizations. + # Returns a Faraday::Response. + # + # Signature + # + # (url = nil, params = nil, headers = nil) + # + # verb - An HTTP verb: get, head, or delete. + %w[get head delete].each do |method| + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{method}(url = nil, params = nil, headers = nil) + run_request(:#{method}, url, nil, headers) { |request| + request.params.update(params) if params + yield(request) if block_given? + } + end + RUBY + end + + # Public: Makes an HTTP request with a body. + # + # url - The optional String base URL to use as a prefix for all + # requests. Can also be the options Hash. + # body - The String body for the request. + # headers - Hash of unencoded HTTP header key/value pairs. + # + # Examples + # + # conn.post '/items', data, :content_type => 'application/json' + # + # # Simple ElasticSearch indexing sample. + # conn.post '/twitter/tweet' do |req| + # req.headers[:content_type] = 'application/json' + # req.params[:routing] = 'kimchy' + # req.body = JSON.generate(:user => 'kimchy', ...) + # end + # + # Yields a Faraday::Response for further request customizations. + # Returns a Faraday::Response. + # + # Signature + # + # (url = nil, body = nil, headers = nil) + # + # verb - An HTTP verb: post, put, or patch. + %w[post put patch].each do |method| + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{method}(url = nil, body = nil, headers = nil, &block) + run_request(:#{method}, url, body, headers, &block) + end + RUBY + end + + # Public: Sets up the Authorization header with these credentials, encoded + # with base64. + # + # login - The authentication login. + # pass - The authentication password. + # + # Examples + # + # conn.basic_auth 'Aladdin', 'open sesame' + # conn.headers['Authorization'] + # # => "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" + # + # Returns nothing. + def basic_auth(login, pass) + set_authorization_header(:basic_auth, login, pass) + end + + # Public: Sets up the Authorization header with the given token. + # + # token - The String token. + # options - Optional Hash of extra token options. + # + # Examples + # + # conn.token_auth 'abcdef', :foo => 'bar' + # conn.headers['Authorization'] + # # => "Token token=\"abcdef\", + # foo=\"bar\"" + # + # Returns nothing. + def token_auth(token, options = nil) + set_authorization_header(:token_auth, token, options) + end + + # Public: Sets up a custom Authorization header. + # + # type - The String authorization type. + # token - The String or Hash token. A String value is taken literally, and + # a Hash is encoded into comma separated key/value pairs. + # + # Examples + # + # conn.authorization :Bearer, 'mF_9.B5f-4.1JqM' + # conn.headers['Authorization'] + # # => "Bearer mF_9.B5f-4.1JqM" + # + # conn.authorization :Token, :token => 'abcdef', :foo => 'bar' + # conn.headers['Authorization'] + # # => "Token token=\"abcdef\", + # foo=\"bar\"" + # + # Returns nothing. + def authorization(type, token) + set_authorization_header(:authorization, type, token) + end + + # Internal: Traverse the middleware stack in search of a + # parallel-capable adapter. + # + # Yields in case of not found. + # + # Returns a parallel manager or nil if not found. + def default_parallel_manager + @default_parallel_manager ||= begin + handler = @builder.handlers.detect do |h| + h.klass.respond_to?(:supports_parallel?) and h.klass.supports_parallel? + end + + if handler + handler.klass.setup_parallel_manager + elsif block_given? + yield + end + end + end + + # Public: Determine if this Faraday::Connection can make parallel requests. + # + # Returns true or false. + def in_parallel? + !!@parallel_manager + end + + # Public: Sets up the parallel manager to make a set of requests. + # + # manager - The parallel manager that this Connection's Adapter uses. + # + # Yields a block to execute multiple requests. + # Returns nothing. + def in_parallel(manager = nil) + @parallel_manager = manager || default_parallel_manager { + warn "Warning: `in_parallel` called but no parallel-capable adapter on Faraday stack" + warn caller[2,10].join("\n") + nil + } + yield + @parallel_manager && @parallel_manager.run + ensure + @parallel_manager = nil + end + + # Public: Gets or Sets the Hash proxy options. + def proxy(arg = nil) + return @proxy if arg.nil? + @proxy = ProxyOptions.from(arg) + end + + def_delegators :url_prefix, :scheme, :scheme=, :host, :host=, :port, :port= + def_delegator :url_prefix, :path, :path_prefix + + # Public: Parses the giving url with URI and stores the individual + # components in this connection. These components serve as defaults for + # requests made by this connection. + # + # url - A String or URI. + # + # Examples + # + # conn = Faraday::Connection.new { ... } + # conn.url_prefix = "https://sushi.com/api" + # conn.scheme # => https + # conn.path_prefix # => "/api" + # + # conn.get("nigiri?page=2") # accesses https://sushi.com/api/nigiri + # + # Returns the parsed URI from teh given input.. + def url_prefix=(url, encoder = nil) + uri = @url_prefix = Utils.URI(url) + self.path_prefix = uri.path + + params.merge_query(uri.query, encoder) + uri.query = nil + + with_uri_credentials(uri) do |user, password| + basic_auth user, password + uri.user = uri.password = nil + end + + uri + end + + # Public: Sets the path prefix and ensures that it always has a leading + # slash. + # + # value - A String. + # + # Returns the new String path prefix. + def path_prefix=(value) + url_prefix.path = if value + value = '/' + value unless value[0,1] == '/' + value + end + end + + # Public: Takes a relative url for a request and combines it with the defaults + # set on the connection instance. + # + # conn = Faraday::Connection.new { ... } + # conn.url_prefix = "https://sushi.com/api?token=abc" + # conn.scheme # => https + # conn.path_prefix # => "/api" + # + # conn.build_url("nigiri?page=2") # => https://sushi.com/api/nigiri?token=abc&page=2 + # conn.build_url("nigiri", :page => 2) # => https://sushi.com/api/nigiri?token=abc&page=2 + # + def build_url(url = nil, extra_params = nil) + uri = build_exclusive_url(url) + + query_values = params.dup.merge_query(uri.query, options.params_encoder) + query_values.update extra_params if extra_params + uri.query = query_values.empty? ? nil : query_values.to_query(options.params_encoder) + + uri + end + + # Builds and runs the Faraday::Request. + # + # method - The Symbol HTTP method. + # url - The String or URI to access. + # body - The String body + # headers - Hash of unencoded HTTP header key/value pairs. + # + # Returns a Faraday::Response. + def run_request(method, url, body, headers) + if !METHODS.include?(method) + raise ArgumentError, "unknown http method: #{method}" + end + + request = build_request(method) do |req| + req.url(url) if url + req.headers.update(headers) if headers + req.body = body if body + yield(req) if block_given? + end + + builder.build_response(self, request) + end + + # Creates and configures the request object. + # + # Returns the new Request. + def build_request(method) + Request.create(method) do |req| + req.params = self.params.dup + req.headers = self.headers.dup + req.options = self.options.merge(:proxy => self.proxy) + yield(req) if block_given? + end + end + + # Internal: Build an absolute URL based on url_prefix. + # + # url - A String or URI-like object + # params - A Faraday::Utils::ParamsHash to replace the query values + # of the resulting url (default: nil). + # + # Returns the resulting URI instance. + def build_exclusive_url(url = nil, params = nil, params_encoder = nil) + url = nil if url.respond_to?(:empty?) and url.empty? + base = url_prefix + if url and base.path and base.path !~ /\/$/ + base = base.dup + base.path = base.path + '/' # ensure trailing slash + end + uri = url ? base + url : base + uri.query = params.to_query(params_encoder || options.params_encoder) if params + uri.query = nil if uri.query and uri.query.empty? + uri + end + + # Internal: Creates a duplicate of this Faraday::Connection. + # + # Returns a Faraday::Connection. + def dup + self.class.new(build_exclusive_url, + :headers => headers.dup, + :params => params.dup, + :builder => builder.dup, + :ssl => ssl.dup, + :request => options.dup) + end + + # Internal: Yields username and password extracted from a URI if they both exist. + def with_uri_credentials(uri) + if uri.user and uri.password + yield(Utils.unescape(uri.user), Utils.unescape(uri.password)) + end + end + + def set_authorization_header(header_type, *args) + header = Faraday::Request.lookup_middleware(header_type). + header(*args) + headers[Faraday::Request::Authorization::KEY] = header + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/error.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/error.rb new file mode 100644 index 0000000..1771230 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/error.rb @@ -0,0 +1,53 @@ +module Faraday + class Error < StandardError; end + class MissingDependency < Error; end + + class ClientError < Error + attr_reader :response + + def initialize(ex, response = nil) + @wrapped_exception = nil + @response = response + + if ex.respond_to?(:backtrace) + super(ex.message) + @wrapped_exception = ex + elsif ex.respond_to?(:each_key) + super("the server responded with status #{ex[:status]}") + @response = ex + else + super(ex.to_s) + end + end + + def backtrace + if @wrapped_exception + @wrapped_exception.backtrace + else + super + end + end + + def inspect + %(#<#{self.class}>) + end + end + + class ConnectionFailed < ClientError; end + class ResourceNotFound < ClientError; end + class ParsingError < ClientError; end + + class TimeoutError < ClientError + def initialize(ex = nil) + super(ex || "timeout") + end + end + + class SSLError < ClientError + end + + [:MissingDependency, :ClientError, :ConnectionFailed, :ResourceNotFound, + :ParsingError, :TimeoutError, :SSLError].each do |const| + Error.const_set(const, Faraday.const_get(const)) + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/middleware.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/middleware.rb new file mode 100644 index 0000000..c45d51a --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/middleware.rb @@ -0,0 +1,37 @@ +module Faraday + class Middleware + extend MiddlewareRegistry + + class << self + attr_accessor :load_error + private :load_error= + end + + self.load_error = nil + + # Executes a block which should try to require and reference dependent libraries + def self.dependency(lib = nil) + lib ? require(lib) : yield + rescue LoadError, NameError => error + self.load_error = error + end + + def self.new(*) + raise "missing dependency for #{self}: #{load_error.message}" unless loaded? + super + end + + def self.loaded? + load_error.nil? + end + + def self.inherited(subclass) + super + subclass.send(:load_error=, self.load_error) + end + + def initialize(app = nil) + @app = app + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/options.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/options.rb new file mode 100644 index 0000000..01bef49 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/options.rb @@ -0,0 +1,359 @@ +module Faraday + # Subclasses Struct with some special helpers for converting from a Hash to + # a Struct. + class Options < Struct + # Public + def self.from(value) + value ? new.update(value) : new + end + + # Public + def each + return to_enum(:each) unless block_given? + members.each do |key| + yield(key.to_sym, send(key)) + end + end + + # Public + def update(obj) + obj.each do |key, value| + if sub_options = self.class.options_for(key) + value = sub_options.from(value) if value + elsif Hash === value + hash = {} + value.each do |hash_key, hash_value| + hash[hash_key] = hash_value + end + value = hash + end + + self.send("#{key}=", value) unless value.nil? + end + self + end + + alias merge! update + + # Public + def delete(key) + value = send(key) + send("#{key}=", nil) + value + end + + # Public + def clear + members.each { |member| delete(member) } + end + + # Public + def merge(value) + dup.update(value) + end + + # Public + def fetch(key, *args) + unless symbolized_key_set.include?(key.to_sym) + key_setter = "#{key}=" + if args.size > 0 + send(key_setter, args.first) + elsif block_given? + send(key_setter, Proc.new.call(key)) + else + raise self.class.fetch_error_class, "key not found: #{key.inspect}" + end + end + send(key) + end + + # Public + def values_at(*keys) + keys.map { |key| send(key) } + end + + # Public + def keys + members.reject { |member| send(member).nil? } + end + + # Public + def empty? + keys.empty? + end + + # Public + def each_key + return to_enum(:each_key) unless block_given? + keys.each do |key| + yield(key) + end + end + + # Public + def key?(key) + keys.include?(key) + end + + alias has_key? key? + + # Public + def each_value + return to_enum(:each_value) unless block_given? + values.each do |value| + yield(value) + end + end + + # Public + def value?(value) + values.include?(value) + end + + alias has_value? value? + + # Public + def to_hash + hash = {} + members.each do |key| + value = send(key) + hash[key.to_sym] = value unless value.nil? + end + hash + end + + # Internal + def inspect + values = [] + members.each do |member| + value = send(member) + values << "#{member}=#{value.inspect}" if value + end + values = values.empty? ? ' (empty)' : (' ' << values.join(", ")) + + %(#<#{self.class}#{values}>) + end + + # Internal + def self.options(mapping) + attribute_options.update(mapping) + end + + # Internal + def self.options_for(key) + attribute_options[key] + end + + # Internal + def self.attribute_options + @attribute_options ||= {} + end + + def self.memoized(key) + memoized_attributes[key.to_sym] = Proc.new + class_eval <<-RUBY, __FILE__, __LINE__ + 1 + def #{key}() self[:#{key}]; end + RUBY + end + + def self.memoized_attributes + @memoized_attributes ||= {} + end + + def [](key) + key = key.to_sym + if method = self.class.memoized_attributes[key] + super(key) || (self[key] = instance_eval(&method)) + else + super + end + end + + def symbolized_key_set + @symbolized_key_set ||= Set.new(keys.map { |k| k.to_sym }) + end + + def self.inherited(subclass) + super + subclass.attribute_options.update(attribute_options) + subclass.memoized_attributes.update(memoized_attributes) + end + + def self.fetch_error_class + @fetch_error_class ||= if Object.const_defined?(:KeyError) + ::KeyError + else + ::IndexError + end + end + end + + class RequestOptions < Options.new(:params_encoder, :proxy, :bind, + :timeout, :open_timeout, :boundary, + :oauth) + + def []=(key, value) + if key && key.to_sym == :proxy + super(key, value ? ProxyOptions.from(value) : nil) + else + super(key, value) + end + end + end + + class SSLOptions < Options.new(:verify, :ca_file, :ca_path, :verify_mode, + :cert_store, :client_cert, :client_key, :certificate, :private_key, :verify_depth, :version) + + def verify? + verify != false + end + + def disable? + !verify? + end + end + + class ProxyOptions < Options.new(:uri, :user, :password) + extend Forwardable + def_delegators :uri, :scheme, :scheme=, :host, :host=, :port, :port=, :path, :path= + + def self.from(value) + case value + when String + value = {:uri => Utils.URI(value)} + when URI + value = {:uri => value} + when Hash, Options + if uri = value.delete(:uri) + value[:uri] = Utils.URI(uri) + end + end + super(value) + end + + memoized(:user) { uri.user && Utils.unescape(uri.user) } + memoized(:password) { uri.password && Utils.unescape(uri.password) } + end + + class ConnectionOptions < Options.new(:request, :proxy, :ssl, :builder, :url, + :parallel_manager, :params, :headers, :builder_class) + + options :request => RequestOptions, :ssl => SSLOptions + + memoized(:request) { self.class.options_for(:request).new } + + memoized(:ssl) { self.class.options_for(:ssl).new } + + memoized(:builder_class) { RackBuilder } + + def new_builder(block) + builder_class.new(&block) + end + end + + class Env < Options.new(:method, :body, :url, :request, :request_headers, + :ssl, :parallel_manager, :params, :response, :response_headers, :status) + + ContentLength = 'Content-Length'.freeze + StatusesWithoutBody = Set.new [204, 304] + SuccessfulStatuses = 200..299 + + # A Set of HTTP verbs that typically send a body. If no body is set for + # these requests, the Content-Length header is set to 0. + MethodsWithBodies = Set.new [:post, :put, :patch, :options] + + options :request => RequestOptions, + :request_headers => Utils::Headers, :response_headers => Utils::Headers + + extend Forwardable + + def_delegators :request, :params_encoder + + # Public + def self.from(value) + env = super(value) + if value.respond_to?(:custom_members) + env.custom_members.update(value.custom_members) + end + env + end + + # Public + def [](key) + if in_member_set?(key) + super(key) + else + custom_members[key] + end + end + + # Public + def []=(key, value) + if in_member_set?(key) + super(key, value) + else + custom_members[key] = value + end + end + + # Public + def success? + SuccessfulStatuses.include?(status) + end + + # Public + def needs_body? + !body && MethodsWithBodies.include?(method) + end + + # Public + def clear_body + request_headers[ContentLength] = '0' + self.body = '' + end + + # Public + def parse_body? + !StatusesWithoutBody.include?(status) + end + + # Public + def parallel? + !!parallel_manager + end + + def inspect + attrs = [nil] + members.each do |mem| + if value = send(mem) + attrs << "@#{mem}=#{value.inspect}" + end + end + if !custom_members.empty? + attrs << "@custom=#{custom_members.inspect}" + end + %(#<#{self.class}#{attrs.join(" ")}>) + end + + # Internal + def custom_members + @custom_members ||= {} + end + + # Internal + if members.first.is_a?(Symbol) + def in_member_set?(key) + self.class.member_set.include?(key.to_sym) + end + else + def in_member_set?(key) + self.class.member_set.include?(key.to_s) + end + end + + # Internal + def self.member_set + @member_set ||= Set.new(members) + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/parameters.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/parameters.rb new file mode 100644 index 0000000..8cf43c3 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/parameters.rb @@ -0,0 +1,197 @@ +require "forwardable" + +module Faraday + module NestedParamsEncoder + class << self + extend Forwardable + def_delegators :'Faraday::Utils', :escape, :unescape + end + + def self.encode(params) + return nil if params == nil + + if !params.is_a?(Array) + if !params.respond_to?(:to_hash) + raise TypeError, + "Can't convert #{params.class} into Hash." + end + params = params.to_hash + params = params.map do |key, value| + key = key.to_s if key.kind_of?(Symbol) + [key, value] + end + # Useful default for OAuth and caching. + # Only to be used for non-Array inputs. Arrays should preserve order. + params.sort! + end + + # Helper lambda + to_query = lambda do |parent, value| + if value.is_a?(Hash) + value = value.map do |key, val| + key = escape(key) + [key, val] + end + value.sort! + buffer = "" + value.each do |key, val| + new_parent = "#{parent}%5B#{key}%5D" + buffer << "#{to_query.call(new_parent, val)}&" + end + return buffer.chop + elsif value.is_a?(Array) + buffer = "" + value.each_with_index do |val, i| + new_parent = "#{parent}%5B%5D" + buffer << "#{to_query.call(new_parent, val)}&" + end + return buffer.chop + elsif value.nil? + return parent + else + encoded_value = escape(value) + return "#{parent}=#{encoded_value}" + end + end + + # The params have form [['key1', 'value1'], ['key2', 'value2']]. + buffer = '' + params.each do |parent, value| + encoded_parent = escape(parent) + buffer << "#{to_query.call(encoded_parent, value)}&" + end + return buffer.chop + end + + def self.decode(query) + return nil if query == nil + + params = {} + query.split("&").each do |pair| + next if pair.empty? + key, value = pair.split("=", 2) + key = unescape(key) + value = unescape(value.gsub(/\+/, ' ')) if value + + subkeys = key.scan(/[^\[\]]+(?:\]?\[\])?/) + context = params + subkeys.each_with_index do |subkey, i| + is_array = subkey =~ /[\[\]]+\Z/ + subkey = $` if is_array + last_subkey = i == subkeys.length - 1 + + if !last_subkey || is_array + value_type = is_array ? Array : Hash + if context[subkey] && !context[subkey].is_a?(value_type) + raise TypeError, "expected %s (got %s) for param `%s'" % [ + value_type.name, + context[subkey].class.name, + subkey + ] + end + context = (context[subkey] ||= value_type.new) + end + + if context.is_a?(Array) && !is_array + if !context.last.is_a?(Hash) || context.last.has_key?(subkey) + context << {} + end + context = context.last + end + + if last_subkey + if is_array + context << value + else + context[subkey] = value + end + end + end + end + + dehash(params, 0) + end + + # Internal: convert a nested hash with purely numeric keys into an array. + # FIXME: this is not compatible with Rack::Utils.parse_nested_query + def self.dehash(hash, depth) + hash.each do |key, value| + hash[key] = dehash(value, depth + 1) if value.kind_of?(Hash) + end + + if depth > 0 && !hash.empty? && hash.keys.all? { |k| k =~ /^\d+$/ } + hash.keys.sort.inject([]) { |all, key| all << hash[key] } + else + hash + end + end + end + + module FlatParamsEncoder + class << self + extend Forwardable + def_delegators :'Faraday::Utils', :escape, :unescape + end + + def self.encode(params) + return nil if params == nil + + if !params.is_a?(Array) + if !params.respond_to?(:to_hash) + raise TypeError, + "Can't convert #{params.class} into Hash." + end + params = params.to_hash + params = params.map do |key, value| + key = key.to_s if key.kind_of?(Symbol) + [key, value] + end + # Useful default for OAuth and caching. + # Only to be used for non-Array inputs. Arrays should preserve order. + params.sort! + end + + # The params have form [['key1', 'value1'], ['key2', 'value2']]. + buffer = '' + params.each do |key, value| + encoded_key = escape(key) + value = value.to_s if value == true || value == false + if value == nil + buffer << "#{encoded_key}&" + elsif value.kind_of?(Array) + value.each do |sub_value| + encoded_value = escape(sub_value) + buffer << "#{encoded_key}=#{encoded_value}&" + end + else + encoded_value = escape(value) + buffer << "#{encoded_key}=#{encoded_value}&" + end + end + return buffer.chop + end + + def self.decode(query) + empty_accumulator = {} + return nil if query == nil + split_query = (query.split('&').map do |pair| + pair.split('=', 2) if pair && !pair.empty? + end).compact + return split_query.inject(empty_accumulator.dup) do |accu, pair| + pair[0] = unescape(pair[0]) + pair[1] = true if pair[1].nil? + if pair[1].respond_to?(:to_str) + pair[1] = unescape(pair[1].to_str.gsub(/\+/, " ")) + end + if accu[pair[0]].kind_of?(Array) + accu[pair[0]] << pair[1] + elsif accu[pair[0]] + accu[pair[0]] = [accu[pair[0]], pair[1]] + else + accu[pair[0]] = pair[1] + end + accu + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/rack_builder.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/rack_builder.rb new file mode 100644 index 0000000..26a3ca7 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/rack_builder.rb @@ -0,0 +1,213 @@ +module Faraday + # A Builder that processes requests into responses by passing through an inner + # middleware stack (heavily inspired by Rack). + # + # Faraday::Connection.new(:url => 'http://sushi.com') do |builder| + # builder.request :url_encoded # Faraday::Request::UrlEncoded + # builder.adapter :net_http # Faraday::Adapter::NetHttp + # end + class RackBuilder + attr_accessor :handlers + + # Error raised when trying to modify the stack after calling `lock!` + class StackLocked < RuntimeError; end + + # borrowed from ActiveSupport::Dependencies::Reference & + # ActionDispatch::MiddlewareStack::Middleware + class Handler + @@constants_mutex = Mutex.new + @@constants = Hash.new { |h, k| + value = k.respond_to?(:constantize) ? k.constantize : Object.const_get(k) + @@constants_mutex.synchronize { h[k] = value } + } + + attr_reader :name + + def initialize(klass, *args, &block) + @name = klass.to_s + if klass.respond_to?(:name) + @@constants_mutex.synchronize { @@constants[@name] = klass } + end + @args, @block = args, block + end + + def klass() @@constants[@name] end + def inspect() @name end + + def ==(other) + if other.is_a? Handler + self.name == other.name + elsif other.respond_to? :name + klass == other + else + @name == other.to_s + end + end + + def build(app) + klass.new(app, *@args, &@block) + end + end + + def initialize(handlers = []) + @handlers = handlers + if block_given? + build(&Proc.new) + elsif @handlers.empty? + # default stack, if nothing else is configured + self.request :url_encoded + self.adapter Faraday.default_adapter + end + end + + def build(options = {}) + raise_if_locked + @handlers.clear unless options[:keep] + yield(self) if block_given? + end + + def [](idx) + @handlers[idx] + end + + # Locks the middleware stack to ensure no further modifications are possible. + def lock! + @handlers.freeze + end + + def locked? + @handlers.frozen? + end + + def use(klass, *args, &block) + if klass.is_a? Symbol + use_symbol(Faraday::Middleware, klass, *args, &block) + else + raise_if_locked + @handlers << self.class::Handler.new(klass, *args, &block) + end + end + + def request(key, *args, &block) + use_symbol(Faraday::Request, key, *args, &block) + end + + def response(key, *args, &block) + use_symbol(Faraday::Response, key, *args, &block) + end + + def adapter(key, *args, &block) + use_symbol(Faraday::Adapter, key, *args, &block) + end + + ## methods to push onto the various positions in the stack: + + def insert(index, *args, &block) + raise_if_locked + index = assert_index(index) + handler = self.class::Handler.new(*args, &block) + @handlers.insert(index, handler) + end + + alias_method :insert_before, :insert + + def insert_after(index, *args, &block) + index = assert_index(index) + insert(index + 1, *args, &block) + end + + def swap(index, *args, &block) + raise_if_locked + index = assert_index(index) + @handlers.delete_at(index) + insert(index, *args, &block) + end + + def delete(handler) + raise_if_locked + @handlers.delete(handler) + end + + # Processes a Request into a Response by passing it through this Builder's + # middleware stack. + # + # connection - Faraday::Connection + # request - Faraday::Request + # + # Returns a Faraday::Response. + def build_response(connection, request) + app.call(build_env(connection, request)) + end + + # The "rack app" wrapped in middleware. All requests are sent here. + # + # The builder is responsible for creating the app object. After this, + # the builder gets locked to ensure no further modifications are made + # to the middleware stack. + # + # Returns an object that responds to `call` and returns a Response. + def app + @app ||= begin + lock! + to_app(lambda { |env| + response = Response.new + env.response = response + response.finish(env) unless env.parallel? + response + }) + end + end + + def to_app(inner_app) + # last added handler is the deepest and thus closest to the inner app + @handlers.reverse.inject(inner_app) { |app, handler| handler.build(app) } + end + + def ==(other) + other.is_a?(self.class) && @handlers == other.handlers + end + + def dup + self.class.new(@handlers.dup) + end + + # ENV Keys + # :method - a symbolized request method (:get, :post) + # :body - the request body that will eventually be converted to a string. + # :url - URI instance for the current request. + # :status - HTTP response status code + # :request_headers - hash of HTTP Headers to be sent to the server + # :response_headers - Hash of HTTP headers from the server + # :parallel_manager - sent if the connection is in parallel mode + # :request - Hash of options for configuring the request. + # :timeout - open/read timeout Integer in seconds + # :open_timeout - read timeout Integer in seconds + # :proxy - Hash of proxy options + # :uri - Proxy Server URI + # :user - Proxy server username + # :password - Proxy server password + # :ssl - Hash of options for configuring SSL requests. + def build_env(connection, request) + Env.new(request.method, request.body, + connection.build_exclusive_url(request.path, request.params, request.options.params_encoder), + request.options, request.headers, connection.ssl, + connection.parallel_manager) + end + + private + + def raise_if_locked + raise StackLocked, "can't modify middleware stack after making a request" if locked? + end + + def use_symbol(mod, key, *args, &block) + use(mod.lookup_middleware(key), *args, &block) + end + + def assert_index(index) + idx = index.is_a?(Integer) ? index : @handlers.index(index) + raise "No such handler: #{index.inspect}" unless idx + idx + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request.rb new file mode 100644 index 0000000..481077f --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request.rb @@ -0,0 +1,92 @@ +module Faraday + # Used to setup urls, params, headers, and the request body in a sane manner. + # + # @connection.post do |req| + # req.url 'http://localhost', 'a' => '1' # 'http://localhost?a=1' + # req.headers['b'] = '2' # Header + # req.params['c'] = '3' # GET Param + # req['b'] = '2' # also Header + # req.body = 'abc' + # end + # + class Request < Struct.new(:method, :path, :params, :headers, :body, :options) + extend MiddlewareRegistry + + register_middleware File.expand_path('../request', __FILE__), + :url_encoded => [:UrlEncoded, 'url_encoded'], + :multipart => [:Multipart, 'multipart'], + :retry => [:Retry, 'retry'], + :authorization => [:Authorization, 'authorization'], + :basic_auth => [:BasicAuthentication, 'basic_authentication'], + :token_auth => [:TokenAuthentication, 'token_authentication'], + :instrumentation => [:Instrumentation, 'instrumentation'] + + def self.create(request_method) + new(request_method).tap do |request| + yield(request) if block_given? + end + end + + # Public: Replace params, preserving the existing hash type + def params=(hash) + if params + params.replace hash + else + super + end + end + + # Public: Replace request headers, preserving the existing hash type + def headers=(hash) + if headers + headers.replace hash + else + super + end + end + + def url(path, params = nil) + if path.respond_to? :query + if query = path.query + path = path.dup + path.query = nil + end + else + path, query = path.split('?', 2) + end + self.path = path + self.params.merge_query query, options.params_encoder + self.params.update(params) if params + end + + def [](key) + headers[key] + end + + def []=(key, value) + headers[key] = value + end + + # ENV Keys + # :method - a symbolized request method (:get, :post) + # :body - the request body that will eventually be converted to a string. + # :url - URI instance for the current request. + # :status - HTTP response status code + # :request_headers - hash of HTTP Headers to be sent to the server + # :response_headers - Hash of HTTP headers from the server + # :parallel_manager - sent if the connection is in parallel mode + # :request - Hash of options for configuring the request. + # :timeout - open/read timeout Integer in seconds + # :open_timeout - read timeout Integer in seconds + # :proxy - Hash of proxy options + # :uri - Proxy Server URI + # :user - Proxy server username + # :password - Proxy server password + # :ssl - Hash of options for configuring SSL requests. + def to_env(connection) + Env.new(method, body, connection.build_exclusive_url(path, params), + options, headers, connection.ssl, connection.parallel_manager) + end + end +end + diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/authorization.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/authorization.rb new file mode 100644 index 0000000..43b4528 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/authorization.rb @@ -0,0 +1,42 @@ +module Faraday + class Request::Authorization < Faraday::Middleware + KEY = "Authorization".freeze unless defined? KEY + + # Public + def self.header(type, token) + case token + when String, Symbol + "#{type} #{token}" + when Hash + build_hash(type.to_s, token) + else + raise ArgumentError, "Can't build an Authorization #{type} header from #{token.inspect}" + end + end + + # Internal + def self.build_hash(type, hash) + offset = KEY.size + type.size + 3 + comma = ",\n#{' ' * offset}" + values = [] + hash.each do |key, value| + values << "#{key}=#{value.to_s.inspect}" + end + "#{type} #{values * comma}" + end + + def initialize(app, type, token) + @header_value = self.class.header(type, token) + super(app) + end + + # Public + def call(env) + unless env.request_headers[KEY] + env.request_headers[KEY] = @header_value + end + @app.call(env) + end + end +end + diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/basic_authentication.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/basic_authentication.rb new file mode 100644 index 0000000..54c8dee --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/basic_authentication.rb @@ -0,0 +1,13 @@ +require 'base64' + +module Faraday + class Request::BasicAuthentication < Request.load_middleware(:authorization) + # Public + def self.header(login, pass) + value = Base64.encode64([login, pass].join(':')) + value.gsub!("\n", '') + super(:Basic, value) + end + end +end + diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/instrumentation.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/instrumentation.rb new file mode 100644 index 0000000..42af8bc --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/instrumentation.rb @@ -0,0 +1,36 @@ +module Faraday + class Request::Instrumentation < Faraday::Middleware + class Options < Faraday::Options.new(:name, :instrumenter) + def name + self[:name] ||= 'request.faraday' + end + + def instrumenter + self[:instrumenter] ||= ActiveSupport::Notifications + end + end + + # Public: Instruments requests using Active Support. + # + # Measures time spent only for synchronous requests. + # + # Examples + # + # ActiveSupport::Notifications.subscribe('request.faraday') do |name, starts, ends, _, env| + # url = env[:url] + # http_method = env[:method].to_s.upcase + # duration = ends - starts + # $stderr.puts '[%s] %s %s (%.3f s)' % [url.host, http_method, url.request_uri, duration] + # end + def initialize(app, options = nil) + super(app) + @name, @instrumenter = Options.from(options).values_at(:name, :instrumenter) + end + + def call(env) + @instrumenter.instrument(@name, env) do + @app.call(env) + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/multipart.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/multipart.rb new file mode 100644 index 0000000..38b452a --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/multipart.rb @@ -0,0 +1,63 @@ +require File.expand_path("../url_encoded", __FILE__) + +module Faraday + class Request::Multipart < Request::UrlEncoded + self.mime_type = 'multipart/form-data'.freeze + DEFAULT_BOUNDARY = "-----------RubyMultipartPost".freeze unless defined? DEFAULT_BOUNDARY + + def call(env) + match_content_type(env) do |params| + env.request.boundary ||= DEFAULT_BOUNDARY + env.request_headers[CONTENT_TYPE] += "; boundary=#{env.request.boundary}" + env.body = create_multipart(env, params) + end + @app.call env + end + + def process_request?(env) + type = request_type(env) + env.body.respond_to?(:each_key) and !env.body.empty? and ( + (type.empty? and has_multipart?(env.body)) or + type == self.class.mime_type + ) + end + + def has_multipart?(obj) + # string is an enum in 1.8, returning list of itself + if obj.respond_to?(:each) && !obj.is_a?(String) + (obj.respond_to?(:values) ? obj.values : obj).each do |val| + return true if (val.respond_to?(:content_type) || has_multipart?(val)) + end + end + false + end + + def create_multipart(env, params) + boundary = env.request.boundary + parts = process_params(params) do |key, value| + Faraday::Parts::Part.new(boundary, key, value) + end + parts << Faraday::Parts::EpiloguePart.new(boundary) + + body = Faraday::CompositeReadIO.new(parts) + env.request_headers[Faraday::Env::ContentLength] = body.length.to_s + return body + end + + def process_params(params, prefix = nil, pieces = nil, &block) + params.inject(pieces || []) do |all, (key, value)| + key = "#{prefix}[#{key}]" if prefix + + case value + when Array + values = value.inject([]) { |a,v| a << [nil, v] } + process_params(values, key, all, &block) + when Hash + process_params(value, key, all, &block) + else + all << block.call(key, value) + end + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/retry.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/retry.rb new file mode 100644 index 0000000..6ce8597 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/retry.rb @@ -0,0 +1,154 @@ +module Faraday + # Catches exceptions and retries each request a limited number of times. + # + # By default, it retries 2 times and handles only timeout exceptions. It can + # be configured with an arbitrary number of retries, a list of exceptions to + # handle, a retry interval, a percentage of randomness to add to the retry + # interval, and a backoff factor. + # + # Examples + # + # Faraday.new do |conn| + # conn.request :retry, max: 2, interval: 0.05, + # interval_randomness: 0.5, backoff_factor: 2 + # exceptions: [CustomException, 'Timeout::Error'] + # conn.adapter ... + # end + # + # This example will result in a first interval that is random between 0.05 and 0.075 and a second + # interval that is random between 0.1 and 0.15 + # + class Request::Retry < Faraday::Middleware + + IDEMPOTENT_METHODS = [:delete, :get, :head, :options, :put] + + class Options < Faraday::Options.new(:max, :interval, :max_interval, :interval_randomness, + :backoff_factor, :exceptions, :methods, :retry_if) + DEFAULT_CHECK = lambda { |env,exception| false } + + def self.from(value) + if Fixnum === value + new(value) + else + super(value) + end + end + + def max + (self[:max] ||= 2).to_i + end + + def interval + (self[:interval] ||= 0).to_f + end + + def max_interval + (self[:max_interval] ||= Float::MAX).to_f + end + + def interval_randomness + (self[:interval_randomness] ||= 0).to_f + end + + def backoff_factor + (self[:backoff_factor] ||= 1).to_f + end + + def exceptions + Array(self[:exceptions] ||= [Errno::ETIMEDOUT, 'Timeout::Error', + Error::TimeoutError]) + end + + def methods + Array(self[:methods] ||= IDEMPOTENT_METHODS) + end + + def retry_if + self[:retry_if] ||= DEFAULT_CHECK + end + + end + + # Public: Initialize middleware + # + # Options: + # max - Maximum number of retries (default: 2) + # interval - Pause in seconds between retries (default: 0) + # interval_randomness - The maximum random interval amount expressed + # as a float between 0 and 1 to use in addition to the + # interval. (default: 0) + # max_interval - An upper limit for the interval (default: Float::MAX) + # backoff_factor - The amount to multiple each successive retry's + # interval amount by in order to provide backoff + # (default: 1) + # exceptions - The list of exceptions to handle. Exceptions can be + # given as Class, Module, or String. (default: + # [Errno::ETIMEDOUT, Timeout::Error, + # Error::TimeoutError]) + # methods - A list of HTTP methods to retry without calling retry_if. Pass + # an empty Array to call retry_if for all exceptions. + # (defaults to the idempotent HTTP methods in IDEMPOTENT_METHODS) + # retry_if - block that will receive the env object and the exception raised + # and should decide if the code should retry still the action or + # not independent of the retry count. This would be useful + # if the exception produced is non-recoverable or if the + # the HTTP method called is not idempotent. + # (defaults to return false) + def initialize(app, options = nil) + super(app) + @options = Options.from(options) + @errmatch = build_exception_matcher(@options.exceptions) + end + + def sleep_amount(retries) + retry_index = @options.max - retries + current_interval = @options.interval * (@options.backoff_factor ** retry_index) + current_interval = [current_interval, @options.max_interval].min + random_interval = rand * @options.interval_randomness.to_f * @options.interval + current_interval + random_interval + end + + def call(env) + retries = @options.max + request_body = env[:body] + begin + env[:body] = request_body # after failure env[:body] is set to the response body + @app.call(env) + rescue @errmatch => exception + if retries > 0 && retry_request?(env, exception) + retries -= 1 + sleep sleep_amount(retries + 1) + retry + end + raise + end + end + + # Private: construct an exception matcher object. + # + # An exception matcher for the rescue clause can usually be any object that + # responds to `===`, but for Ruby 1.8 it has to be a Class or Module. + def build_exception_matcher(exceptions) + matcher = Module.new + (class << matcher; self; end).class_eval do + define_method(:===) do |error| + exceptions.any? do |ex| + if ex.is_a? Module + error.is_a? ex + else + error.class.to_s == ex.to_s + end + end + end + end + matcher + end + + private + + def retry_request?(env, exception) + @options.methods.include?(env[:method]) || @options.retry_if.call(env, exception) + end + + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/token_authentication.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/token_authentication.rb new file mode 100644 index 0000000..2558608 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/token_authentication.rb @@ -0,0 +1,15 @@ +module Faraday + class Request::TokenAuthentication < Request.load_middleware(:authorization) + # Public + def self.header(token, options = nil) + options ||= {} + options[:token] = token + super(:Token, options) + end + + def initialize(app, token, options = nil) + super(app, token, options) + end + end +end + diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/url_encoded.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/url_encoded.rb new file mode 100644 index 0000000..b02a266 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/request/url_encoded.rb @@ -0,0 +1,36 @@ +module Faraday + class Request::UrlEncoded < Faraday::Middleware + CONTENT_TYPE = 'Content-Type'.freeze unless defined? CONTENT_TYPE + + class << self + attr_accessor :mime_type + end + self.mime_type = 'application/x-www-form-urlencoded'.freeze + + def call(env) + match_content_type(env) do |data| + params = Faraday::Utils::ParamsHash[data] + env.body = params.to_query(env.params_encoder) + end + @app.call env + end + + def match_content_type(env) + if process_request?(env) + env.request_headers[CONTENT_TYPE] ||= self.class.mime_type + yield(env.body) unless env.body.respond_to?(:to_str) + end + end + + def process_request?(env) + type = request_type(env) + env.body and (type.empty? or type == self.class.mime_type) + end + + def request_type(env) + type = env.request_headers[CONTENT_TYPE].to_s + type = type.split(';', 2).first if type.index(';') + type + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/response.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/response.rb new file mode 100644 index 0000000..c10ad48 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/response.rb @@ -0,0 +1,93 @@ +require 'forwardable' + +module Faraday + class Response + # Used for simple response middleware. + class Middleware < Faraday::Middleware + def call(env) + @app.call(env).on_complete do |environment| + on_complete(environment) + end + end + + # Override this to modify the environment after the response has finished. + # Calls the `parse` method if defined + def on_complete(env) + env.body = parse(env.body) if respond_to?(:parse) && env.parse_body? + end + end + + extend Forwardable + extend MiddlewareRegistry + + register_middleware File.expand_path('../response', __FILE__), + :raise_error => [:RaiseError, 'raise_error'], + :logger => [:Logger, 'logger'] + + def initialize(env = nil) + @env = Env.from(env) if env + @on_complete_callbacks = [] + end + + attr_reader :env + + def_delegators :env, :to_hash + + def status + finished? ? env.status : nil + end + + def headers + finished? ? env.response_headers : {} + end + def_delegator :headers, :[] + + def body + finished? ? env.body : nil + end + + def finished? + !!env + end + + def on_complete + if not finished? + @on_complete_callbacks << Proc.new + else + yield(env) + end + return self + end + + def finish(env) + raise "response already finished" if finished? + @env = env.is_a?(Env) ? env : Env.from(env) + @on_complete_callbacks.each { |callback| callback.call(@env) } + return self + end + + def success? + finished? && env.success? + end + + # because @on_complete_callbacks cannot be marshalled + def marshal_dump + !finished? ? nil : { + :status => @env.status, :body => @env.body, + :response_headers => @env.response_headers + } + end + + def marshal_load(env) + @env = Env.from(env) + end + + # Expand the env with more properties, without overriding existing ones. + # Useful for applying request params after restoring a marshalled Response. + def apply_request(request_env) + raise "response didn't finish yet" unless finished? + @env = Env.from(request_env).update(@env) + return self + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/response/logger.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/response/logger.rb new file mode 100644 index 0000000..0b4d714 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/response/logger.rb @@ -0,0 +1,59 @@ +require 'forwardable' + +module Faraday + class Response::Logger < Response::Middleware + extend Forwardable + + DEFAULT_OPTIONS = { :bodies => false } + + def initialize(app, logger = nil, options = {}) + super(app) + @logger = logger || begin + require 'logger' + ::Logger.new(STDOUT) + end + @options = DEFAULT_OPTIONS.merge(options) + end + + def_delegators :@logger, :debug, :info, :warn, :error, :fatal + + def call(env) + info "#{env.method} #{env.url.to_s}" + debug('request') { dump_headers env.request_headers } + debug('request') { dump_body(env[:body]) } if env[:body] && log_body?(:request) + super + end + + def on_complete(env) + info('Status') { env.status.to_s } + debug('response') { dump_headers env.response_headers } + debug('response') { dump_body env[:body] } if env[:body] && log_body?(:response) + end + + private + + def dump_headers(headers) + headers.map { |k, v| "#{k}: #{v.inspect}" }.join("\n") + end + + def dump_body(body) + if body.respond_to?(:to_str) + body.to_str + else + pretty_inspect(body) + end + end + + def pretty_inspect(body) + require 'pp' unless body.respond_to?(:pretty_inspect) + body.pretty_inspect + end + + def log_body?(type) + case @options[:bodies] + when Hash then @options[:bodies][type] + else @options[:bodies] + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/response/raise_error.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/response/raise_error.rb new file mode 100644 index 0000000..437762b --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/response/raise_error.rb @@ -0,0 +1,21 @@ +module Faraday + class Response::RaiseError < Response::Middleware + ClientErrorStatuses = 400...600 + + def on_complete(env) + case env[:status] + when 404 + raise Faraday::Error::ResourceNotFound, response_values(env) + when 407 + # mimic the behavior that we get with proxy requests with HTTPS + raise Faraday::Error::ConnectionFailed, %{407 "Proxy Authentication Required "} + when ClientErrorStatuses + raise Faraday::Error::ClientError, response_values(env) + end + end + + def response_values(env) + {:status => env.status, :headers => env.response_headers, :body => env.body} + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/upload_io.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/upload_io.rb new file mode 100644 index 0000000..9130d15 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/upload_io.rb @@ -0,0 +1,67 @@ +begin + require 'composite_io' + require 'parts' + require 'stringio' +rescue LoadError + $stderr.puts "Install the multipart-post gem." + raise +end + +module Faraday + # Similar but not compatible with ::CompositeReadIO provided by multipart-post. + class CompositeReadIO + def initialize(*parts) + @parts = parts.flatten + @ios = @parts.map { |part| part.to_io } + @index = 0 + end + + def length + @parts.inject(0) { |sum, part| sum + part.length } + end + + def rewind + @ios.each { |io| io.rewind } + @index = 0 + end + + # Read from IOs in order until `length` bytes have been received. + def read(length = nil, outbuf = nil) + got_result = false + outbuf = outbuf ? outbuf.replace("") : "" + + while io = current_io + if result = io.read(length) + got_result ||= !result.nil? + result.force_encoding("BINARY") if result.respond_to?(:force_encoding) + outbuf << result + length -= result.length if length + break if length == 0 + end + advance_io + end + (!got_result && length) ? nil : outbuf + end + + def close + @ios.each { |io| io.close } + end + + def ensure_open_and_readable + # Rubinius compatibility + end + + private + + def current_io + @ios[@index] + end + + def advance_io + @index += 1 + end + end + + UploadIO = ::UploadIO + Parts = ::Parts +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/utils.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/utils.rb new file mode 100644 index 0000000..1d01e9d --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/faraday-0.9.2/lib/faraday/utils.rb @@ -0,0 +1,309 @@ +require 'thread' + +module Faraday + module Utils + extend self + + # Adapted from Rack::Utils::HeaderHash + class Headers < ::Hash + def self.from(value) + new(value) + end + + def initialize(hash = nil) + super() + @names = {} + self.update(hash || {}) + end + + # on dup/clone, we need to duplicate @names hash + def initialize_copy(other) + super + @names = other.names.dup + end + + # need to synchronize concurrent writes to the shared KeyMap + keymap_mutex = Mutex.new + + # symbol -> string mapper + cache + KeyMap = Hash.new do |map, key| + value = if key.respond_to?(:to_str) + key + else + key.to_s.split('_'). # :user_agent => %w(user agent) + each { |w| w.capitalize! }. # => %w(User Agent) + join('-') # => "User-Agent" + end + keymap_mutex.synchronize { map[key] = value } + end + KeyMap[:etag] = "ETag" + + def [](k) + k = KeyMap[k] + super(k) || super(@names[k.downcase]) + end + + def []=(k, v) + k = KeyMap[k] + k = (@names[k.downcase] ||= k) + # join multiple values with a comma + v = v.to_ary.join(', ') if v.respond_to? :to_ary + super(k, v) + end + + def fetch(k, *args, &block) + k = KeyMap[k] + key = @names.fetch(k.downcase, k) + super(key, *args, &block) + end + + def delete(k) + k = KeyMap[k] + if k = @names[k.downcase] + @names.delete k.downcase + super(k) + end + end + + def include?(k) + @names.include? k.downcase + end + + alias_method :has_key?, :include? + alias_method :member?, :include? + alias_method :key?, :include? + + def merge!(other) + other.each { |k, v| self[k] = v } + self + end + alias_method :update, :merge! + + def merge(other) + hash = dup + hash.merge! other + end + + def replace(other) + clear + @names.clear + self.update other + self + end + + def to_hash() ::Hash.new.update(self) end + + def parse(header_string) + return unless header_string && !header_string.empty? + header_string.split(/\r\n/). + tap { |a| a.shift if a.first.index('HTTP/') == 0 }. # drop the HTTP status line + map { |h| h.split(/:\s+/, 2) }.reject { |p| p[0].nil? }. # split key and value, ignore blank lines + each { |key, value| + # join multiple values with a comma + if self[key] + self[key] << ', ' << value + else + self[key] = value + end + } + end + + protected + + def names + @names + end + end + + # hash with stringified keys + class ParamsHash < Hash + def [](key) + super(convert_key(key)) + end + + def []=(key, value) + super(convert_key(key), value) + end + + def delete(key) + super(convert_key(key)) + end + + def include?(key) + super(convert_key(key)) + end + + alias_method :has_key?, :include? + alias_method :member?, :include? + alias_method :key?, :include? + + def update(params) + params.each do |key, value| + self[key] = value + end + self + end + alias_method :merge!, :update + + def merge(params) + dup.update(params) + end + + def replace(other) + clear + update(other) + end + + def merge_query(query, encoder = nil) + if query && !query.empty? + update((encoder || Utils.default_params_encoder).decode(query)) + end + self + end + + def to_query(encoder = nil) + (encoder || Utils.default_params_encoder).encode(self) + end + + private + + def convert_key(key) + key.to_s + end + end + + def build_query(params) + FlatParamsEncoder.encode(params) + end + + def build_nested_query(params) + NestedParamsEncoder.encode(params) + end + + ESCAPE_RE = /[^a-zA-Z0-9 .~_-]/ + + def escape(s) + s.to_s.gsub(ESCAPE_RE) {|match| + '%' + match.unpack('H2' * match.bytesize).join('%').upcase + }.tr(' ', '+') + end + + def unescape(s) CGI.unescape s.to_s end + + DEFAULT_SEP = /[&;] */n + + # Adapted from Rack + def parse_query(query) + FlatParamsEncoder.decode(query) + end + + def parse_nested_query(query) + NestedParamsEncoder.decode(query) + end + + def default_params_encoder + @default_params_encoder ||= NestedParamsEncoder + end + + class << self + attr_writer :default_params_encoder + end + + # Stolen from Rack + def normalize_params(params, name, v = nil) + name =~ %r(\A[\[\]]*([^\[\]]+)\]*) + k = $1 || '' + after = $' || '' + + return if k.empty? + + if after == "" + if params[k] + params[k] = Array[params[k]] unless params[k].kind_of?(Array) + params[k] << v + else + params[k] = v + end + elsif after == "[]" + params[k] ||= [] + raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array) + params[k] << v + elsif after =~ %r(^\[\]\[([^\[\]]+)\]$) || after =~ %r(^\[\](.+)$) + child_key = $1 + params[k] ||= [] + raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array) + if params[k].last.is_a?(Hash) && !params[k].last.key?(child_key) + normalize_params(params[k].last, child_key, v) + else + params[k] << normalize_params({}, child_key, v) + end + else + params[k] ||= {} + raise TypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Hash) + params[k] = normalize_params(params[k], after, v) + end + + return params + end + + # Normalize URI() behavior across Ruby versions + # + # url - A String or URI. + # + # Returns a parsed URI. + def URI(url) + if url.respond_to?(:host) + url + elsif url.respond_to?(:to_str) + default_uri_parser.call(url) + else + raise ArgumentError, "bad argument (expected URI object or URI string)" + end + end + + def default_uri_parser + @default_uri_parser ||= begin + require 'uri' + Kernel.method(:URI) + end + end + + def default_uri_parser=(parser) + @default_uri_parser = if parser.respond_to?(:call) || parser.nil? + parser + else + parser.method(:parse) + end + end + + # Receives a String or URI and returns just the path with the query string sorted. + def normalize_path(url) + url = URI(url) + (url.path.start_with?('/') ? url.path : '/' + url.path) + + (url.query ? "?#{sort_query_params(url.query)}" : "") + end + + # Recursive hash update + def deep_merge!(target, hash) + hash.each do |key, value| + if Hash === value and Hash === target[key] + target[key] = deep_merge(target[key], value) + else + target[key] = value + end + end + target + end + + # Recursive hash merge + def deep_merge(source, hash) + deep_merge!(source.dup, hash) + end + + protected + + def sort_query_params(query) + query.split('&').sort.join('&') + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/.gitignore b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/.gitignore new file mode 100644 index 0000000..c02a141 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/.gitignore @@ -0,0 +1,6 @@ +doc +pkg +*~ +*.swo +*.swp +/Gemfile.lock diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/.travis.yml b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/.travis.yml new file mode 100644 index 0000000..e1ea1fe --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/.travis.yml @@ -0,0 +1,7 @@ +rvm: + - 1.9.3 + - 2.0.0 + - jruby +branches: + only: + - master diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/Gemfile b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/Gemfile new file mode 100644 index 0000000..e55151b --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/Gemfile @@ -0,0 +1,14 @@ +source 'https://rubygems.org' +gemspec + +platforms :mri_19 do + gem 'ruby-debug19' +end + +platforms :mri_18 do + gem 'ruby-debug' +end + +group :development, :test do + gem 'rake' +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/History.txt b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/History.txt new file mode 100644 index 0000000..64b1e38 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/History.txt @@ -0,0 +1,60 @@ +=== 2.0.0 / 2013-12-21 + +- Drop Ruby 1.8 compatibility +- GH #21: Fix FilePart length calculation for Ruby 1.9 when filename contains + multibyte characters (hexfet) +- GH #20: Ensure upload responds to both #content_type and #original_filename + (Steven Davidovitz) +- GH #31: Support setting headers on any part of the request (Socrates Vicente) +- GH #30: Support array values for params (Gustav Ernberg) +- GH #32: Fix respond_to? signature (Leo Cassarani) +- GH #33: Update README to markdown (Jagtesh Chadha) +- GH #35: Improved handling of array-type parameters (Steffen Grunwald) + +=== 1.2.0 / 2013-02-25 + +- #25: Ruby 2 compatibility (thanks mislav) + +=== 1.1.5 / 2012-02-12 + +- Fix length/bytesize of parts in 1.9 (#7, #14) (Jason Moore) +- Allow CompositeIO objects to be re-read by rewinding, like other IO + objects. (Luke Redpath) + +=== 1.1.4 / 2011-11-23 + +- Non-functional changes in release (switch to Bundler gem tasks) + +=== 1.1.3 / 2011-07-25 + +- More configurable header specification for parts (Gerrit Riessen) + +=== 1.1.2 / 2011-05-24 + +- Fix CRLF file part miscalculation (Johannes Wagener) +- Fix Epilogue CRLF issue (suggestion by Neil Spring) + +=== 1.1.1 / 2011-05-13 + +- GH# 9: Fixed Ruby 1.9.2 StringIO bug (thanks Alex Koppel) + +=== 1.1.0 / 2011-01-11 + +- API CHANGE: UploadIO.convert! removed in favor of UploadIO.new + (Jeff Hodges) + +=== 1.0.1 / 2010-04-27 + +- Doc updates, make gemspec based on more modern Rubygems + +=== 1.0 / 2009-02-12 + +- Many fixes from mlooney, seems to work now. Putting the 0.9 seal of + approval on it. + +=== 0.1 / 2008-08-12 + +* 1 major enhancement + + * Birthday! + diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/Manifest.txt b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/Manifest.txt new file mode 100644 index 0000000..109d8f0 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/Manifest.txt @@ -0,0 +1,9 @@ +lib/composite_io.rb +lib/multipartable.rb +lib/parts.rb +lib/net/http/post/multipart.rb +Manifest.txt +Rakefile +README.txt +test/test_composite_io.rb +test/net/http/post/test_multipart.rb diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/README.md b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/README.md new file mode 100644 index 0000000..fc7eae1 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/README.md @@ -0,0 +1,77 @@ +## multipart-post + +* http://github.com/nicksieger/multipart-post + +![build status](https://travis-ci.org/nicksieger/multipart-post.png) + +#### DESCRIPTION: + +Adds a streamy multipart form post capability to Net::HTTP. Also +supports other methods besides POST. + +#### FEATURES/PROBLEMS: + +* Appears to actually work. A good feature to have. +* Encapsulates posting of file/binary parts and name/value parameter parts, similar to + most browsers' file upload forms. +* Provides an UploadIO helper class to prepare IO objects for inclusion in the params + hash of the multipart post object. + +#### SYNOPSIS: + + require 'net/http/post/multipart' + + url = URI.parse('http://www.example.com/upload') + File.open("./image.jpg") do |jpg| + req = Net::HTTP::Post::Multipart.new url.path, + "file" => UploadIO.new(jpg, "image/jpeg", "image.jpg") + res = Net::HTTP.start(url.host, url.port) do |http| + http.request(req) + end + end + +To post multiple files or attachments, simply include multiple parameters with +UploadIO values: + + require 'net/http/post/multipart' + + url = URI.parse('http://www.example.com/upload') + req = Net::HTTP::Post::Multipart.new url.path, + "file1" => UploadIO.new(File.new("./image.jpg"), "image/jpeg", "image.jpg"), + "file2" => UploadIO.new(File.new("./image2.jpg"), "image/jpeg", "image2.jpg") + res = Net::HTTP.start(url.host, url.port) do |http| + http.request(req) + end + +#### REQUIREMENTS: + +None + +#### INSTALL: + + gem install multipart-post + +#### LICENSE: + +(The MIT License) + +Copyright (c) 2007-2013 Nick Sieger + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/Rakefile b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/Rakefile new file mode 100644 index 0000000..dd85431 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/Rakefile @@ -0,0 +1,9 @@ +require "bundler/gem_tasks" + +task :default => :test + +require 'rake/testtask' +Rake::TestTask.new do |t| + t.libs << "test" + t.test_files = FileList['test/**/test*.rb'] +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/composite_io.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/composite_io.rb new file mode 100644 index 0000000..4ba7cf5 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/composite_io.rb @@ -0,0 +1,108 @@ +#-- +# Copyright (c) 2007-2012 Nick Sieger. +# See the file README.txt included with the distribution for +# software license details. +#++ + +# Concatenate together multiple IO objects into a single, composite IO object +# for purposes of reading as a single stream. +# +# Usage: +# +# crio = CompositeReadIO.new(StringIO.new('one'), StringIO.new('two'), StringIO.new('three')) +# puts crio.read # => "onetwothree" +# +class CompositeReadIO + # Create a new composite-read IO from the arguments, all of which should + # respond to #read in a manner consistent with IO. + def initialize(*ios) + @ios = ios.flatten + @index = 0 + end + + # Read from IOs in order until `length` bytes have been received. + def read(length = nil, outbuf = nil) + got_result = false + outbuf = outbuf ? outbuf.replace("") : "" + + while io = current_io + if result = io.read(length) + got_result ||= !result.nil? + result.force_encoding("BINARY") if result.respond_to?(:force_encoding) + outbuf << result + length -= result.length if length + break if length == 0 + end + advance_io + end + (!got_result && length) ? nil : outbuf + end + + def rewind + @ios.each { |io| io.rewind } + @index = 0 + end + + private + + def current_io + @ios[@index] + end + + def advance_io + @index += 1 + end +end + +# Convenience methods for dealing with files and IO that are to be uploaded. +class UploadIO + # Create an upload IO suitable for including in the params hash of a + # Net::HTTP::Post::Multipart. + # + # Can take two forms. The first accepts a filename and content type, and + # opens the file for reading (to be closed by finalizer). + # + # The second accepts an already-open IO, but also requires a third argument, + # the filename from which it was opened (particularly useful/recommended if + # uploading directly from a form in a framework, which often save the file to + # an arbitrarily named RackMultipart file in /tmp). + # + # Usage: + # + # UploadIO.new("file.txt", "text/plain") + # UploadIO.new(file_io, "text/plain", "file.txt") + # + attr_reader :content_type, :original_filename, :local_path, :io, :opts + + def initialize(filename_or_io, content_type, filename = nil, opts = {}) + io = filename_or_io + local_path = "" + if io.respond_to? :read + # in Ruby 1.9.2, StringIOs no longer respond to path + # (since they respond to :length, so we don't need their local path, see parts.rb:41) + local_path = filename_or_io.respond_to?(:path) ? filename_or_io.path : "local.path" + else + io = File.open(filename_or_io) + local_path = filename_or_io + end + filename ||= local_path + + @content_type = content_type + @original_filename = File.basename(filename) + @local_path = local_path + @io = io + @opts = opts + end + + def self.convert!(io, content_type, original_filename, local_path) + raise ArgumentError, "convert! has been removed. You must now wrap IOs using:\nUploadIO.new(filename_or_io, content_type, filename=nil)\nPlease update your code." + end + + def method_missing(*args) + @io.send(*args) + end + + def respond_to?(meth, include_all = false) + @io.respond_to?(meth, include_all) || super(meth, include_all) + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/multipart_post.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/multipart_post.rb new file mode 100644 index 0000000..76540a8 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/multipart_post.rb @@ -0,0 +1,9 @@ +#-- +# Copyright (c) 2007-2013 Nick Sieger. +# See the file README.txt included with the distribution for +# software license details. +#++ + +module MultipartPost + VERSION = "2.0.0" +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/multipartable.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/multipartable.rb new file mode 100644 index 0000000..28fa41e --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/multipartable.rb @@ -0,0 +1,29 @@ +#-- +# Copyright (c) 2007-2013 Nick Sieger. +# See the file README.txt included with the distribution for +# software license details. +#++ + +require 'parts' + module Multipartable + DEFAULT_BOUNDARY = "-----------RubyMultipartPost" + def initialize(path, params, headers={}, boundary = DEFAULT_BOUNDARY) + headers = headers.clone # don't want to modify the original variable + parts_headers = headers.delete(:parts) || {} + super(path, headers) + parts = params.map do |k,v| + case v + when Array + v.map {|item| Parts::Part.new(boundary, k, item, parts_headers[k]) } + else + Parts::Part.new(boundary, k, v, parts_headers[k]) + end + end.flatten + parts << Parts::EpiloguePart.new(boundary) + ios = parts.map {|p| p.to_io } + self.set_content_type(headers["Content-Type"] || "multipart/form-data", + { "boundary" => boundary }) + self.content_length = parts.inject(0) {|sum,i| sum + i.length } + self.body_stream = CompositeReadIO.new(*ios) + end + end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/net/http/post/multipart.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/net/http/post/multipart.rb new file mode 100644 index 0000000..7570582 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/net/http/post/multipart.rb @@ -0,0 +1,27 @@ +#-- +# Copyright (c) 2007-2012 Nick Sieger. +# See the file README.txt included with the distribution for +# software license details. +#++ + +require 'net/http' +require 'stringio' +require 'cgi' +require 'composite_io' +require 'multipartable' +require 'parts' + +module Net #:nodoc: + class HTTP #:nodoc: + class Put + class Multipart < Put + include Multipartable + end + end + class Post #:nodoc: + class Multipart < Post + include Multipartable + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/parts.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/parts.rb new file mode 100644 index 0000000..c06cbd9 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/lib/parts.rb @@ -0,0 +1,96 @@ +#-- +# Copyright (c) 2007-2013 Nick Sieger. +# See the file README.txt included with the distribution for +# software license details. +#++ + +module Parts + module Part #:nodoc: + def self.new(boundary, name, value, headers = {}) + headers ||= {} # avoid nil values + if file?(value) + FilePart.new(boundary, name, value, headers) + else + ParamPart.new(boundary, name, value, headers) + end + end + + def self.file?(value) + value.respond_to?(:content_type) && value.respond_to?(:original_filename) + end + + def length + @part.length + end + + def to_io + @io + end + end + + class ParamPart + include Part + def initialize(boundary, name, value, headers = {}) + @part = build_part(boundary, name, value, headers) + @io = StringIO.new(@part) + end + + def length + @part.bytesize + end + + def build_part(boundary, name, value, headers = {}) + part = '' + part << "--#{boundary}\r\n" + part << "Content-Disposition: form-data; name=\"#{name.to_s}\"\r\n" + part << "Content-Type: #{headers["Content-Type"]}\r\n" if headers["Content-Type"] + part << "\r\n" + part << "#{value}\r\n" + end + end + + # Represents a part to be filled from file IO. + class FilePart + include Part + attr_reader :length + def initialize(boundary, name, io, headers = {}) + file_length = io.respond_to?(:length) ? io.length : File.size(io.local_path) + @head = build_head(boundary, name, io.original_filename, io.content_type, file_length, + io.respond_to?(:opts) ? io.opts.merge(headers) : headers) + @foot = "\r\n" + @length = @head.bytesize + file_length + @foot.length + @io = CompositeReadIO.new(StringIO.new(@head), io, StringIO.new(@foot)) + end + + def build_head(boundary, name, filename, type, content_len, opts = {}, headers = {}) + trans_encoding = opts["Content-Transfer-Encoding"] || "binary" + content_disposition = opts["Content-Disposition"] || "form-data" + + part = '' + part << "--#{boundary}\r\n" + part << "Content-Disposition: #{content_disposition}; name=\"#{name.to_s}\"; filename=\"#{filename}\"\r\n" + part << "Content-Length: #{content_len}\r\n" + if content_id = opts["Content-ID"] + part << "Content-ID: #{content_id}\r\n" + end + + if headers["Content-Type"] != nil + part << "Content-Type: " + headers["Content-Type"] + "\r\n" + else + part << "Content-Type: #{type}\r\n" + end + + part << "Content-Transfer-Encoding: #{trans_encoding}\r\n" + part << "\r\n" + end + end + + # Represents the epilogue or closing boundary. + class EpiloguePart + include Part + def initialize(boundary) + @part = "--#{boundary}--\r\n\r\n" + @io = StringIO.new(@part) + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/multipart-post.gemspec b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/multipart-post.gemspec new file mode 100644 index 0000000..6954f09 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/multipart-post.gemspec @@ -0,0 +1,22 @@ +# -*- encoding: utf-8 -*- +$:.push File.expand_path("../lib", __FILE__) +require "multipart_post" + +Gem::Specification.new do |s| + s.name = "multipart-post" + s.version = MultipartPost::VERSION + s.authors = ["Nick Sieger"] + s.email = ["nick@nicksieger.com"] + s.homepage = "https://github.com/nicksieger/multipart-post" + s.summary = %q{A multipart form post accessory for Net::HTTP.} + s.license = "MIT" + s.description = %q{Use with Net::HTTP to do multipart form posts. IO values that have #content_type, #original_filename, and #local_path will be posted as a binary file.} + + s.rubyforge_project = "caldersphere" + + s.files = `git ls-files`.split("\n") + s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") + s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } + s.rdoc_options = ["--main", "README.md", "-SHN", "-f", "darkfish"] + s.require_paths = ["lib"] +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/multibyte.txt b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/multibyte.txt new file mode 100644 index 0000000..24a84b0 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/multibyte.txt @@ -0,0 +1 @@ +ファイル diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/net/http/post/test_multipart.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/net/http/post/test_multipart.rb new file mode 100644 index 0000000..c127e0a --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/net/http/post/test_multipart.rb @@ -0,0 +1,110 @@ +#-- +# Copyright (c) 2007-2013 Nick Sieger. +# See the file README.txt included with the distribution for +# software license details. +#++ + +require 'net/http/post/multipart' +require 'test/unit' + +class Net::HTTP::Post::MultiPartTest < Test::Unit::TestCase + TEMP_FILE = "temp.txt" + + HTTPPost = Struct.new("HTTPPost", :content_length, :body_stream, :content_type) + HTTPPost.module_eval do + def set_content_type(type, params = {}) + self.content_type = type + params.map{|k,v|"; #{k}=#{v}"}.join('') + end + end + + def teardown + File.delete(TEMP_FILE) rescue nil + end + + def test_form_multipart_body + File.open(TEMP_FILE, "w") {|f| f << "1234567890"} + @io = File.open(TEMP_FILE) + @io = UploadIO.new @io, "text/plain", TEMP_FILE + assert_results Net::HTTP::Post::Multipart.new("/foo/bar", :foo => 'bar', :file => @io) + end + def test_form_multipart_body_put + File.open(TEMP_FILE, "w") {|f| f << "1234567890"} + @io = File.open(TEMP_FILE) + @io = UploadIO.new @io, "text/plain", TEMP_FILE + assert_results Net::HTTP::Put::Multipart.new("/foo/bar", :foo => 'bar', :file => @io) + end + + def test_form_multipart_body_with_stringio + @io = StringIO.new("1234567890") + @io = UploadIO.new @io, "text/plain", TEMP_FILE + assert_results Net::HTTP::Post::Multipart.new("/foo/bar", :foo => 'bar', :file => @io) + end + + def test_form_multiparty_body_with_parts_headers + @io = StringIO.new("1234567890") + @io = UploadIO.new @io, "text/plain", TEMP_FILE + parts = { :text => 'bar', :file => @io } + headers = { + :parts => { + :text => { "Content-Type" => "part/type" }, + :file => { "Content-Transfer-Encoding" => "part-encoding" } + } + } + + request = Net::HTTP::Post::Multipart.new("/foo/bar", parts, headers) + assert_results request + assert_additional_headers_added(request, headers[:parts]) + end + + def test_form_multipart_body_with_array_value + File.open(TEMP_FILE, "w") {|f| f << "1234567890"} + @io = File.open(TEMP_FILE) + @io = UploadIO.new @io, "text/plain", TEMP_FILE + params = {:foo => ['bar', 'quux'], :file => @io} + headers = { :parts => { + :foo => { "Content-Type" => "application/json; charset=UTF-8" } } } + post = Net::HTTP::Post::Multipart.new("/foo/bar", params, headers, + Net::HTTP::Post::Multipart::DEFAULT_BOUNDARY) + + assert post.content_length && post.content_length > 0 + assert post.body_stream + + body = post.body_stream.read + assert_equal 2, body.lines.grep(/name="foo"/).length + assert body =~ /Content-Type: application\/json; charset=UTF-8/, body + end + + def test_form_multipart_body_with_arrayparam + File.open(TEMP_FILE, "w") {|f| f << "1234567890"} + @io = File.open(TEMP_FILE) + @io = UploadIO.new @io, "text/plain", TEMP_FILE + assert_results Net::HTTP::Post::Multipart.new("/foo/bar", :multivalueParam => ['bar','bah'], :file => @io) + end + + def assert_results(post) + assert post.content_length && post.content_length > 0 + assert post.body_stream + assert_equal "multipart/form-data; boundary=#{Multipartable::DEFAULT_BOUNDARY}", post['content-type'] + body = post.body_stream.read + boundary_regex = Regexp.quote Multipartable::DEFAULT_BOUNDARY + assert body =~ /1234567890/ + # ensure there is at least one boundary + assert body =~ /^--#{boundary_regex}\r\n/ + # ensure there is an epilogue + assert body =~ /^--#{boundary_regex}--\r\n/ + assert body =~ /text\/plain/ + if (body =~ /multivalueParam/) + assert_equal 2, body.scan(/^.*multivalueParam.*$/).size + end + end + + def assert_additional_headers_added(post, parts_headers) + post.body_stream.rewind + body = post.body_stream.read + parts_headers.each do |part, headers| + headers.each do |k,v| + assert body =~ /#{k}: #{v}/ + end + end + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/test_composite_io.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/test_composite_io.rb new file mode 100644 index 0000000..6e8a193 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/test_composite_io.rb @@ -0,0 +1,115 @@ +#-- +# Copyright (c) 2007-2013 Nick Sieger. +# See the file README.txt included with the distribution for +# software license details. +#++ + +require 'composite_io' +require 'stringio' +require 'test/unit' +require 'timeout' + +class CompositeReadIOTest < Test::Unit::TestCase + def setup + @io = CompositeReadIO.new(CompositeReadIO.new(StringIO.new('the '), StringIO.new('quick ')), + StringIO.new('brown '), StringIO.new('fox')) + end + + def test_full_read_from_several_ios + assert_equal 'the quick brown fox', @io.read + end + + unless RUBY_VERSION < '1.9' + def test_read_from_multibyte + utf8 = File.open(File.dirname(__FILE__)+'/multibyte.txt') + binary = StringIO.new("\x86") + @io = CompositeReadIO.new(binary,utf8) + + expect = "\x86\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\n" + expect.force_encoding('BINARY') if expect.respond_to?(:force_encoding) + assert_equal expect, @io.read + end + end + + def test_partial_read + assert_equal 'the quick', @io.read(9) + end + + def test_partial_read_to_boundary + assert_equal 'the quick ', @io.read(10) + end + + def test_read_with_size_larger_than_available + assert_equal 'the quick brown fox', @io.read(32) + end + + def test_read_into_buffer + buf = '' + @io.read(nil, buf) + assert_equal 'the quick brown fox', buf + end + + def test_multiple_reads + assert_equal 'the ', @io.read(4) + assert_equal 'quic', @io.read(4) + assert_equal 'k br', @io.read(4) + assert_equal 'own ', @io.read(4) + assert_equal 'fox', @io.read(4) + end + + def test_read_after_end + @io.read + assert_equal "", @io.read + end + + def test_read_after_end_with_amount + @io.read(32) + assert_equal nil, @io.read(32) + end + + def test_second_full_read_after_rewinding + @io.read + @io.rewind + assert_equal 'the quick brown fox', @io.read + end + + def test_convert_error + assert_raises(ArgumentError) { + UploadIO.convert!('tmp.txt', 'text/plain', 'tmp.txt', 'tmp.txt') + } + end + + ## FIXME excluding on JRuby due to + ## http://jira.codehaus.org/browse/JRUBY-7109 + if IO.respond_to?(:copy_stream) && !defined?(JRUBY_VERSION) + def test_compatible_with_copy_stream + target_io = StringIO.new + Timeout.timeout(1) do + IO.copy_stream(@io, target_io) + end + assert_equal "the quick brown fox", target_io.string + end + end + + def test_empty + io = CompositeReadIO.new + assert_equal "", io.read + end + + def test_empty_limited + io = CompositeReadIO.new + assert_nil io.read(1) + end + + def test_empty_parts + io = CompositeReadIO.new(StringIO.new, StringIO.new('the '), StringIO.new, StringIO.new('quick')) + assert_equal "the", io.read(3) + assert_equal " qu", io.read(3) + assert_equal "ick", io.read(4) + end + + def test_all_empty_parts + io = CompositeReadIO.new(StringIO.new, StringIO.new) + assert_nil io.read(1) + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/test_parts.rb b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/test_parts.rb new file mode 100644 index 0000000..33c1e39 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/gems/multipart-post-2.0.0/test/test_parts.rb @@ -0,0 +1,86 @@ +#-- +# Copyright (c) 2007-2012 Nick Sieger. +# See the file README.txt included with the distribution for +# software license details. +#++ + +require 'test/unit' + +require 'parts' +require 'stringio' +require 'composite_io' +require 'tempfile' + + +MULTIBYTE = File.dirname(__FILE__)+'/multibyte.txt' +TEMP_FILE = "temp.txt" + +module AssertPartLength + def assert_part_length(part) + bytes = part.to_io.read + bytesize = bytes.respond_to?(:bytesize) ? bytes.bytesize : bytes.length + assert_equal bytesize, part.length + end +end + +class PartTest < Test::Unit::TestCase + def setup + @string_with_content_type = Class.new(String) do + def content_type; 'application/data'; end + end + end + + def test_file_with_upload_io + assert Parts::Part.file?(UploadIO.new(__FILE__, "text/plain")) + end + + def test_file_with_modified_string + assert !Parts::Part.file?(@string_with_content_type.new("Hello")) + end + + def test_new_with_modified_string + assert_kind_of Parts::ParamPart, + Parts::Part.new("boundary", "multibyte", @string_with_content_type.new("Hello")) + end +end + +class FilePartTest < Test::Unit::TestCase + include AssertPartLength + + def setup + File.open(TEMP_FILE, "w") {|f| f << "1234567890"} + io = UploadIO.new(TEMP_FILE, "text/plain") + @part = Parts::FilePart.new("boundary", "afile", io) + end + + def teardown + File.delete(TEMP_FILE) rescue nil + end + + def test_correct_length + assert_part_length @part + end + + def test_multibyte_file_length + assert_part_length Parts::FilePart.new("boundary", "multibyte", UploadIO.new(MULTIBYTE, "text/plain")) + end + + def test_multibyte_filename + name = File.read(MULTIBYTE, 300) + file = Tempfile.new(name.respond_to?(:force_encoding) ? name.force_encoding("UTF-8") : name) + assert_part_length Parts::FilePart.new("boundary", "multibyte", UploadIO.new(file, "text/plain")) + file.close + end +end + +class ParamPartTest < Test::Unit::TestCase + include AssertPartLength + + def setup + @part = Parts::ParamPart.new("boundary", "multibyte", File.read(MULTIBYTE)) + end + + def test_correct_length + assert_part_length @part + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/alphred-1.1.1.gemspec b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/alphred-1.1.1.gemspec new file mode 100644 index 0000000..936837b --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/alphred-1.1.1.gemspec @@ -0,0 +1,37 @@ +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = "alphred" + s.version = "1.1.1" + + s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= + s.authors = ["Alpha Chen"] + s.date = "2015-11-05" + s.email = ["alpha.chen@gmail.com"] + s.homepage = "https://github.com/kejadlen/alph" + s.licenses = ["MIT"] + s.require_paths = ["lib"] + s.rubygems_version = "2.0.14" + s.summary = "Helper utilities for making Alfred workflows." + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q, ["~> 3.2"]) + s.add_development_dependency(%q, ["~> 1.10"]) + s.add_development_dependency(%q, ["~> 10.0"]) + s.add_development_dependency(%q, [">= 0"]) + else + s.add_dependency(%q, ["~> 3.2"]) + s.add_dependency(%q, ["~> 1.10"]) + s.add_dependency(%q, ["~> 10.0"]) + s.add_dependency(%q, [">= 0"]) + end + else + s.add_dependency(%q, ["~> 3.2"]) + s.add_dependency(%q, ["~> 1.10"]) + s.add_dependency(%q, ["~> 10.0"]) + s.add_dependency(%q, [">= 0"]) + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/builder-3.2.2.gemspec b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/builder-3.2.2.gemspec new file mode 100644 index 0000000..5a2853d --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/builder-3.2.2.gemspec @@ -0,0 +1,20 @@ +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = "builder" + s.version = "3.2.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= + s.authors = ["Jim Weirich"] + s.date = "2013-06-01" + s.description = "Builder provides a number of builder objects that make creating structured data\nsimple to do. Currently the following builder objects are supported:\n\n* XML Markup\n* XML Events\n" + s.email = "jim.weirich@gmail.com" + s.extra_rdoc_files = ["CHANGES", "MIT-LICENSE", "README.md", "Rakefile", "doc/releases/builder-1.2.4.rdoc", "doc/releases/builder-2.0.0.rdoc", "doc/releases/builder-2.1.1.rdoc"] + s.files = ["CHANGES", "MIT-LICENSE", "README.md", "Rakefile", "doc/releases/builder-1.2.4.rdoc", "doc/releases/builder-2.0.0.rdoc", "doc/releases/builder-2.1.1.rdoc"] + s.homepage = "http://onestepback.org" + s.licenses = ["MIT"] + s.rdoc_options = ["--title", "Builder -- Easy XML Building", "--main", "README.rdoc", "--line-numbers"] + s.require_paths = ["lib"] + s.rubygems_version = "2.0.14" + s.summary = "Builders for MarkUp." +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/faraday-0.9.2.gemspec b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/faraday-0.9.2.gemspec new file mode 100644 index 0000000..f77cd1d --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/faraday-0.9.2.gemspec @@ -0,0 +1,28 @@ +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = "faraday" + s.version = "0.9.2" + + s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= + s.authors = ["Rick Olson"] + s.date = "2015-10-05" + s.email = "technoweenie@gmail.com" + s.homepage = "https://github.com/lostisland/faraday" + s.licenses = ["MIT"] + s.require_paths = ["lib"] + s.rubygems_version = "2.0.14" + s.summary = "HTTP/REST API client library." + + if s.respond_to? :specification_version then + s.specification_version = 3 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q, ["< 3", ">= 1.2"]) + else + s.add_dependency(%q, ["< 3", ">= 1.2"]) + end + else + s.add_dependency(%q, ["< 3", ">= 1.2"]) + end +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/multipart-post-2.0.0.gemspec b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/multipart-post-2.0.0.gemspec new file mode 100644 index 0000000..21bff89 --- /dev/null +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.D0D5DB4B-1204-4DB1-BAB0-A1A122E8ABCA/vendor/bundle/ruby/2.0.0/specifications/multipart-post-2.0.0.gemspec @@ -0,0 +1,19 @@ +# -*- encoding: utf-8 -*- + +Gem::Specification.new do |s| + s.name = "multipart-post" + s.version = "2.0.0" + + s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= + s.authors = ["Nick Sieger"] + s.date = "2013-12-21" + s.description = "Use with Net::HTTP to do multipart form posts. IO values that have #content_type, #original_filename, and #local_path will be posted as a binary file." + s.email = ["nick@nicksieger.com"] + s.homepage = "https://github.com/nicksieger/multipart-post" + s.licenses = ["MIT"] + s.rdoc_options = ["--main", "README.md", "-SHN", "-f", "darkfish"] + s.require_paths = ["lib"] + s.rubyforge_project = "caldersphere" + s.rubygems_version = "2.0.14" + s.summary = "A multipart form post accessory for Net::HTTP." +end diff --git a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.EBB6171A-6C0B-447C-8BE5-E273C925A74F/info.plist b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.EBB6171A-6C0B-447C-8BE5-E273C925A74F/info.plist index cc2f0ce..dc51754 100644 --- a/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.EBB6171A-6C0B-447C-8BE5-E273C925A74F/info.plist +++ b/Alfred 2/Alfred.alfredpreferences/workflows/user.workflow.EBB6171A-6C0B-447C-8BE5-E273C925A74F/info.plist @@ -9,7 +9,16 @@ connections 1FB4AA4F-276E-4B9E-B48B-D6119EE1B6AE - + + + destinationuid + 43DCD79F-94B0-4F0D-B7C2-4F04DC7ECE20 + modifiers + 0 + modifiersubtext + + + 2E57B3A5-B65F-4AB6-93B2-183BB082414B