vim-flavor 0.0.4 → 1.0.0
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/.rspec +1 -0
- data/.travis.yml +4 -0
- data/README.md +3 -174
- data/Rakefile +10 -0
- data/features/.nav +12 -0
- data/features/README.md +17 -0
- data/features/caching.feature +50 -0
- data/features/command_line/README.md +9 -0
- data/features/command_line/progress_messages.feature +44 -0
- data/features/flavorfile/README.md +9 -0
- data/features/flavorfile/comments.feature +24 -0
- data/features/flavorfile/repository_name.feature +53 -0
- data/features/flavorfile/version_constraint.feature +52 -0
- data/features/install_vim_flavor.md +42 -0
- data/features/philosophy.md +90 -0
- data/features/resolve_dependencies.feature +16 -0
- data/features/step_definitions/bootstrap_script_steps.rb +7 -0
- data/features/step_definitions/cli_steps.rb +34 -0
- data/features/step_definitions/directory_steps.rb +23 -0
- data/features/step_definitions/flavor_steps.rb +37 -0
- data/features/step_definitions/flavorfile_steps.rb +12 -0
- data/features/step_definitions/lockfile_steps.rb +13 -0
- data/features/support/env.rb +49 -0
- data/features/typical_usage/README.md +63 -0
- data/features/typical_usage/deploy_to_arbitrary_place.feature +24 -0
- data/features/typical_usage/install_vim_plugins.feature +26 -0
- data/features/typical_usage/uninstall_vim_plugins.feature +31 -0
- data/features/typical_usage/upgrade_vim_plugins.feature +27 -0
- data/features/uninstall_vim_flavor.md +16 -0
- data/features/version_lock.feature +26 -0
- data/lib/vim-flavor.rb +2 -12
- data/lib/vim-flavor/cli.rb +16 -12
- data/lib/vim-flavor/enumerableextension.rb +48 -0
- data/lib/vim-flavor/facade.rb +65 -102
- data/lib/vim-flavor/flavor.rb +70 -63
- data/lib/vim-flavor/flavorfile.rb +15 -47
- data/lib/vim-flavor/lockfile.rb +27 -44
- data/lib/vim-flavor/lockfileparser.rb +65 -0
- data/lib/vim-flavor/stringextension.rb +25 -1
- data/lib/vim-flavor/version.rb +1 -1
- data/lib/vim-flavor/versionconstraint.rb +12 -11
- data/spec/enumerableextension_spec.rb +100 -0
- data/spec/facade_spec.rb +49 -540
- data/spec/flavor_spec.rb +50 -250
- data/spec/flavorfile_spec.rb +34 -110
- data/spec/lockfile_spec.rb +79 -89
- data/spec/spec_helper.rb +0 -65
- data/spec/stringextension_spec.rb +10 -6
- data/spec/versionconstraint_spec.rb +37 -119
- data/vim-flavor.gemspec +3 -1
- metadata +135 -46
- data/spec/cli_spec.rb +0 -15
@@ -1,61 +1,29 @@
|
|
1
1
|
module Vim
|
2
2
|
module Flavor
|
3
3
|
class FlavorFile
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
@flavors = {}
|
8
|
-
@default_groups = [:default]
|
9
|
-
end
|
10
|
-
|
11
|
-
def interpret(&block)
|
12
|
-
instance_eval(&block)
|
4
|
+
# repo_name -> flavor
|
5
|
+
def flavor_table
|
6
|
+
@flavor_table ||= {}
|
13
7
|
end
|
14
8
|
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
interpret do
|
20
|
-
instance_eval(content)
|
21
|
-
end
|
9
|
+
def self.load(flavorfile_path)
|
10
|
+
ff = new()
|
11
|
+
ff.load(flavorfile_path)
|
12
|
+
ff
|
22
13
|
end
|
23
14
|
|
24
|
-
def
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
m = Regexp.last_match
|
30
|
-
"git://github.com/#{m[1]}/#{m[2]}.git"
|
31
|
-
elsif /^[a-z]+:\/\/.*$/.match(repo_name) then
|
32
|
-
repo_name
|
33
|
-
else
|
34
|
-
raise "repo_name is written in invalid format: #{repo_name.inspect}"
|
35
|
-
end
|
15
|
+
def load(flavorfile_path)
|
16
|
+
instance_eval(
|
17
|
+
File.open(flavorfile_path, 'r').read(),
|
18
|
+
flavorfile_path
|
19
|
+
)
|
36
20
|
end
|
37
21
|
|
38
|
-
def flavor(repo_name,
|
39
|
-
options = Hash === args.last ? args.pop : {}
|
40
|
-
options[:groups] ||= []
|
41
|
-
version_contraint = VersionConstraint.new(args.last || '>= 0')
|
42
|
-
|
22
|
+
def flavor(repo_name, version_constraint='>= 0')
|
43
23
|
f = Flavor.new()
|
44
24
|
f.repo_name = repo_name
|
45
|
-
f.
|
46
|
-
f.
|
47
|
-
f.groups = @default_groups + options[:groups]
|
48
|
-
|
49
|
-
@flavors[f.repo_uri] = f
|
50
|
-
end
|
51
|
-
|
52
|
-
def group(*group_names, &block)
|
53
|
-
@default_groups.concat(group_names)
|
54
|
-
yield
|
55
|
-
ensure
|
56
|
-
group_names.each do
|
57
|
-
@default_groups.pop()
|
58
|
-
end
|
25
|
+
f.version_constraint = VersionConstraint.new(version_constraint)
|
26
|
+
flavor_table[f.repo_name] = f
|
59
27
|
end
|
60
28
|
end
|
61
29
|
end
|
data/lib/vim-flavor/lockfile.rb
CHANGED
@@ -1,63 +1,46 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
|
3
1
|
module Vim
|
4
2
|
module Flavor
|
5
3
|
class LockFile
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
def self.load_or_new(lockfile_path)
|
5
|
+
l = new(lockfile_path)
|
6
|
+
l.load() if File.exists?(lockfile_path)
|
7
|
+
l
|
8
|
+
end
|
9
9
|
|
10
10
|
def initialize(path)
|
11
|
-
@flavors = {} # repo_uri => flavor
|
12
11
|
@path = path
|
13
12
|
end
|
14
13
|
|
15
|
-
def
|
16
|
-
|
17
|
-
YAML.load(f.read())
|
18
|
-
end
|
19
|
-
|
20
|
-
@flavors = self.class.flavors_from_poro(h[:flavors])
|
14
|
+
def flavor_table
|
15
|
+
@flavor_table ||= {}
|
21
16
|
end
|
22
17
|
|
23
|
-
def
|
24
|
-
|
18
|
+
def flavors
|
19
|
+
flavor_table.values.sort_by {|f| f.repo_name}
|
20
|
+
end
|
25
21
|
|
26
|
-
|
22
|
+
def load()
|
23
|
+
s = File.open(@path, 'r') {|io| io.read()}
|
24
|
+
@flavor_table =
|
25
|
+
Hash[LockFileParser.parse(s).map {|f| [f.repo_name, f]}]
|
26
|
+
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
end
|
28
|
+
def update(completed_flavor_table)
|
29
|
+
@flavor_table = completed_flavor_table
|
31
30
|
end
|
32
31
|
|
33
|
-
def self.
|
34
|
-
|
35
|
-
flavors.values.map {|f|
|
36
|
-
[
|
37
|
-
f.repo_uri,
|
38
|
-
{
|
39
|
-
:groups => f.groups,
|
40
|
-
:locked_version => f.locked_version.to_s(),
|
41
|
-
:repo_name => f.repo_name,
|
42
|
-
:version_contraint => f.version_contraint.to_s(),
|
43
|
-
}
|
44
|
-
]
|
45
|
-
}
|
46
|
-
]
|
32
|
+
def self.serialize_lock_status(flavor)
|
33
|
+
["#{flavor.repo_name} (#{flavor.locked_version})"]
|
47
34
|
end
|
48
35
|
|
49
|
-
def
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
f.version_contraint = VersionConstraint.new(h[:version_contraint])
|
58
|
-
[f.repo_uri, f]
|
59
|
-
}
|
60
|
-
]
|
36
|
+
def save()
|
37
|
+
File.open(@path, 'w') do |io|
|
38
|
+
lines = flavors.flat_map {|f| self.class.serialize_lock_status(f)}
|
39
|
+
lines.each do |line|
|
40
|
+
io.write(line)
|
41
|
+
io.write("\n")
|
42
|
+
end
|
43
|
+
end
|
61
44
|
end
|
62
45
|
end
|
63
46
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'parslet'
|
2
|
+
|
3
|
+
module Vim
|
4
|
+
module Flavor
|
5
|
+
class LockFileParser
|
6
|
+
def self.parse(s)
|
7
|
+
Transformer.new.apply(Parser.new().parse(s))[:lockfile]
|
8
|
+
end
|
9
|
+
|
10
|
+
class Parser < Parslet::Parser
|
11
|
+
root(:lockfile)
|
12
|
+
|
13
|
+
rule(:lockfile) {
|
14
|
+
space? >> newline.maybe >>
|
15
|
+
(
|
16
|
+
(
|
17
|
+
flavor >> (newline | eof)
|
18
|
+
).repeat(0).as(:lockfile)
|
19
|
+
)
|
20
|
+
}
|
21
|
+
|
22
|
+
rule(:flavor) {
|
23
|
+
(
|
24
|
+
space? >>
|
25
|
+
repo_name >> space? >>
|
26
|
+
str('(') >> space? >>
|
27
|
+
locked_version >> space? >>
|
28
|
+
str(')') >> space?
|
29
|
+
).as(:flavor)
|
30
|
+
}
|
31
|
+
|
32
|
+
rule(:repo_name) {
|
33
|
+
(
|
34
|
+
match('\w') >>
|
35
|
+
match('[^ \t()]').repeat(0)
|
36
|
+
).as(:repo_name)
|
37
|
+
}
|
38
|
+
rule(:locked_version) {
|
39
|
+
(
|
40
|
+
match('[\d.]').repeat(1)
|
41
|
+
).as(:locked_version)
|
42
|
+
}
|
43
|
+
|
44
|
+
rule(:space) {match('[ \t]').repeat(1)}
|
45
|
+
rule(:space?) {space.maybe}
|
46
|
+
rule(:newline) {match('[\r\n]').repeat(1)}
|
47
|
+
rule(:eof) {any.absent?}
|
48
|
+
end
|
49
|
+
|
50
|
+
class Transformer < Parslet::Transform
|
51
|
+
rule(
|
52
|
+
:flavor => {
|
53
|
+
:repo_name => simple(:repo_name),
|
54
|
+
:locked_version => simple(:locked_version),
|
55
|
+
}
|
56
|
+
) {
|
57
|
+
f = Flavor.new()
|
58
|
+
f.repo_name = repo_name.to_s
|
59
|
+
f.locked_version = locked_version.to_s
|
60
|
+
f
|
61
|
+
}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -1,9 +1,33 @@
|
|
1
1
|
module Vim
|
2
2
|
module Flavor
|
3
3
|
module StringExtension
|
4
|
-
def
|
4
|
+
def to_bootstrap_path
|
5
|
+
"#{self}/bootstrap.vim"
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_flavorfile_path
|
9
|
+
"#{self}/VimFlavor"
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_flavors_path
|
5
13
|
"#{self}/flavors"
|
6
14
|
end
|
15
|
+
|
16
|
+
def to_lockfile_path
|
17
|
+
"#{self}/VimFlavor.lock"
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_stash_path
|
21
|
+
"#{self}/.vim-flavor"
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_vimfiles_path
|
25
|
+
"#{self}/.vim"
|
26
|
+
end
|
27
|
+
|
28
|
+
def zap
|
29
|
+
gsub(/[^A-Za-z0-9._-]/, '_')
|
30
|
+
end
|
7
31
|
end
|
8
32
|
end
|
9
33
|
end
|
data/lib/vim-flavor/version.rb
CHANGED
@@ -1,24 +1,27 @@
|
|
1
1
|
module Vim
|
2
2
|
module Flavor
|
3
3
|
class VersionConstraint
|
4
|
-
attr_reader :base_version
|
4
|
+
attr_reader :base_version
|
5
|
+
|
6
|
+
# Specifies how to choose a suitable version according to base_version.
|
7
|
+
attr_reader :qualifier
|
5
8
|
|
6
9
|
def initialize(s)
|
7
|
-
@base_version, @
|
10
|
+
@base_version, @qualifier = self.class.parse(s)
|
8
11
|
end
|
9
12
|
|
10
13
|
def to_s()
|
11
|
-
"#{
|
14
|
+
"#{qualifier} #{base_version}"
|
12
15
|
end
|
13
16
|
|
14
17
|
def ==(other)
|
15
18
|
self.base_version == other.base_version &&
|
16
|
-
self.
|
19
|
+
self.qualifier == other.qualifier
|
17
20
|
end
|
18
21
|
|
19
|
-
def parse(s)
|
22
|
+
def self.parse(s)
|
20
23
|
m = /^\s*(>=|~>)\s+(\S+)$/.match(s)
|
21
|
-
if m
|
24
|
+
if m
|
22
25
|
[Gem::Version.create(m[2]), m[1]]
|
23
26
|
else
|
24
27
|
raise "Invalid version constraint: #{s.inspect}"
|
@@ -27,9 +30,9 @@ module Vim
|
|
27
30
|
|
28
31
|
def compatible?(other_version_or_s)
|
29
32
|
v = Gem::Version.create(other_version_or_s)
|
30
|
-
if
|
33
|
+
if qualifier == '~>'
|
31
34
|
self.base_version.bump() > v and v >= self.base_version
|
32
|
-
elsif
|
35
|
+
elsif qualifier == '>='
|
33
36
|
v >= self.base_version
|
34
37
|
else
|
35
38
|
raise NotImplementedError
|
@@ -39,9 +42,7 @@ module Vim
|
|
39
42
|
def find_the_best_version(versions)
|
40
43
|
versions.
|
41
44
|
select {|v| compatible?(v)}.
|
42
|
-
|
43
|
-
reverse().
|
44
|
-
first
|
45
|
+
max()
|
45
46
|
end
|
46
47
|
end
|
47
48
|
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Vim
|
4
|
+
module Flavor
|
5
|
+
describe EnumerableExtension do
|
6
|
+
describe '#before_each' do
|
7
|
+
it 'runs a given block before enumerating each element' do
|
8
|
+
xs = []
|
9
|
+
[1, 2, 3].
|
10
|
+
before_each {|n| xs << "before_each #{n}"}.
|
11
|
+
each do |n|
|
12
|
+
xs << "each #{n}"
|
13
|
+
end
|
14
|
+
|
15
|
+
xs.should == [
|
16
|
+
"before_each 1",
|
17
|
+
"each 1",
|
18
|
+
"before_each 2",
|
19
|
+
"each 2",
|
20
|
+
"before_each 3",
|
21
|
+
"each 3",
|
22
|
+
]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#after_each' do
|
27
|
+
it 'runs a given block after enumerating each element' do
|
28
|
+
xs = []
|
29
|
+
[1, 2, 3].
|
30
|
+
after_each {|n| xs << "after_each #{n}"}.
|
31
|
+
each do |n|
|
32
|
+
xs << "each #{n}"
|
33
|
+
end
|
34
|
+
|
35
|
+
xs.should == [
|
36
|
+
"each 1",
|
37
|
+
"after_each 1",
|
38
|
+
"each 2",
|
39
|
+
"after_each 2",
|
40
|
+
"each 3",
|
41
|
+
"after_each 3",
|
42
|
+
]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '#on_failure' do
|
47
|
+
it 'runs a given block if a core block raises an exception' do
|
48
|
+
xs = []
|
49
|
+
|
50
|
+
expect {
|
51
|
+
[1, 2, 3].
|
52
|
+
on_failure {|n| xs << "on_failure #{n}"}.
|
53
|
+
each do |n|
|
54
|
+
xs << "each enter #{n}"
|
55
|
+
raise RuntimeError, "bang! #{n}" if 2 < n
|
56
|
+
xs << "each leave #{n}"
|
57
|
+
end
|
58
|
+
}.to raise_error(RuntimeError, 'bang! 3')
|
59
|
+
|
60
|
+
xs.should == [
|
61
|
+
"each enter 1",
|
62
|
+
"each leave 1",
|
63
|
+
"each enter 2",
|
64
|
+
"each leave 2",
|
65
|
+
"each enter 3",
|
66
|
+
"on_failure 3",
|
67
|
+
]
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'runs a given block with null if a yielder raises an exception' do
|
71
|
+
xs = []
|
72
|
+
e = Object.new()
|
73
|
+
def e.each
|
74
|
+
yield 1
|
75
|
+
yield 2
|
76
|
+
raise RuntimeError, 'bang!'
|
77
|
+
yield 3
|
78
|
+
end
|
79
|
+
|
80
|
+
expect {
|
81
|
+
e.to_enum.
|
82
|
+
on_failure {|n| xs << "on_failure #{n.class}"}.
|
83
|
+
each do |n|
|
84
|
+
xs << "each enter #{n}"
|
85
|
+
xs << "each leave #{n}"
|
86
|
+
end
|
87
|
+
}.to raise_error(RuntimeError, 'bang!')
|
88
|
+
|
89
|
+
xs.should == [
|
90
|
+
"each enter 1",
|
91
|
+
"each leave 1",
|
92
|
+
"each enter 2",
|
93
|
+
"each leave 2",
|
94
|
+
"on_failure #{nil.class}",
|
95
|
+
]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
data/spec/facade_spec.rb
CHANGED
@@ -1,548 +1,57 @@
|
|
1
|
-
require 'bundler/setup'
|
2
1
|
require 'fileutils'
|
3
2
|
require 'spec_helper'
|
4
|
-
require '
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
describe '#load' do
|
18
|
-
with_temporary_directory
|
19
|
-
|
20
|
-
before :each do
|
21
|
-
@facade = described_class.new()
|
22
|
-
@facade.flavorfile_path = "#{@tmp_path}/VimFlavor"
|
23
|
-
@facade.lockfile_path = "#{@tmp_path}/VimFlavor.lock"
|
24
|
-
|
25
|
-
@flavor1 = Vim::Flavor::Flavor.new()
|
26
|
-
@flavor1.groups = [:default]
|
27
|
-
@flavor1.repo_name = 'kana/vim-smartinput'
|
28
|
-
@flavor1.repo_uri = 'git://github.com/kana/vim-smartinput.git'
|
29
|
-
@flavor1.version_contraint =
|
30
|
-
Vim::Flavor::VersionConstraint.new('>= 0')
|
31
|
-
@flavor1d = @flavor1.dup()
|
32
|
-
@flavor1d.locked_version = Gem::Version.create('1.2.3')
|
33
|
-
@flavor2 = Vim::Flavor::Flavor.new()
|
34
|
-
@flavor2.groups = [:default]
|
35
|
-
@flavor2.repo_name = 'kana/vim-smarttill'
|
36
|
-
@flavor2.repo_uri = 'git://github.com/kana/vim-smarttill.git'
|
37
|
-
@flavor2.version_contraint =
|
38
|
-
Vim::Flavor::VersionConstraint.new('>= 0')
|
39
|
-
@flavor2d = @flavor2.dup()
|
40
|
-
@flavor2d.locked_version = Gem::Version.create('4.5.6')
|
41
|
-
|
42
|
-
File.open(@facade.flavorfile_path, 'w') do |f|
|
43
|
-
f.write(<<-'END')
|
44
|
-
flavor 'kana/vim-smartinput'
|
45
|
-
flavor 'kana/vim-smarttill'
|
46
|
-
END
|
47
|
-
end
|
48
|
-
File.open(@facade.lockfile_path, 'w') do |f|
|
49
|
-
f.write(<<-'END')
|
50
|
-
:flavors:
|
51
|
-
git://github.com/kana/vim-smartinput.git:
|
52
|
-
:groups:
|
53
|
-
- :default
|
54
|
-
:locked_version: 1.2.3
|
55
|
-
:repo_name: kana/vim-smartinput
|
56
|
-
:version_contraint: >= 0
|
57
|
-
END
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'should load both files' do
|
62
|
-
@facade.load()
|
63
|
-
|
64
|
-
@facade.flavorfile_path.should == "#{@tmp_path}/VimFlavor"
|
65
|
-
@facade.lockfile_path.should == "#{@tmp_path}/VimFlavor.lock"
|
66
|
-
@facade.flavorfile.flavors.keys.length == 2
|
67
|
-
@facade.flavorfile.flavors[@flavor1.repo_uri].should == @flavor1
|
68
|
-
@facade.flavorfile.flavors[@flavor2.repo_uri].should == @flavor2
|
69
|
-
@facade.lockfile.flavors.should == {
|
70
|
-
@flavor1d.repo_uri => @flavor1d,
|
71
|
-
}
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'should load a lockfile if it exists' do
|
75
|
-
@facade.load()
|
76
|
-
|
77
|
-
@facade.lockfile.flavors.should == {
|
78
|
-
@flavor1d.repo_uri => @flavor1d,
|
79
|
-
}
|
80
|
-
|
81
|
-
@facade.lockfile_path = "#{@tmp_path}/VimFlavor.lock.xxx"
|
82
|
-
@facade.load()
|
83
|
-
|
84
|
-
@facade.lockfile.flavors.should == {}
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
describe '#make_new_flavors' do
|
89
|
-
before :each do
|
90
|
-
@facade = described_class.new()
|
91
|
-
|
92
|
-
@f0 = Vim::Flavor::Flavor.new()
|
93
|
-
@f0.repo_name = 'kana/vim-textobj-entire'
|
94
|
-
@f0.repo_uri = 'git://github.com/kana/vim-textobj-entire.git'
|
95
|
-
@f0.version_contraint = Vim::Flavor::VersionConstraint.new('>= 0')
|
96
|
-
@f0.locked_version = Gem::Version.create('0')
|
97
|
-
|
98
|
-
@f1 = @f0.dup()
|
99
|
-
@f1.locked_version = Gem::Version.create('2')
|
100
|
-
|
101
|
-
@f1d = @f1.dup()
|
102
|
-
@f1d.version_contraint = Vim::Flavor::VersionConstraint.new('>= 1')
|
103
|
-
end
|
104
|
-
|
105
|
-
it 'should keep current locked_version for newly added flavors' do
|
106
|
-
@facade.make_new_flavors(
|
107
|
-
{
|
108
|
-
@f0.repo_uri => @f0,
|
109
|
-
},
|
110
|
-
{
|
111
|
-
},
|
112
|
-
:install
|
113
|
-
).should == {
|
114
|
-
@f0.repo_uri => @f0,
|
115
|
-
}
|
116
|
-
end
|
117
|
-
|
118
|
-
it 'should keep current locked_version for flavors with new constraint' do
|
119
|
-
@facade.make_new_flavors(
|
120
|
-
{
|
121
|
-
@f1d.repo_uri => @f1d,
|
122
|
-
},
|
123
|
-
{
|
124
|
-
@f0.repo_uri => @f0,
|
125
|
-
},
|
126
|
-
:install
|
127
|
-
).should == {
|
128
|
-
@f1d.repo_uri => @f1d,
|
129
|
-
}
|
130
|
-
end
|
131
|
-
|
132
|
-
it 'should keep current locked_version for :update mode' do
|
133
|
-
@facade.make_new_flavors(
|
134
|
-
{
|
135
|
-
@f1.repo_uri => @f1,
|
136
|
-
},
|
137
|
-
{
|
138
|
-
@f0.repo_uri => @f0,
|
139
|
-
},
|
140
|
-
:update
|
141
|
-
).should == {
|
142
|
-
@f1.repo_uri => @f1,
|
143
|
-
}
|
144
|
-
end
|
145
|
-
|
146
|
-
it 'should keep locked flavors otherwise' do
|
147
|
-
@facade.make_new_flavors(
|
148
|
-
{
|
149
|
-
@f1.repo_uri => @f1,
|
150
|
-
},
|
151
|
-
{
|
152
|
-
@f0.repo_uri => @f0,
|
153
|
-
},
|
154
|
-
:install
|
155
|
-
).should == {
|
156
|
-
@f0.repo_uri => @f0,
|
157
|
-
}
|
158
|
-
end
|
159
|
-
|
160
|
-
it 'should always use current groups even if locked version is updated' do
|
161
|
-
f0 = @f0.dup()
|
162
|
-
f0.groups = [:default]
|
163
|
-
f1 = @f1.dup()
|
164
|
-
f1.groups = [:default, :development]
|
165
|
-
f1d = f1.dup()
|
166
|
-
f1d.locked_version = f0.locked_version
|
167
|
-
|
168
|
-
@facade.make_new_flavors(
|
169
|
-
{
|
170
|
-
f1.repo_uri => f1,
|
171
|
-
},
|
172
|
-
{
|
173
|
-
f0.repo_uri => f0,
|
174
|
-
},
|
175
|
-
:install
|
176
|
-
).should == {
|
177
|
-
f1d.repo_uri => f1d,
|
178
|
-
}
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
describe '#create_vim_script_for_bootstrap' do
|
183
|
-
with_temporary_directory
|
184
|
-
|
185
|
-
before :each do
|
186
|
-
@facade = described_class.new()
|
187
|
-
@home_path =
|
188
|
-
if File.symlink?(@tmp_path)
|
189
|
-
File.readlink(@tmp_path)
|
190
|
-
else
|
191
|
-
@tmp_path
|
3
|
+
require 'tmpdir'
|
4
|
+
|
5
|
+
module Vim
|
6
|
+
module Flavor
|
7
|
+
describe Facade do
|
8
|
+
describe '#create_vim_script_for_bootstrap' do
|
9
|
+
around :each do |example|
|
10
|
+
Dir.mktmpdir do |tmp_path|
|
11
|
+
@tmp_path = tmp_path
|
12
|
+
example.run
|
13
|
+
end
|
192
14
|
end
|
193
|
-
@vimfiles_path = "#{@home_path}/.vim"
|
194
|
-
end
|
195
|
-
|
196
|
-
it 'should create a bootstrap script into a given vimfiles path' do
|
197
|
-
bootstrap_path = "#{@vimfiles_path.to_flavors_path()}/bootstrap.vim"
|
198
|
-
|
199
|
-
File.exists?(bootstrap_path).should be_false
|
200
|
-
@facade.create_vim_script_for_bootstrap(@vimfiles_path)
|
201
|
-
File.exists?(bootstrap_path).should be_true
|
202
|
-
end
|
203
|
-
|
204
|
-
it 'should create a valid bootstrap script' do
|
205
|
-
@facade.create_vim_script_for_bootstrap(@vimfiles_path)
|
206
|
-
|
207
|
-
_rtp = %x{
|
208
|
-
HOME='#{@home_path}'
|
209
|
-
for plugin_name in 'foo' 'bar' 'baz'
|
210
|
-
do
|
211
|
-
mkdir -p "#{@vimfiles_path.to_flavors_path()}/$plugin_name"
|
212
|
-
done
|
213
|
-
vim -u NONE -i NONE -e -s -c '
|
214
|
-
set nocompatible verbose=1
|
215
|
-
let vimfiles_path = split(&runtimepath, ",")[0]
|
216
|
-
source #{@vimfiles_path}/flavors/bootstrap.vim
|
217
|
-
for path in split(&runtimepath, ",")
|
218
|
-
if stridx(path, vimfiles_path) == 0
|
219
|
-
echo substitute(path, vimfiles_path, "!", "")
|
220
|
-
endif
|
221
|
-
endfor
|
222
|
-
qall!
|
223
|
-
' 2>&1
|
224
|
-
}
|
225
|
-
rtps =
|
226
|
-
_rtp.
|
227
|
-
split(/[\r\n]/).
|
228
|
-
select {|p| p != ''}
|
229
|
-
rtps.should == [
|
230
|
-
'!',
|
231
|
-
'!/flavors/bar',
|
232
|
-
'!/flavors/baz',
|
233
|
-
'!/flavors/foo',
|
234
|
-
'!/flavors/foo/after',
|
235
|
-
'!/flavors/baz/after',
|
236
|
-
'!/flavors/bar/after',
|
237
|
-
'!/after',
|
238
|
-
]
|
239
|
-
end
|
240
|
-
end
|
241
|
-
|
242
|
-
describe '#deploy_flavors' do
|
243
|
-
with_temporary_directory
|
244
|
-
|
245
|
-
before :each do
|
246
|
-
@facade = described_class.new()
|
247
|
-
|
248
|
-
@test_repo_path = "#{@tmp_path}/test/origin"
|
249
|
-
|
250
|
-
@flavor = Vim::Flavor::Flavor.new()
|
251
|
-
@flavor.repo_name = '@test_repo_path'
|
252
|
-
@flavor.repo_uri = @test_repo_path
|
253
|
-
@flavor.locked_version = Gem::Version.create('1.0.0')
|
254
|
-
|
255
|
-
@flavors = [@flavor]
|
256
|
-
|
257
|
-
@vimfiles_path = "#{@tmp_path}/vimfiles"
|
258
|
-
@bootstrap_path = "#{@vimfiles_path.to_flavors_path()}/bootstrap.vim"
|
259
|
-
end
|
260
|
-
|
261
|
-
it 'should replace a given path with given flavors' do
|
262
|
-
create_a_test_repo(@test_repo_path)
|
263
|
-
@flavors.each do |f|
|
264
|
-
f.clone()
|
265
|
-
end
|
266
|
-
|
267
|
-
File.exists?(@vimfiles_path).should be_false
|
268
|
-
File.exists?(@bootstrap_path).should be_false
|
269
|
-
@flavors.each do |f|
|
270
|
-
File.exists?(f.make_deploy_path(@vimfiles_path)).should be_false
|
271
|
-
end
|
272
|
-
|
273
|
-
@facade.deploy_flavors(@flavors, @vimfiles_path)
|
274
|
-
|
275
|
-
File.exists?(@vimfiles_path).should be_true
|
276
|
-
File.exists?(@bootstrap_path).should be_true
|
277
|
-
@flavors.each do |f|
|
278
|
-
File.exists?(f.make_deploy_path(@vimfiles_path)).should be_true
|
279
|
-
end
|
280
|
-
|
281
|
-
system(<<-"END")
|
282
|
-
touch '#{@vimfiles_path}/foo'
|
283
|
-
touch '#{@vimfiles_path.to_flavors_path()}/foo'
|
284
|
-
END
|
285
|
-
|
286
|
-
File.exists?("#{@vimfiles_path}/foo").should be_true
|
287
|
-
File.exists?("#{@vimfiles_path.to_flavors_path()}/foo").should be_true
|
288
|
-
|
289
|
-
@facade.deploy_flavors(@flavors, @vimfiles_path)
|
290
|
-
|
291
|
-
File.exists?("#{@vimfiles_path}/foo").should be_true
|
292
|
-
File.exists?("#{@vimfiles_path.to_flavors_path()}/foo").should be_false
|
293
|
-
end
|
294
|
-
end
|
295
|
-
|
296
|
-
describe '#save_lockfile' do
|
297
|
-
with_temporary_directory
|
298
|
-
|
299
|
-
before :each do
|
300
|
-
@facade = described_class.new()
|
301
|
-
@facade.flavorfile_path = "#{@tmp_path}/VimFlavor"
|
302
|
-
@facade.lockfile_path = "#{@tmp_path}/VimFlavor.lock"
|
303
|
-
|
304
|
-
File.open(@facade.flavorfile_path, 'w') do |f|
|
305
|
-
f.write(<<-'END')
|
306
|
-
END
|
307
|
-
end
|
308
|
-
end
|
309
|
-
|
310
|
-
it 'should save locked flavors' do
|
311
|
-
@facade.load()
|
312
|
-
|
313
|
-
@facade.lockfile.flavors.should == {}
|
314
|
-
|
315
|
-
flavor1 = Vim::Flavor::Flavor.new()
|
316
|
-
flavor1.groups = [:default]
|
317
|
-
flavor1.locked_version = Gem::Version.create('1.2.3')
|
318
|
-
flavor1.repo_name = 'kana/vim-smartinput'
|
319
|
-
flavor1.repo_uri = 'git://github.com/kana/vim-smartinput.git'
|
320
|
-
flavor1.version_contraint = Vim::Flavor::VersionConstraint.new('>= 0')
|
321
|
-
@facade.lockfile.instance_eval do
|
322
|
-
@flavors = {
|
323
|
-
flavor1.repo_uri => flavor1,
|
324
|
-
}
|
325
|
-
end
|
326
|
-
@facade.save_lockfile()
|
327
|
-
@facade.lockfile.instance_eval do
|
328
|
-
@flavors = nil
|
329
|
-
end
|
330
|
-
|
331
|
-
@facade.lockfile.flavors.should == nil
|
332
|
-
|
333
|
-
@facade.load()
|
334
|
-
|
335
|
-
@facade.lockfile.flavors.should == {
|
336
|
-
flavor1.repo_uri => flavor1,
|
337
|
-
}
|
338
|
-
end
|
339
|
-
end
|
340
|
-
|
341
|
-
describe '#complete_locked_flavors' do
|
342
|
-
with_temporary_directory
|
343
|
-
|
344
|
-
before :each do
|
345
|
-
@test_repo_path = "#{@tmp_path}/test/origin"
|
346
|
-
@facade = described_class.new()
|
347
|
-
@facade.flavorfile_path = "#{@tmp_path}/VimFlavor"
|
348
|
-
@facade.lockfile_path = "#{@tmp_path}/VimFlavor.lock"
|
349
|
-
|
350
|
-
create_a_test_repo(@test_repo_path)
|
351
|
-
File.open(@facade.flavorfile_path, 'w') do |f|
|
352
|
-
f.write(<<-"END")
|
353
|
-
flavor 'file://#{@test_repo_path}', '~> 1.1.1'
|
354
|
-
END
|
355
|
-
end
|
356
|
-
end
|
357
|
-
|
358
|
-
it 'should complete flavors if they are not locked' do
|
359
|
-
@facade.load()
|
360
|
-
|
361
|
-
cf1 = @facade.flavorfile.flavors.values[0]
|
362
|
-
cf1.locked_version.should be_nil
|
363
|
-
File.exists?(cf1.cached_repo_path).should be_false
|
364
|
-
@facade.lockfile.flavors.should == {}
|
365
|
-
|
366
|
-
@facade.complete_locked_flavors(:upgrade_if_necessary)
|
367
|
-
|
368
|
-
lf1 = @facade.lockfile.flavors.values[0]
|
369
|
-
lf1.locked_version.should == Gem::Version.create('1.1.2')
|
370
|
-
File.exists?(lf1.cached_repo_path).should be_true
|
371
|
-
@facade.lockfile.flavors.should == {
|
372
|
-
lf1.repo_uri => lf1,
|
373
|
-
}
|
374
|
-
|
375
|
-
@facade.complete_locked_flavors(:upgrade_if_necessary)
|
376
|
-
|
377
|
-
lf1d = @facade.lockfile.flavors.values[0]
|
378
|
-
lf1d.locked_version.should == Gem::Version.create('1.1.2')
|
379
|
-
File.exists?(lf1d.cached_repo_path).should be_true
|
380
|
-
@facade.lockfile.flavors.should == {
|
381
|
-
lf1d.repo_uri => lf1d,
|
382
|
-
}
|
383
|
-
end
|
384
|
-
|
385
|
-
it 'should complete flavors if their constraint are changed' do
|
386
|
-
@facade.load()
|
387
|
-
|
388
|
-
cf1 = @facade.flavorfile.flavors.values[0]
|
389
|
-
cf1.locked_version.should be_nil
|
390
|
-
File.exists?(cf1.cached_repo_path).should be_false
|
391
|
-
@facade.lockfile.flavors.should == {}
|
392
|
-
|
393
|
-
@facade.complete_locked_flavors(:upgrade_if_necessary)
|
394
|
-
|
395
|
-
lf1 = @facade.lockfile.flavors.values[0]
|
396
|
-
lf1.locked_version.should == Gem::Version.create('1.1.2')
|
397
|
-
File.exists?(lf1.cached_repo_path).should be_true
|
398
|
-
@facade.lockfile.flavors.should == {
|
399
|
-
lf1.repo_uri => lf1,
|
400
|
-
}
|
401
|
-
|
402
|
-
cf1.version_contraint = Vim::Flavor::VersionConstraint.new('~> 1.1.2')
|
403
|
-
update_a_test_repo(@test_repo_path)
|
404
|
-
@facade.complete_locked_flavors(:upgrade_if_necessary)
|
405
|
-
|
406
|
-
lf1d = @facade.lockfile.flavors.values[0]
|
407
|
-
lf1d.locked_version.should == Gem::Version.create('1.1.9')
|
408
|
-
File.exists?(lf1d.cached_repo_path).should be_true
|
409
|
-
@facade.lockfile.flavors.should == {
|
410
|
-
lf1d.repo_uri => lf1d,
|
411
|
-
}
|
412
|
-
end
|
413
|
-
|
414
|
-
it 'should upgrade flavors even if their constraint are not changed' do
|
415
|
-
@facade.load()
|
416
|
-
|
417
|
-
cf1 = @facade.flavorfile.flavors.values[0]
|
418
|
-
cf1.locked_version.should be_nil
|
419
|
-
File.exists?(cf1.cached_repo_path).should be_false
|
420
|
-
@facade.lockfile.flavors.should == {}
|
421
|
-
|
422
|
-
@facade.complete_locked_flavors(:upgrade_all)
|
423
|
-
|
424
|
-
lf1 = @facade.lockfile.flavors.values[0]
|
425
|
-
lf1.locked_version.should == Gem::Version.create('1.1.2')
|
426
|
-
File.exists?(lf1.cached_repo_path).should be_true
|
427
|
-
@facade.lockfile.flavors.should == {
|
428
|
-
lf1.repo_uri => lf1,
|
429
|
-
}
|
430
|
-
|
431
|
-
update_a_test_repo(@test_repo_path)
|
432
|
-
@facade.complete_locked_flavors(:upgrade_all)
|
433
15
|
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
@facade.lockfile.should be_nil
|
473
|
-
|
474
|
-
@facade.install(@vimfiles_path)
|
475
|
-
|
476
|
-
File.exists?(@facade.lockfile_path).should be_true
|
477
|
-
File.exists?(@vimfiles_path).should be_true
|
478
|
-
@facade.lockfile.flavors.values.each do |f|
|
479
|
-
File.exists?(f.make_deploy_path(@vimfiles_path)).should be_true
|
480
|
-
end
|
481
|
-
end
|
482
|
-
|
483
|
-
it 'should respect existing VimFlavor.lock if possible' do
|
484
|
-
def self.install()
|
485
|
-
@facade.install(@vimfiles_path)
|
486
|
-
[
|
487
|
-
@facade.lockfile.flavors.map {|_, f| f.locked_version},
|
488
|
-
@facade.flavorfile.flavors.count(),
|
489
|
-
]
|
490
|
-
end
|
491
|
-
|
492
|
-
result1 = self.install()
|
493
|
-
update_a_test_repo(@test_repo_path)
|
494
|
-
result2 = self.install()
|
495
|
-
|
496
|
-
result2.should == result1
|
497
|
-
end
|
498
|
-
end
|
499
|
-
|
500
|
-
describe '#upgrade' do
|
501
|
-
with_temporary_directory
|
502
|
-
|
503
|
-
before :each do
|
504
|
-
@test_repo_path = "#{@tmp_path}/test/origin"
|
505
|
-
@vimfiles_path = "#{@tmp_path}/vimfiles"
|
506
|
-
@facade = described_class.new()
|
507
|
-
@facade.flavorfile_path = "#{@tmp_path}/VimFlavor"
|
508
|
-
@facade.lockfile_path = "#{@tmp_path}/VimFlavor.lock"
|
509
|
-
|
510
|
-
create_a_test_repo(@test_repo_path)
|
511
|
-
File.open(@facade.flavorfile_path, 'w') do |f|
|
512
|
-
f.write(<<-"END")
|
513
|
-
flavor 'file://#{@test_repo_path}', '~> 1.1.1'
|
514
|
-
END
|
515
|
-
end
|
516
|
-
end
|
517
|
-
|
518
|
-
it 'should upgrade Vim plugins according to VimFlavor' do
|
519
|
-
File.exists?(@facade.lockfile_path).should be_false
|
520
|
-
File.exists?(@vimfiles_path).should be_false
|
521
|
-
@facade.lockfile.should be_nil
|
522
|
-
|
523
|
-
@facade.upgrade(@vimfiles_path)
|
524
|
-
|
525
|
-
File.exists?(@facade.lockfile_path).should be_true
|
526
|
-
File.exists?(@vimfiles_path).should be_true
|
527
|
-
@facade.lockfile.flavors.values.each do |f|
|
528
|
-
File.exists?(f.make_deploy_path(@vimfiles_path)).should be_true
|
529
|
-
end
|
530
|
-
end
|
531
|
-
|
532
|
-
it 'should always upgrade existing VimFlavor.lock' do
|
533
|
-
def self.upgrade()
|
534
|
-
@facade.upgrade(@vimfiles_path)
|
535
|
-
[
|
536
|
-
@facade.lockfile.flavors.map {|_, f| f.locked_version},
|
537
|
-
@facade.flavorfile.flavors.count(),
|
538
|
-
]
|
16
|
+
it 'creates a bootstrap script to configure runtimepath for flavors' do
|
17
|
+
vimfiles_path = @tmp_path.to_vimfiles_path
|
18
|
+
Facade.new().create_vim_script_for_bootstrap(vimfiles_path)
|
19
|
+
|
20
|
+
File.should exist(vimfiles_path.to_flavors_path.to_bootstrap_path)
|
21
|
+
|
22
|
+
_rtp = %x{
|
23
|
+
for plugin_name in 'foo' 'bar' 'baz'
|
24
|
+
do
|
25
|
+
mkdir -p "#{vimfiles_path.to_flavors_path}/$plugin_name"
|
26
|
+
done
|
27
|
+
HOME='#{@tmp_path}' vim -u NONE -i NONE -n -N -e -s -c '
|
28
|
+
set verbose=1
|
29
|
+
let vimfiles_path = split(&runtimepath, ",")[0]
|
30
|
+
runtime flavors/bootstrap.vim
|
31
|
+
for path in split(&runtimepath, ",")
|
32
|
+
if stridx(path, vimfiles_path) == 0
|
33
|
+
echo substitute(path, vimfiles_path, "!", "")
|
34
|
+
endif
|
35
|
+
endfor
|
36
|
+
qall!
|
37
|
+
' 2>&1
|
38
|
+
}
|
39
|
+
rtps =
|
40
|
+
_rtp.
|
41
|
+
split(/[\r\n]/).
|
42
|
+
select {|p| p != ''}
|
43
|
+
rtps.should == [
|
44
|
+
'!',
|
45
|
+
'!/flavors/bar',
|
46
|
+
'!/flavors/baz',
|
47
|
+
'!/flavors/foo',
|
48
|
+
'!/flavors/foo/after',
|
49
|
+
'!/flavors/baz/after',
|
50
|
+
'!/flavors/bar/after',
|
51
|
+
'!/after',
|
52
|
+
]
|
53
|
+
end
|
539
54
|
end
|
540
|
-
|
541
|
-
result1 = self.upgrade()
|
542
|
-
update_a_test_repo(@test_repo_path)
|
543
|
-
result2 = self.upgrade()
|
544
|
-
|
545
|
-
result2.should_not == result1
|
546
55
|
end
|
547
56
|
end
|
548
57
|
end
|