Gem::Server
Gem::Server and allows users to serve gems for consumption by `gem –remote-install`.
gem_server starts an HTTP server on the given port and serves the following:
-
“/” - Browsing of gem spec files for installed gems
-
“/specs.#{Gem.marshal_version}.gz” - specs name/version/platform index
-
“/latest_specs.#{Gem.marshal_version}.gz” - latest specs name/version/platform index
-
“/quick/” - Individual gemspecs
-
“/gems” - Direct access to download the installable gems
-
“/rdoc?q=” - Search for installed rdoc documentation
Usage
gem_server = Gem::Server.new Gem.dir, 8089, false gem_server.run
Included modules
- ERB::Util
- Gem::UserInteraction
Constants
DOC_TEMPLATE = <<-'ERB'\n<?xml version="1.0" encoding="iso-8859-1"?>\n<!DOCTYPE html\nPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n<head>\n<title>RubyGems Documentation Index</title>\n<link rel="stylesheet" href="gem-server-rdoc-style.css" type="text/css" media="screen" />\n</head>\n<body>\n<div id="fileHeader">\n<%= SEARCH %>\n<h1>RubyGems Documentation Index</h1>\n</div>\n<!-- banner header -->\n\n<div id="bodyContent">\n<div id="contextContent">\n<div id="description">\n<h1>Summary</h1>\n<p>There are <%=values["gem_count"]%> gems installed:</p>\n<p>\n<%= values["specs"].map { |v| "<a href=\\"##{u v["name"]}\\">#{h v["name"]}</a>" }.join ', ' %>.\n<h1>Gems</h1>\n\n<dl>\n<% values["specs"].each do |spec| %>\n<dt>\n<% if spec["first_name_entry"] then %>\n<a name="<%=h spec["name"]%>"></a>\n<% end %>\n\n<b><%=h spec["name"]%> <%=h spec["version"]%></b>\n\n<% if spec["ri_installed"] || spec["rdoc_installed"] then %>\n<a href="<%=spec["doc_path"]%>">[rdoc]</a>\n<% else %>\n<span title="rdoc not installed">[rdoc]</span>\n<% end %>\n\n<% if spec["homepage"] then %>\n<a href="<%=uri_encode spec["homepage"]%>" title="<%=h spec["homepage"]%>">[www]</a>\n<% else %>\n<span title="no homepage available">[www]</span>\n<% end %>\n\n<% if spec["has_deps"] then %>\n- depends on\n<%= spec["dependencies"].map { |v| "<a href=\\"##{u v["name"]}\\">#{h v["name"]}</a>" }.join ', ' %>.\n<% end %>\n</dt>\n<dd>\n<%=spec["summary"]%>\n<% if spec["executables"] then %>\n<br/>\n\n<% if spec["only_one_executable"] then %>\nExecutable is\n<% else %>\nExecutables are\n<%end%>\n\n<%= spec["executables"].map { |v| "<span class=\\"context-item-name\\">#{h v["executable"]}</span>"}.join ', ' %>.\n\n<%end%>\n<br/>\n<br/>\n</dd>\n<% end %>\n</dl>\n\n</div>\n</div>\n</div>\n<div id="validator-badges">\n<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>\n</div>\n</body>\n</html>\nERB
RDOC_CSS = <<-CSS\nbody {\nfont-family: Verdana,Arial,Helvetica,sans-serif;\nfont-size: 90%;\nmargin: 0;\nmargin-left: 40px;\npadding: 0;\nbackground: white;\n}\n\nh1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }\nh1 { font-size: 150%; }\nh2,h3,h4 { margin-top: 1em; }\n\na { background: #eef; color: #039; text-decoration: none; }\na:hover { background: #039; color: #eef; }\n\n/* Override the base stylesheets Anchor inside a table cell */\ntd > a {\nbackground: transparent;\ncolor: #039;\ntext-decoration: none;\n}\n\n/* and inside a section title */\n.section-title > a {\nbackground: transparent;\ncolor: #eee;\ntext-decoration: none;\n}\n\n/* === Structural elements =================================== */\n\ndiv#index {\nmargin: 0;\nmargin-left: -40px;\npadding: 0;\nfont-size: 90%;\n}\n\n\ndiv#index a {\nmargin-left: 0.7em;\n}\n\ndiv#index .section-bar {\nmargin-left: 0px;\npadding-left: 0.7em;\nbackground: #ccc;\nfont-size: small;\n}\n\n\ndiv#classHeader, div#fileHeader {\nwidth: auto;\ncolor: white;\npadding: 0.5em 1.5em 0.5em 1.5em;\nmargin: 0;\nmargin-left: -40px;\nborder-bottom: 3px solid #006;\n}\n\ndiv#classHeader a, div#fileHeader a {\nbackground: inherit;\ncolor: white;\n}\n\ndiv#classHeader td, div#fileHeader td {\nbackground: inherit;\ncolor: white;\n}\n\n\ndiv#fileHeader {\nbackground: #057;\n}\n\ndiv#classHeader {\nbackground: #048;\n}\n\n\n.class-name-in-header {\nfont-size: 180%;\nfont-weight: bold;\n}\n\n\ndiv#bodyContent {\npadding: 0 1.5em 0 1.5em;\n}\n\ndiv#description {\npadding: 0.5em 1.5em;\nbackground: #efefef;\nborder: 1px dotted #999;\n}\n\ndiv#description h1,h2,h3,h4,h5,h6 {\ncolor: #125;;\nbackground: transparent;\n}\n\ndiv#validator-badges {\ntext-align: center;\n}\ndiv#validator-badges img { border: 0; }\n\ndiv#copyright {\ncolor: #333;\nbackground: #efefef;\nfont: 0.75em sans-serif;\nmargin-top: 5em;\nmargin-bottom: 0;\npadding: 0.5em 2em;\n}\n\n\n/* === Classes =================================== */\n\ntable.header-table {\ncolor: white;\nfont-size: small;\n}\n\n.type-note {\nfont-size: small;\ncolor: #DEDEDE;\n}\n\n.xxsection-bar {\nbackground: #eee;\ncolor: #333;\npadding: 3px;\n}\n\n.section-bar {\ncolor: #333;\nborder-bottom: 1px solid #999;\nmargin-left: -20px;\n}\n\n\n.section-title {\nbackground: #79a;\ncolor: #eee;\npadding: 3px;\nmargin-top: 2em;\nmargin-left: -30px;\nborder: 1px solid #999;\n}\n\n.top-aligned-row { vertical-align: top }\n.bottom-aligned-row { vertical-align: bottom }\n\n/* --- Context section classes ----------------------- */\n\n.context-row { }\n.context-item-name { font-family: monospace; font-weight: bold; color: black; }\n.context-item-value { font-size: small; color: #448; }\n.context-item-desc { color: #333; padding-left: 2em; }\n\n/* --- Method classes -------------------------- */\n.method-detail {\nbackground: #efefef;\npadding: 0;\nmargin-top: 0.5em;\nmargin-bottom: 1em;\nborder: 1px dotted #ccc;\n}\n.method-heading {\ncolor: black;\nbackground: #ccc;\nborder-bottom: 1px solid #666;\npadding: 0.2em 0.5em 0 0.5em;\n}\n.method-signature { color: black; background: inherit; }\n.method-name { font-weight: bold; }\n.method-args { font-style: italic; }\n.method-description { padding: 0 0.5em 0 0.5em; }\n\n/* --- Source code sections -------------------- */\n\na.source-toggle { font-size: 90%; }\ndiv.method-source-code {\nbackground: #262626;\ncolor: #ffdead;\nmargin: 1em;\npadding: 0.5em;\nborder: 1px dashed #999;\noverflow: hidden;\n}\n\ndiv.method-source-code pre { color: #ffdead; overflow: hidden; }\n\n/* --- Ruby keyword styles --------------------- */\n\n.standalone-code { background: #221111; color: #ffdead; overflow: hidden; }\n\n.ruby-constant { color: #7fffd4; background: transparent; }\n.ruby-keyword { color: #00ffff; background: transparent; }\n.ruby-ivar { color: #eedd82; background: transparent; }\n.ruby-operator { color: #00ffee; background: transparent; }\n.ruby-identifier { color: #ffdead; background: transparent; }\n.ruby-node { color: #ffa07a; background: transparent; }\n.ruby-comment { color: #b22222; font-weight: bold; background: transparent; }\n.ruby-regexp { color: #ffa07a; background: transparent; }\n.ruby-value { color: #7fffd4; background: transparent; }\nCSS
RDOC_NO_DOCUMENTATION = <<-'ERB'\n<?xml version="1.0" encoding="iso-8859-1"?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n<head>\n<title>Found documentation</title>\n<link rel="stylesheet" href="gem-server-rdoc-style.css" type="text/css" media="screen" />\n</head>\n<body>\n<div id="fileHeader">\n<%= SEARCH %>\n<h1>No documentation found</h1>\n</div>\n\n<div id="bodyContent">\n<div id="contextContent">\n<div id="description">\n<p>No gems matched <%= h query.inspect %></p>\n\n<p>\nBack to <a href="/">complete gem index</a>\n</p>\n\n</div>\n</div>\n</div>\n<div id="validator-badges">\n<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>\n</div>\n</body>\n</html>\nERB
RDOC_SEARCH_TEMPLATE = <<-'ERB'\n<?xml version="1.0" encoding="iso-8859-1"?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n<head>\n<title>Found documentation</title>\n<link rel="stylesheet" href="gem-server-rdoc-style.css" type="text/css" media="screen" />\n</head>\n<body>\n<div id="fileHeader">\n<%= SEARCH %>\n<h1>Found documentation</h1>\n</div>\n<!-- banner header -->\n\n<div id="bodyContent">\n<div id="contextContent">\n<div id="description">\n<h1>Summary</h1>\n<p><%=doc_items.length%> documentation topics found.</p>\n<h1>Topics</h1>\n\n<dl>\n<% doc_items.each do |doc_item| %>\n<dt>\n<b><%=doc_item[:name]%></b>\n<a href="<%=u doc_item[:url]%>">[rdoc]</a>\n</dt>\n<dd>\n<%=h doc_item[:summary]%>\n<br/>\n<br/>\n</dd>\n<% end %>\n</dl>\n\n<p>\nBack to <a href="/">complete gem index</a>\n</p>\n\n</div>\n</div>\n</div>\n<div id="validator-badges">\n<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>\n</div>\n</body>\n</html>\nERB
SEARCH = <<-ERB\n<form class="headerSearch" name="headerSearchForm" method="get" action="/rdoc">\n<div id="search" style="float:right">\n<label for="q">Filter/Search</label>\n<input id="q" type="text" style="width:10em" name="q">\n<button type="submit" style="display:none"></button>\n</div>\n</form>\nERB
Attributes
| [R] | spec_dirs |
Files
- lib/rubygems/server.rb