gem-local 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/Gemfile +4 -0
- data/README.md +66 -0
- data/Rakefile +2 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/gem-local.gemspec +21 -0
- data/lib/rubygems/commands/local_command.rb +359 -0
- data/lib/rubygems_plugin.rb +3 -0
- metadata +81 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 12ba8318b72fa89c9de01c0c45d33e82ffbd68c1
|
4
|
+
data.tar.gz: a474d6db2f9c21046c6096edf0b03e69db253c8a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3231969743c51456cfe24ebd4dcf98334c40d5d55e364deb5fdc4573eeaa742ef225905ada636b5e64cd4badbc5567770682d9e2cf97c9e19fd677ce8b399cbb
|
7
|
+
data.tar.gz: 0f1824d82c50ac6362fde55a1a79adb5d576ea3ae68984471204f60398cee34c1b6f50047240af80a0112de8f9969138592428082530a0def08a027ff708c0e8
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
Command: gem local
|
2
|
+
==================
|
3
|
+
|
4
|
+
> **Lets you register and manage [local bundler git repos](http://bundler.io/v1.5/git.html#local) per-project.**
|
5
|
+
|
6
|
+
Installation
|
7
|
+
------------
|
8
|
+
|
9
|
+
Install this rubygems extension through rubygems:
|
10
|
+
|
11
|
+
```sh
|
12
|
+
gem install gem-local
|
13
|
+
```
|
14
|
+
|
15
|
+
Usage
|
16
|
+
-----
|
17
|
+
|
18
|
+
Inside a project with a `Gemfile` where you want to be able to toggle local bundler gem loadpaths, run:
|
19
|
+
|
20
|
+
```sh
|
21
|
+
gem local install
|
22
|
+
```
|
23
|
+
|
24
|
+
Define the dependencies of this project that you have local copies of, and their locations:
|
25
|
+
|
26
|
+
```sh
|
27
|
+
gem local add my-dependency ~/code/ruby/gems/my-dependency
|
28
|
+
```
|
29
|
+
|
30
|
+
When you want to use your local copy, run
|
31
|
+
|
32
|
+
```sh
|
33
|
+
gem local use my-dependency
|
34
|
+
```
|
35
|
+
|
36
|
+
When you want to use the remote version again, run
|
37
|
+
|
38
|
+
```sh
|
39
|
+
gem local ignore my-dependency
|
40
|
+
```
|
41
|
+
|
42
|
+
You can use/ignore multiple gems by supplying a list, or you can use/ignore all at once by not specifying any gem in particular.
|
43
|
+
|
44
|
+
If invocations of `bundle config local...` cause your `.gemlocal` file to get out of sync with bundler's settings, run
|
45
|
+
|
46
|
+
```sh
|
47
|
+
gem local rebuild
|
48
|
+
```
|
49
|
+
|
50
|
+
to update your file against bundler's configuration.
|
51
|
+
|
52
|
+
For other commands and usage, see
|
53
|
+
|
54
|
+
```sh
|
55
|
+
gem local help
|
56
|
+
```
|
57
|
+
|
58
|
+
For details on a command, for example `install`, run
|
59
|
+
|
60
|
+
```sh
|
61
|
+
gem local help install
|
62
|
+
```
|
63
|
+
|
64
|
+
## Contributing
|
65
|
+
|
66
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/christhekeele/gem-local.
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "gem/local"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
data/gem-local.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "gem-local"
|
7
|
+
spec.version = "0.1.0"
|
8
|
+
spec.authors = ["Chris Keele"]
|
9
|
+
spec.email = ["dev@chriskeele.com"]
|
10
|
+
|
11
|
+
spec.summary = "A configuration manager for bundler's local gem settings."
|
12
|
+
spec.description = "The `gem local` command allows you to track, change, update per-project usage of `bundle config local.<gem>` settings."
|
13
|
+
|
14
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
15
|
+
spec.bindir = "exe"
|
16
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
17
|
+
spec.require_paths = ["lib"]
|
18
|
+
|
19
|
+
spec.add_development_dependency "bundler", "~> 1.11"
|
20
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
21
|
+
end
|
@@ -0,0 +1,359 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
|
3
|
+
class Gem::Commands::LocalCommand < Gem::Command
|
4
|
+
|
5
|
+
class Setting
|
6
|
+
attr_accessor :location, :status
|
7
|
+
def initialize(location, status = "off")
|
8
|
+
@location, @status = location, status
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
super("local", "A configuration manager for bundler's local gem settings.")
|
14
|
+
end
|
15
|
+
|
16
|
+
def description
|
17
|
+
<<-DESC
|
18
|
+
The `gem local` command allows you to save, toggle, and recall per-project usage of `bundle config local.<gem>` settings.
|
19
|
+
DESC
|
20
|
+
end
|
21
|
+
|
22
|
+
def arguments
|
23
|
+
<<-ARGS
|
24
|
+
add <gem> <path> | Adds or overwrites a local gem configuration.
|
25
|
+
status [gem] | Displays all or a particular local gem configuration.
|
26
|
+
remove <gem> | Removes a local gem from `gem local` configuration.
|
27
|
+
use [gem, ...] | Enables local gem(s).
|
28
|
+
ignore [gem, ...] | Disables local gem(s).
|
29
|
+
rebuild | Regenerates your `.gemlocal` from bundle config state.
|
30
|
+
install | Adds `.gemlocal` artifact to project `.gitignore`.
|
31
|
+
help [cmd] | Displays help information.
|
32
|
+
ARGS
|
33
|
+
end
|
34
|
+
|
35
|
+
def usage
|
36
|
+
"#{program_name} subcommand <gem> <path>" + "\n" + arguments
|
37
|
+
end
|
38
|
+
|
39
|
+
def execute
|
40
|
+
if cmd = options[:args].shift
|
41
|
+
if available_cmds.include? cmd
|
42
|
+
public_send cmd, *options[:args]
|
43
|
+
else
|
44
|
+
raise "`gem local #{cmd}` is not a valid command, try:\n" + arguments
|
45
|
+
end
|
46
|
+
else
|
47
|
+
help
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# COMMANDS
|
52
|
+
|
53
|
+
def add(name = nil, location = nil, *args)
|
54
|
+
if name and location and args.empty?
|
55
|
+
setting = Setting.new(location)
|
56
|
+
if bundler_add name, setting
|
57
|
+
update_config(name, :status, setting.status)
|
58
|
+
end
|
59
|
+
else
|
60
|
+
arity_error __method__
|
61
|
+
end
|
62
|
+
end
|
63
|
+
alias_method :new, :add
|
64
|
+
|
65
|
+
def status(name = nil, *args)
|
66
|
+
if not name and args.empty?
|
67
|
+
config.each do |name, setting|
|
68
|
+
puts show_setting_for(name, setting)
|
69
|
+
end
|
70
|
+
elsif name
|
71
|
+
if setting = config[name]
|
72
|
+
puts show_setting_for(name, setting)
|
73
|
+
else
|
74
|
+
raise "`gem local #{__method__}` could not find `#{name}` in:\n#{find_config}"
|
75
|
+
end
|
76
|
+
else
|
77
|
+
arity_error __method__
|
78
|
+
end
|
79
|
+
end
|
80
|
+
alias_method :show, :status
|
81
|
+
|
82
|
+
def remove(name = nil, *args)
|
83
|
+
if name and args.empty?
|
84
|
+
config.delete(name)
|
85
|
+
write_config(config)
|
86
|
+
else
|
87
|
+
arity_error __method__
|
88
|
+
end
|
89
|
+
end
|
90
|
+
alias_method :delete, :remove
|
91
|
+
|
92
|
+
def use(*names)
|
93
|
+
names = config.values if names.empty?
|
94
|
+
names.each do |name|
|
95
|
+
if setting = config[name]
|
96
|
+
if bundler_add name, setting
|
97
|
+
update_config(name, :status, "on")
|
98
|
+
else
|
99
|
+
raise "Could not activate gem, make sure `bundle config local.#{name}` #{setting.location} succeeds"
|
100
|
+
end
|
101
|
+
else
|
102
|
+
raise "`gem local #{__method__}` could not find `#{name}` in:\n#{find_config}"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
alias_method :on, :use
|
107
|
+
alias_method :activate, :use
|
108
|
+
alias_method :enable, :use
|
109
|
+
alias_method :renable, :use
|
110
|
+
alias_method :reactivate, :use
|
111
|
+
|
112
|
+
def ignore(*names)
|
113
|
+
names = config.values if names.empty?
|
114
|
+
names.each do |name|
|
115
|
+
if setting = config[name]
|
116
|
+
if bundler_remove name, setting
|
117
|
+
update_config(name, :status, "off")
|
118
|
+
else
|
119
|
+
raise "Could not deactivate gem, make sure `bundle config --delete local.#{name}` succeeds"
|
120
|
+
end
|
121
|
+
else
|
122
|
+
raise "`gem local #{__method__}` could not find `#{name}` in:\n#{find_config}"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
alias_method :off, :ignore
|
127
|
+
alias_method :deactivate, :ignore
|
128
|
+
alias_method :disable, :ignore
|
129
|
+
|
130
|
+
def rebuild(*args)
|
131
|
+
if args.empty?
|
132
|
+
config = read_config.dup
|
133
|
+
clear_config_cache
|
134
|
+
File.open(find_config, "w") do |file|
|
135
|
+
config.each do |name, old_setting|
|
136
|
+
if setting = bundler_value(name, old_setting)
|
137
|
+
file.puts config_for(name, setting.location, setting.status)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
show
|
142
|
+
else
|
143
|
+
arity_error __method__
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def install(*args)
|
148
|
+
if args.empty?
|
149
|
+
File.open(find_file('.gitignore'), "a+") do |file|
|
150
|
+
%w[.bundle .gemlocal].each do |ignorable|
|
151
|
+
unless file.lines.any?{ |line| line.include? ignorable }
|
152
|
+
file.puts ignorable
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
else
|
157
|
+
arity_error __method__
|
158
|
+
end
|
159
|
+
end
|
160
|
+
alias_method :init, :install
|
161
|
+
|
162
|
+
def help(cmd = nil, *args)
|
163
|
+
if not cmd and args.empty?
|
164
|
+
puts description + "\n" + arguments
|
165
|
+
elsif cmd
|
166
|
+
puts info_for(__method__)
|
167
|
+
else
|
168
|
+
arity_error __method__
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
private
|
173
|
+
|
174
|
+
# COMMANDS
|
175
|
+
|
176
|
+
def cmds
|
177
|
+
@cmds ||= {
|
178
|
+
"add" => {
|
179
|
+
description: "Adds or overwrites a local gem configuration and activates the gem from sourcein bundler.",
|
180
|
+
usage: "add <gem> <path>",
|
181
|
+
arguments: "takes exactly two arguments",
|
182
|
+
aliases: %w[new],
|
183
|
+
},
|
184
|
+
"status" => {
|
185
|
+
description: "Displays the current local gem configuration, or the specified gem's config.",
|
186
|
+
usage: "status [gem]",
|
187
|
+
arguments: "takes zero or one arguments",
|
188
|
+
aliases: %w[show],
|
189
|
+
},
|
190
|
+
"remove" => {
|
191
|
+
description: "Remove a local gem from `gem local` management.",
|
192
|
+
usage: "remove <gem>",
|
193
|
+
arguments: "takes exactly one argument",
|
194
|
+
aliases: %w[delete],
|
195
|
+
},
|
196
|
+
"use" => {
|
197
|
+
description: "Activates all registered local gems, or the specified gem, in bundler.",
|
198
|
+
usage: "use [gem]",
|
199
|
+
arguments: "takes any number of arguments",
|
200
|
+
aliases: %w[on activate enable renable reactivate],
|
201
|
+
},
|
202
|
+
"ignore" => {
|
203
|
+
description: "Deactivates all registered local gems, or the specified gem, in bundler.",
|
204
|
+
usage: "ignore [gem]",
|
205
|
+
arguments: "takes any number of arguments",
|
206
|
+
aliases: %w[off deactivate disable],
|
207
|
+
},
|
208
|
+
"rebuild" => {
|
209
|
+
description: "Regenerates your local `.gemlocal` file from the bundle config if they get out of sync.",
|
210
|
+
usage: "rebuild",
|
211
|
+
arguments: "takes zero arguments",
|
212
|
+
aliases: %w[],
|
213
|
+
},
|
214
|
+
"install" => {
|
215
|
+
description: "Adds `.gemlocal` and `.bundle` artifacts to project `.gitignore`",
|
216
|
+
usage: "install",
|
217
|
+
arguments: "takes zero arguments",
|
218
|
+
aliases: %w[init],
|
219
|
+
},
|
220
|
+
"help" => {
|
221
|
+
description: "Displays help information, either about `gem local` or a `gem local` subcommand.",
|
222
|
+
usage: "help [cmd]",
|
223
|
+
arguments: "takes zero or one arguments",
|
224
|
+
aliases: %w[],
|
225
|
+
},
|
226
|
+
}
|
227
|
+
end
|
228
|
+
|
229
|
+
def available_cmds
|
230
|
+
cmds.map do |cmd, info|
|
231
|
+
[cmd, info[:aliases]]
|
232
|
+
end.flatten.compact
|
233
|
+
end
|
234
|
+
|
235
|
+
# FORMATTING
|
236
|
+
|
237
|
+
def show_setting_for(name, setting)
|
238
|
+
"%-4.4s #{name} @ #{setting.location}" % "#{setting.status}:"
|
239
|
+
end
|
240
|
+
|
241
|
+
def info_for(cmd)
|
242
|
+
info = cmds[cmd.to_s]
|
243
|
+
usage_for(info) + "\n" + aliases_for(info) + "\n" + description_for(info)
|
244
|
+
end
|
245
|
+
|
246
|
+
def usage_for(info)
|
247
|
+
"USAGE: #{info[:usage]}"
|
248
|
+
end
|
249
|
+
|
250
|
+
def aliases_for(info)
|
251
|
+
"aliases: "+ Array(info[:aliases]).flatten.join(', ')
|
252
|
+
end
|
253
|
+
|
254
|
+
def description_for(info)
|
255
|
+
info[:description]
|
256
|
+
end
|
257
|
+
|
258
|
+
def config_for(name, location, status)
|
259
|
+
"%-3.3s #{name} #{location}" % status
|
260
|
+
end
|
261
|
+
|
262
|
+
def arity_error(cmd)
|
263
|
+
info = cmds[cmd.to_s]
|
264
|
+
raise "`gem local #{cmd}` #{info[:arguments]}" + "\n" + info_for(cmd)
|
265
|
+
end
|
266
|
+
|
267
|
+
# PLUMBING
|
268
|
+
|
269
|
+
def config
|
270
|
+
@config ||= read_config
|
271
|
+
end
|
272
|
+
|
273
|
+
def clear_config_cache
|
274
|
+
@config = nil
|
275
|
+
end
|
276
|
+
|
277
|
+
def read_config
|
278
|
+
File.open(find_config) do |file|
|
279
|
+
config = Hash[
|
280
|
+
file.readlines.reject do |line|
|
281
|
+
line.start_with? "#" or line.strip.empty?
|
282
|
+
end.map do |line|
|
283
|
+
status, name, location, *args = line.strip.split
|
284
|
+
if status and name and location and args.empty?
|
285
|
+
[name, Setting.new(location, status)]
|
286
|
+
else
|
287
|
+
raise "`gem local` config in `#{find_config}` is corrupt, each non-empty non-commented line must contain a status, a gem name, and the local path to that gem, separated by spaces\nerror at:\n#{line}"
|
288
|
+
end
|
289
|
+
end
|
290
|
+
]
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
def touch_file(path)
|
295
|
+
FileUtils.touch(path).unshift
|
296
|
+
end
|
297
|
+
|
298
|
+
def find_file(path)
|
299
|
+
if File.exists? path
|
300
|
+
path
|
301
|
+
else
|
302
|
+
touch_file path
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
def find_config
|
307
|
+
find_file Bundler.default_gemfile.dirname + '.gemlocal'
|
308
|
+
rescue Bundler::GemfileNotFound
|
309
|
+
raise "`gem local` could not locate a `Gemfile` file, which it uses to determine the root of your project"
|
310
|
+
end
|
311
|
+
|
312
|
+
def write_config(config)
|
313
|
+
File.open(find_config, "w") do |file|
|
314
|
+
config.each do |name, setting|
|
315
|
+
file.puts config_for(name, setting.location, setting.status)
|
316
|
+
end
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
def update_config(name, field, value)
|
321
|
+
new_setting = config[name]
|
322
|
+
new_setting.send(:"#{field}=", value)
|
323
|
+
config[name] = new_setting
|
324
|
+
write_config config
|
325
|
+
puts show_setting_for(name, new_setting)
|
326
|
+
end
|
327
|
+
|
328
|
+
def bundler_add(name, setting)
|
329
|
+
Bundler.settings["local.#{name}"] = setting.location
|
330
|
+
!! Bundler.settings["local.#{name}"]
|
331
|
+
end
|
332
|
+
|
333
|
+
def bundler_remove(name, setting)
|
334
|
+
Bundler.settings["local.#{name}"] = nil
|
335
|
+
not Bundler.settings["local.#{name}"]
|
336
|
+
end
|
337
|
+
|
338
|
+
def bundler_value(name, setting)
|
339
|
+
if new_setting = bundler_values[name]
|
340
|
+
new_setting
|
341
|
+
else
|
342
|
+
setting.status = "off"
|
343
|
+
setting
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
def bundler_values
|
348
|
+
@bundler_values ||= Hash[
|
349
|
+
Bundler.settings.send(:load_config, Bundler.settings.send(:local_config_file)).select do |setting, value|
|
350
|
+
setting =~ /^BUNDLE_LOCAL__/
|
351
|
+
end.map do |setting, value|
|
352
|
+
[ setting[/^BUNDLE_LOCAL__(?<name>.*?)$/, :name].downcase, value ]
|
353
|
+
end.map do |name, location|
|
354
|
+
[ name, Setting.new(location, "on")]
|
355
|
+
end
|
356
|
+
]
|
357
|
+
end
|
358
|
+
|
359
|
+
end
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gem-local
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chris Keele
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-05-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.11'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.11'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
description: The `gem local` command allows you to track, change, update per-project
|
42
|
+
usage of `bundle config local.<gem>` settings.
|
43
|
+
email:
|
44
|
+
- dev@chriskeele.com
|
45
|
+
executables: []
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files: []
|
48
|
+
files:
|
49
|
+
- ".gitignore"
|
50
|
+
- Gemfile
|
51
|
+
- README.md
|
52
|
+
- Rakefile
|
53
|
+
- bin/console
|
54
|
+
- bin/setup
|
55
|
+
- gem-local.gemspec
|
56
|
+
- lib/rubygems/commands/local_command.rb
|
57
|
+
- lib/rubygems_plugin.rb
|
58
|
+
homepage:
|
59
|
+
licenses: []
|
60
|
+
metadata: {}
|
61
|
+
post_install_message:
|
62
|
+
rdoc_options: []
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
requirements: []
|
76
|
+
rubyforge_project:
|
77
|
+
rubygems_version: 2.2.2
|
78
|
+
signing_key:
|
79
|
+
specification_version: 4
|
80
|
+
summary: A configuration manager for bundler's local gem settings.
|
81
|
+
test_files: []
|