{"id":18103153,"url":"https://github.com/mdub/sham_rack","last_synced_at":"2025-04-04T14:07:28.969Z","repository":{"id":560506,"uuid":"191405","full_name":"mdub/sham_rack","owner":"mdub","description":"run Rack applications in-process, without a server","archived":false,"fork":false,"pushed_at":"2021-11-18T09:52:05.000Z","size":110,"stargazers_count":167,"open_issues_count":3,"forks_count":15,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-04-24T15:18:51.361Z","etag":null,"topics":["rack","ruby","sinatra"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mdub.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2009-05-03T11:08:34.000Z","updated_at":"2023-01-02T18:01:56.000Z","dependencies_parsed_at":"2022-07-04T23:31:15.286Z","dependency_job_id":null,"html_url":"https://github.com/mdub/sham_rack","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdub%2Fsham_rack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdub%2Fsham_rack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdub%2Fsham_rack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdub%2Fsham_rack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mdub","download_url":"https://codeload.github.com/mdub/sham_rack/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247190250,"owners_count":20898702,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["rack","ruby","sinatra"],"created_at":"2024-10-31T22:10:37.228Z","updated_at":"2025-04-04T14:07:28.943Z","avatar_url":"https://github.com/mdub.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"ShamRack\n========\n\n[![Gem Version](https://badge.fury.io/rb/sham_rack.svg)](https://badge.fury.io/rb/sham_rack)\n[![Build Status](https://travis-ci.org/mdub/sham_rack.svg?branch=master)](https://travis-ci.org/mdub/sham_rack)\n\nShamRack plumbs HTTP requests into [Rack][rack].\n\nWhat's it for, again?\n---------------------\n\nWell, it makes it easy to _stub out external (HTTP) services_, which is handy in development and testing environments, or when you want to _test your HTTP client code_.\n\nYou can also use it to _test your Rack application_ (or Sinatra, or Rails, or Merb) using a variety of HTTP client libraries, to check interoperability. For instance, you could test your app using:\n\n* [`rest-client`][rest-client]\n* [`httparty`][httparty]\n* [`oauth`][oauth]\n\nall without having to boot it in a server.\n\nInstalling it\n-------------\n\n    gem install sham_rack\n\nUsing it\n--------\n\n### A simple inline application\n\n    require 'sham_rack'\n\n    ShamRack.at(\"www.greetings.com\") do |env|\n      [\"200 OK\", { \"Content-type\" =\u003e \"text/plain\" }, [\"Hello, world!\"]]\n    end\n\n    require 'open-uri'\n    open(\"http://www.greetings.com/\").read            #=\u003e \"Hello, world!\"\n\n### Sinatra integration\n\n    ShamRack.at(\"sinatra.xyz\").sinatra do\n      get \"/hello/:subject\" do\n        \"Hello, #{params[:subject]}\"\n      end\n    end\n\n    open(\"http://sinatra.xyz/hello/stranger\").read  #=\u003e \"Hello, stranger\"\n\n### Rackup support\n\n    ShamRack.at(\"rackup.xyz\").rackup do\n      use Some::Middleware\n      use Some::Other::Middleware\n      run MyApp.new\n    end\n\n### Any old Rack app\n\n    ShamRack.at(\"google.com\").mount(my_google_stub)\n\n### General-purpose stubbing\n\n    @stub_app = ShamRack.at(\"stubbed.com\").stub\n    @stub_app.register_resource(\"/greeting\", \"Hello, world!\", \"text/plain\")\n\n    open(\"http://stubbed.com/greeting\").read       #=\u003e \"Hello, world!\"\n    @stub_app.last_request.path                    #=\u003e \"/greeting\"\n\n\n### On a specific port\n\n    ShamRack.at(\"example.com\", 8080) do |env|\n      [\"200 OK\", { \"Content-type\" =\u003e \"text/plain\" }, [\"Hello, world!\"]]\n    end\n\nOr, just use Sinatra, as described above ... it's almost as succinct, and heaps more powerful.\n\n### Avoiding (accidental) real network connections\n\n    ShamRack.prevent_network_connections\n\n### When you're done testing\n\n    ShamRack.reset\n\n    open(\"http://stubbed.com/greeting\").read       #=\u003e OpenURI::HTTPError\n\nSupported HTTP client libraries\n-------------------------------\n\n### Net::HTTP and friends\n\nShamRack supports requests made using Net::HTTP, or any of the numerous APIs built on top of it:\n\n    uri = URI.parse(\"http://www.greetings.com/\")\n    Net::HTTP.get_response(uri).body                      #=\u003e \"Hello, world!\"\n\n    require 'open-uri'\n    open(\"http://www.greetings.com/\").read                #=\u003e \"Hello, world!\"\n\n    require 'restclient'\n    RestClient.get(\"http://www.greetings.com/\").to_s      #=\u003e \"Hello, world!\"\n\n    require 'mechanize'\n    Mechanize.new.get(\"http://www.greetings.com/\").body   #=\u003e \"Hello, world!\"\n\n### Patron (experimental)\n\nWe've recently added support for [Patron][patron]:\n\n    require 'sham_rack/patron'\n\n    patron = Patron::Session.new\n    patron.get(\"http://www.greetings.com/\").body          #=\u003e \"Hello, world!\"\n\nWhat's the catch?\n-----------------\n\n* Your Rack request-handling code runs in the same Ruby VM, in fact the same Thread, as your request.\n\nThanks to\n---------\n\n* Blaine Cook for [FakeWeb][fakeweb], which was an inspiration for ShamRack.\n* Perryn Fowler for his efforts plumbing Net::HTTP into ActionController::TestProcess.\n* Christian Neukirchen et al for the chewy goodness that is [Rack][rack].\n\n[rack]: http://rack.rubyforge.org/\n[sinatra]: http://www.sinatrarb.com/\n[rest-client]: http://github.com/adamwiggins/rest-client\n[httparty]: http://github.com/jnunemaker/httparty\n[oauth]: http://oauth.rubyforge.org/\n[fakeweb]: http://fakeweb.rubyforge.org/\n[mechanize]: http://mechanize.rubyforge.org\n[patron]: http://github.com/toland/Patron\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmdub%2Fsham_rack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmdub%2Fsham_rack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmdub%2Fsham_rack/lists"}