rubygems-source 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .rvmrc
6
+ config.ru
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "features/rubygems-source-features"]
2
+ path = features/rubygems-source-features
3
+ url = git@github.com:kapoq/rubygems-source-features.git
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in rubygems-server.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,111 @@
1
+ rubygems-source ![travis-ci](https://secure.travis-ci.org/textgoeshere/rubygems-source.png)
2
+ ===============
3
+
4
+ `rubygems-source` is a remote source server for Rubygems that implements the
5
+ core Rubygems gem source web API.
6
+
7
+ Use it to host private or local dev gem servers.
8
+
9
+ Usage
10
+ -----
11
+
12
+ ### Start yr server ###
13
+
14
+ Create a `config.ru` like this (there's an example `config.ru.example`
15
+ included):
16
+
17
+ require "rubygems-source"
18
+
19
+ Rubygems::Source::App.public_folder = "/var/gems/" # or wherever
20
+ run Rubygems::Source::App
21
+
22
+ And rack up the `config.ru` with `passenger`, `thin`, `unicorn` etc.
23
+
24
+ Ensure `public_folder` is writeable by the server user.
25
+
26
+ Adapt `config.ru` to install Rack middleware if you need HTTP
27
+ authentication etc.
28
+
29
+ ### Configure yr rubygems ###
30
+
31
+ You need to configure rubygems wherever you want to use your new source server.
32
+
33
+ If you use Bundler, add it to the top of your `Gemfile`s:
34
+
35
+ source "http://gems.example.com"
36
+
37
+ To make the new source server available to your entire Rubygems installation:
38
+
39
+ $ gem sources --add http://gems.example.com
40
+
41
+ You can also add the new source to your `.gemrc`s directly.
42
+
43
+ You can now find and install gems from the new source server.
44
+
45
+ $ gem list -r mygem
46
+ $ gem install mygem
47
+
48
+ You can also push gems to the server. **Be sure to specify the host**.
49
+
50
+ $ gem push pkg/mygem-0.0.2.gem --host http://gems.example.com
51
+
52
+ Check out
53
+ [rubygems-source-cli](https://github.com/kapoq/rubygems-source-cli)
54
+ for some patches to `gem yank` and `gem push` so they work better with
55
+ non-Rubygems.org sources.
56
+
57
+ Requirements
58
+ ------------
59
+
60
+ * Rubygems
61
+
62
+ Install
63
+ -------
64
+
65
+ * `gem install rubygems-source`
66
+
67
+ or add it to your `Gemfile`:
68
+
69
+ * `gem "rubygems-source"`
70
+
71
+ Development
72
+ -----------
73
+
74
+ * Source hosted at [GitHub](https://github.com/kapoq/rubygems-source)
75
+ * Report issues/Questions/Feature requests on [GitHub Issues](https://github.com/kapoq/rubygems-source)
76
+ * CI at [Travis](http://travis-ci.org/#!/textgoeshere/rubygems-source)
77
+
78
+ Pull requests are very welcome! Make sure your patches are well tested. Please create a topic branch for every separate change
79
+ you make.
80
+
81
+ ### Roadmap ###
82
+
83
+ * authenticate gem admin actions via API key
84
+ * implement gem dependency resolver
85
+ * show HTML list of gems/versions/links to rdoc at /
86
+ * remove Sintra dependency in favour of plain Rack for smaller footprint
87
+ * support legacy index/spec format?
88
+
89
+ ### Testing ###
90
+
91
+ $ rake
92
+
93
+ Related projects
94
+ ----------------
95
+
96
+ * [rubygems-source-cli](https://github.com/kapoq/rubygems-source-cli):
97
+ Patches to `gem push` and `gem yank` to make them work with
98
+ non-rubygems.org sources
99
+ [rubygems-source-features](https://github.com/kapoq/rubygems-source-features):
100
+ Cucumber features for Rubygems sources
101
+ * [rubygems.org](https://github.com/rubygems/rubygems.org):
102
+ Daddy
103
+ * [geminabox](https://github.com/cwninja/geminabox):
104
+ Very similar project, no `gem yank`, no tests of any kind
105
+ * [sinatra-rubygems](https://github.com/jnewland/sinatra-rubygems):
106
+ Replacement for `gem server` - no `gem push`, `gem yank` or resolver
107
+
108
+ Author
109
+ ------
110
+
111
+ [Dave Nolan](https://github.com/textgoeshere)
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'bundler'
2
+ require 'rspec/core/rake_task'
3
+ require 'cucumber/rake/task'
4
+
5
+ Bundler::GemHelper.install_tasks
6
+ RSpec::Core::RakeTask.new(:spec)
7
+ Cucumber::Rake::Task.new(:features) do |t|
8
+ t.cucumber_opts = "features --format pretty"
9
+ end
10
+
11
+ task :default => [:spec, :features]
data/config.ru.example ADDED
@@ -0,0 +1,4 @@
1
+ require "rubygems-source"
2
+
3
+ Rubygems::Source::App.public_folder = "/var/gems/" # or wherever
4
+ run Rubygems::Source::App
@@ -0,0 +1,5 @@
1
+ def app
2
+ Rubygems::Source::App.new
3
+ end
4
+
5
+ Rubygems::Source::App.public_folder = TmpDirHelper.root_dir
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.setup
5
+ require 'rack/test'
6
+
7
+ require 'rubygems-source'
8
+
9
+ World(Rack::Test::Methods)
@@ -0,0 +1,5 @@
1
+ module Rubygems
2
+ module Source
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,79 @@
1
+ require "rubygems/package"
2
+ require "rubygems/user_interaction"
3
+ require "rubygems/indexer"
4
+ require "sinatra/base"
5
+
6
+ module Rubygems
7
+ module Source
8
+ autoload :Version, "rubygems-source/version"
9
+
10
+ class App < Sinatra::Base
11
+ set :show_exceptions, false
12
+ set :raise_errors, true
13
+
14
+ helpers do
15
+ def path_to_gem(gem_file_name = "")
16
+ File.join(settings.public_folder, "gems", gem_file_name)
17
+ end
18
+
19
+ def clear_gem_specs_and_update_gem_indices
20
+ Gem.post_reset{ Gem::Specification.all = nil }
21
+ Gem::Indexer.new(settings.public_folder).generate_index
22
+ end
23
+
24
+ def get_spec(data)
25
+ Gem::Package.open(StringIO.new(data), "r", nil) { |pkg| pkg.metadata }
26
+ rescue Gem::Package::FormatError
27
+ false
28
+ end
29
+ end
30
+
31
+ # #
32
+ # # ROUTES
33
+ # #
34
+
35
+ # PUSH
36
+ post "/api/v1/gems" do
37
+ if spec = get_spec(request.body.read)
38
+ filename = path_to_gem("#{spec.original_name}.gem")
39
+ FileUtils.mkdir_p(path_to_gem) unless File.directory?(path_to_gem)
40
+ if File.exists?(filename)
41
+ "#{spec.original_name} already exists and will not be overwritten."
42
+ status 409
43
+ else
44
+ request.body.rewind
45
+ File.open(filename, "wb") { |f| f.write(request.body.read) }
46
+ clear_gem_specs_and_update_gem_indices
47
+ "#{spec.original_name} pushed. Have a nice day."
48
+ end
49
+ else
50
+ "Invalid gem"
51
+ status 403
52
+ end
53
+ end
54
+
55
+ # YANK
56
+ delete "/api/v1/gems" do
57
+ requirements = params.dup
58
+ name = requirements.delete("gem_name")
59
+ version = requirements.delete("version")
60
+ # TODO: check required params present
61
+ platform = requirements.delete("platform")
62
+ candidates = Gem::Specification.find_all_by_name(name, "=#{version}")
63
+ gems_to_yank = if platform.nil? || platform == ""
64
+ candidates
65
+ else
66
+ candidates.select { |spec| spec.platform == platform }
67
+ end
68
+ unless gems_to_yank.empty?
69
+ gems_to_yank.each { |spec| FileUtils.rm(path_to_gem(spec.file_name)) }
70
+ clear_gem_specs_and_update_gem_indices
71
+ gems_to_yank.map { |spec| spec.original_name }.join(", ") + " yanked. Have a nice day."
72
+ else
73
+ "No matching gems found here"
74
+ status 404
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "rubygems-source/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "rubygems-source"
7
+ s.version = Rubygems::Source::VERSION
8
+ s.authors = ["dave@kapoq.com"]
9
+ s.email = ["dave@kapoq.com"]
10
+ s.homepage = "https://github.com/kapoq/rubygems-source"
11
+ s.summary = "A Rubygems remote source server"
12
+ s.description = "A Rubygems remote source server that implements the core Rubygems web API (gem indicies, specs, push, and yank). Wins for local and private gem servers."
13
+
14
+ s.add_dependency "sinatra"
15
+ s.add_dependency "builder"
16
+
17
+ s.add_development_dependency "cucumber"
18
+ s.add_development_dependency "rspec"
19
+ s.add_development_dependency "guard-rspec"
20
+ s.add_development_dependency "rack-test"
21
+ s.add_development_dependency "rake"
22
+ if RUBY_PLATFORM =~ /linux/
23
+ s.add_development_dependency "rb-inotify"
24
+ s.add_development_dependency "libnotify"
25
+ end
26
+
27
+
28
+ s.files = `git ls-files`.split("\n")
29
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
30
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
31
+ s.require_paths = ["lib"]
32
+ end
data/tmp/.gitignore ADDED
File without changes
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubygems-source
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - dave@kapoq.com
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-10-21 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sinatra
16
+ requirement: &8184760 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *8184760
25
+ - !ruby/object:Gem::Dependency
26
+ name: builder
27
+ requirement: &8184140 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *8184140
36
+ - !ruby/object:Gem::Dependency
37
+ name: cucumber
38
+ requirement: &8183500 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *8183500
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: &8182880 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *8182880
58
+ - !ruby/object:Gem::Dependency
59
+ name: guard-rspec
60
+ requirement: &8182240 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *8182240
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack-test
71
+ requirement: &8181540 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *8181540
80
+ - !ruby/object:Gem::Dependency
81
+ name: rake
82
+ requirement: &8180720 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *8180720
91
+ - !ruby/object:Gem::Dependency
92
+ name: rb-inotify
93
+ requirement: &8179220 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *8179220
102
+ - !ruby/object:Gem::Dependency
103
+ name: libnotify
104
+ requirement: &8178580 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *8178580
113
+ description: A Rubygems remote source server that implements the core Rubygems web
114
+ API (gem indicies, specs, push, and yank). Wins for local and private gem servers.
115
+ email:
116
+ - dave@kapoq.com
117
+ executables: []
118
+ extensions: []
119
+ extra_rdoc_files: []
120
+ files:
121
+ - .gitignore
122
+ - .gitmodules
123
+ - Gemfile
124
+ - README.md
125
+ - Rakefile
126
+ - config.ru.example
127
+ - features/support/app.rb
128
+ - features/support/env.rb
129
+ - lib/rubygems-source.rb
130
+ - lib/rubygems-source/version.rb
131
+ - rubygems-source.gemspec
132
+ - tmp/.gitignore
133
+ homepage: https://github.com/kapoq/rubygems-source
134
+ licenses: []
135
+ post_install_message:
136
+ rdoc_options: []
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ! '>='
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ! '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ requirements: []
152
+ rubyforge_project:
153
+ rubygems_version: 1.8.11
154
+ signing_key:
155
+ specification_version: 3
156
+ summary: A Rubygems remote source server
157
+ test_files: []