vim-flavor 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitmodules ADDED
@@ -0,0 +1,6 @@
1
+ [submodule "vendor/kana/vim-vspec"]
2
+ path = vendor/kana/vim-vspec
3
+ url = git://github.com/kana/vim-vspec
4
+ [submodule "vendor/kana/vim-textobj-user"]
5
+ path = vendor/kana/vim-textobj-user
6
+ url = git://github.com/kana/vim-textobj-user
data/README.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # vim-flavor, a tool to manage your favorite Vim plugins
2
2
 
3
+ [![Build Status](https://travis-ci.org/kana/vim-flavor.png)](https://travis-ci.org/kana/vim-flavor)
4
+ [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/kana/vim-flavor)
5
+
6
+
7
+
8
+
9
+ ## Getting started
10
+
3
11
  cd $YOUR_REPOSITORY_FOR_DOTFILES
4
12
 
5
13
  cat >VimFlavor <<'END'
data/features/.nav CHANGED
@@ -6,7 +6,9 @@
6
6
  - upgrade_vim_plugins.feature
7
7
  - uninstall_vim_plugins.feature
8
8
  - deploy_to_arbitrary_place.feature
9
+ - command_line:
9
10
  - flavorfile:
10
11
  - version_lock.feature
11
12
  - caching.feature
12
13
  - resolve_dependencies.feature
14
+ - testing_vim_plugins:
@@ -16,7 +16,7 @@ Feature: Progress messages
16
16
  flavor '$bar_uri'
17
17
  """
18
18
  When I run `vim-flavor install`
19
- Then it outputs progress like
19
+ Then it outputs progress as follows
20
20
  """
21
21
  Checking versions...
22
22
  Use $bar_uri ... 2.0.2
@@ -37,7 +37,7 @@ Feature: Progress messages
37
37
  """
38
38
  fatal: '\S+' does not appear to be a git repository
39
39
  """
40
- And it outputs progress like
40
+ And it outputs progress as follows
41
41
  """
42
42
  Checking versions...
43
43
  Use no-such-plugin ... failed
@@ -0,0 +1,60 @@
1
+ Feature: Groups
2
+ In order to deploy a specific set of Vim plugins,
3
+ as a lazy Vim user,
4
+ I want to declare groups of flavors.
5
+
6
+ Background:
7
+ Given a temporary directory called 'tmp'
8
+ And a home directory called 'home' in '$tmp/home'
9
+ And a repository 'foo' with versions '1.0 1.1 1.2'
10
+ And a repository 'bar' with versions '2.0 2.1 2.2'
11
+
12
+ Scenario: Install only runtime dependencies
13
+ Given flavorfile
14
+ """ruby
15
+ flavor '$foo_uri', :group => :runtime
16
+ flavor '$bar_uri', :group => :development
17
+ """
18
+ When I run `vim-flavor install`
19
+ Then I get lockfile
20
+ """
21
+ $bar_uri (2.2)
22
+ $foo_uri (1.2)
23
+ """
24
+ And I get a bootstrap script in '$home/.vim'
25
+ And I get flavor '$foo_uri' with '1.2' in '$home/.vim'
26
+ But I don't have flavor '$bar_uri' in '$home/.vim'
27
+
28
+ Scenario: The default group
29
+ Given flavorfile
30
+ """ruby
31
+ flavor '$foo_uri'
32
+ flavor '$bar_uri', :group => :development
33
+ """
34
+ When I run `vim-flavor install`
35
+ Then I get lockfile
36
+ """
37
+ $bar_uri (2.2)
38
+ $foo_uri (1.2)
39
+ """
40
+ And I get a bootstrap script in '$home/.vim'
41
+ And I get flavor '$foo_uri' with '1.2' in '$home/.vim'
42
+ But I don't have flavor '$bar_uri' in '$home/.vim'
43
+
44
+ Scenario: Group a bunch of flavors at once
45
+ Given flavorfile
46
+ """ruby
47
+ group :development do
48
+ flavor '$foo_uri'
49
+ flavor '$bar_uri'
50
+ end
51
+ """
52
+ When I run `vim-flavor install`
53
+ Then I get lockfile
54
+ """
55
+ $bar_uri (2.2)
56
+ $foo_uri (1.2)
57
+ """
58
+ And I get a bootstrap script in '$home/.vim'
59
+ But I don't have flavor '$foo_uri' in '$home/.vim'
60
+ But I don't have flavor '$bar_uri' in '$home/.vim'
@@ -23,12 +23,21 @@ When /^I run `vim-flavor(.*)`(?: again)?(?:,? (but))?$/ do |args, mode|
23
23
  end
24
24
  end
25
25
 
26
+ Then /^it succeeds$/ do
27
+ @last_error.should be_nil
28
+ end
29
+
26
30
  Then /^it fails with messages like$/ do |pattern|
27
31
  @last_error.should_not be_nil
28
32
  @last_error.message.should match Regexp.new(pattern.strip().gsub(/\s+/, '\s+'))
29
33
  end
30
34
 
31
- Then 'it outputs progress like' do |text|
35
+ Then 'it outputs progress as follows' do |text|
32
36
  # For some reason, Cucumber drops the last newline from every docstring...
33
37
  @output.string.should include expand(text + "\n")
34
38
  end
39
+
40
+ Then 'it outputs progress like' do |pattern|
41
+ # For some reason, Cucumber drops the last newline from every docstring...
42
+ @output.string.should match Regexp.new(expand(pattern + "\n"))
43
+ end
@@ -0,0 +1,3 @@
1
+ Then /^it stores a dependency '(.*)' in '(.*)'$/ do |repo_name, vdir|
2
+ Dir.should exist expand("#{vdir}/#{repo_name.zap}")
3
+ end
@@ -0,0 +1,9 @@
1
+ Given /^a file called '(.*)'$/ do |virtual_path, content|
2
+ create_file expand(virtual_path), expand(content)
3
+ end
4
+
5
+ Given /^an executable called '(.*)'$/ do |virtual_path, content|
6
+ path = expand(virtual_path)
7
+ create_file path, expand(content)
8
+ File.chmod(0755, path)
9
+ end
@@ -2,7 +2,7 @@ Given /^a repository '(.+)' with versions '(.+)'$/ do |basename, versions|
2
2
  repository_path = make_repo_path(basename)
3
3
  doc_name = basename.split('/').last.sub(/^vim-/, '')
4
4
  variable_table["#{basename}_uri"] = make_repo_uri(basename)
5
- system <<-"END"
5
+ sh <<-"END"
6
6
  {
7
7
  mkdir -p '#{repository_path}' &&
8
8
  cd '#{repository_path}' &&
@@ -19,6 +19,15 @@ Given /^a repository '(.+)' with versions '(.+)'$/ do |basename, versions|
19
19
  END
20
20
  end
21
21
 
22
+ Given /^a repository '(.+)' from offline cache$/ do |repo_name|
23
+ repository_path = make_repo_path(repo_name)
24
+ sh <<-"END"
25
+ {
26
+ git clone 'vendor/#{repo_name}' '#{repository_path}'
27
+ } >/dev/null
28
+ END
29
+ end
30
+
22
31
  Given /^I disable network to the original repository of '(.+)'$/ do |basename|
23
32
  delete_path make_repo_path(basename)
24
33
  end
@@ -2,6 +2,8 @@ require 'fileutils'
2
2
  require 'vim-flavor'
3
3
 
4
4
  class FakeUserEnvironment
5
+ include Vim::Flavor::ShellUtility
6
+
5
7
  def initialize()
6
8
  env = self
7
9
  Vim::Flavor::Flavor.instance_eval do
@@ -12,6 +14,7 @@ class FakeUserEnvironment
12
14
  end
13
15
 
14
16
  def create_file path, content
17
+ FileUtils.mkdir_p(File.dirname(path))
15
18
  File.open(path, 'w') do |f|
16
19
  f.write(content)
17
20
  end
@@ -47,3 +50,5 @@ end
47
50
  World do
48
51
  FakeUserEnvironment.new
49
52
  end
53
+
54
+ ENV['THOR_DEBUG'] = '1' # To raise an exception as is.
@@ -0,0 +1,47 @@
1
+ ## Short summary
2
+
3
+ 1. Write tests for your Vim plugin with
4
+ [vim-vspec](https://github.com/kana/vim-vspec).
5
+ 2. Declare dependencies of your Vim plugin as a [flavorfile](flavorfile), and
6
+ save it as `VimFlavor` in the root of your Vim plugin.
7
+ 3. Run `vim-flavor test`.
8
+
9
+
10
+
11
+
12
+ ## Long story
13
+
14
+ It is hard to test Vim plugins, because there are a few problems:
15
+
16
+ * It is hard to write readable and maintainable test code in Vim script, even
17
+ for skilled users. Because Vim script is not expressive as script languages
18
+ like Ruby and others.
19
+ * Each test must be run in an isolated environment to guarantee the same
20
+ results for every time and everywhere. So that all settings including vimrc
21
+ and plugins must be ignored. User's viminfo must not be read and written
22
+ too.
23
+ * Some plugins require other plugins at runtime. Such dependencies must be
24
+ resolved, but they must be installed into a temporary place to avoid
25
+ corrupting user's settings. And `'runtimepath'` must be configured
26
+ carefully for both dependencies and plugins under development.
27
+
28
+ Therefore it is hard to do right testing for Vim plugins from scratch. As
29
+ a lazy Vim user, I want to abstract all of the complexity.
30
+
31
+ Fortunately, the problems can be solved partially with
32
+ [vim-vspec](https://github.com/kana/vim-vspec), a testing framework for Vim
33
+ script. It provides a DSL based on Vim script to write readable test code.
34
+ It provides also a driver script to run tests. The driver script hides
35
+ details about the isolation of Vim processes and `'runtimepath'`
36
+ configuration.
37
+
38
+ However, vim-vspec is a tool to write tests, not a tool to set up environment
39
+ to test. So that it does nothing about dependencies. And it is painful to
40
+ manage dependencies by hand. But it is easy with vim-flavor. The complexity
41
+ can be hidden by combining both tools. That's why vim-flavor is integrated
42
+ with vim-vspec.
43
+
44
+
45
+
46
+
47
+ <!-- vim: set expandtab shiftwidth=4 softtabstop=4 textwidth=78 : -->
@@ -0,0 +1,61 @@
1
+ Feature: Dependencies
2
+ In order to easily test Vim plugins with dependencies,
3
+ As a lazy Vim user,
4
+ I want to hide details to do proper testing.
5
+
6
+ Background:
7
+ Given a temporary directory called 'tmp'
8
+ And a home directory called 'home' in '$tmp/home'
9
+ And a repository 'kana/vim-vspec' from offline cache
10
+ And a repository 'kana/vim-textobj-user' from offline cache
11
+
12
+ Scenario: Testing a Vim plugin with dependencies
13
+ Given flavorfile
14
+ """
15
+ flavor 'kana/vim-textobj-user', '~> 0.3'
16
+ """
17
+ And a file called '$tmp/plugin/textobj/date.vim'
18
+ """
19
+ call textobj#user#plugin('date', {
20
+ \ '-': {
21
+ \ '*pattern*': '\v<\d{4}-\d{2}-\d{2}>',
22
+ \ 'select': ['ad', 'id'],
23
+ \ }
24
+ \ })
25
+ """
26
+ And a file called '$tmp/t/basics.vim'
27
+ """
28
+ " Tests are written with vim-vspec.
29
+ runtime! plugin/textobj/date.vim
30
+ describe 'Text object: date'
31
+ it 'is available in Visual mode'
32
+ Expect maparg('ad', 'v') != ''
33
+ end
34
+ end
35
+ """
36
+ When I run `vim-flavor test`
37
+ Then it succeeds
38
+ And it outputs progress like
39
+ """
40
+ -------- Preparing dependencies
41
+ Checking versions...
42
+ Use kana/vim-textobj-user ... 0.3.12
43
+ Use kana/vim-vspec ... 1.1.0
44
+ Deploying plugins...
45
+ kana/vim-textobj-user 0.3.12 ... done
46
+ kana/vim-vspec 1.1.0 ... done
47
+ -------- Testing a Vim plugin
48
+ Files=0, Tests=0, \d+ wallclock secs .*
49
+ Result: NOTESTS
50
+ t/basics.vim .. ok
51
+ All tests successful.
52
+ Files=1, Tests=1, \d+ wallclock secs .*
53
+ Result: PASS
54
+ """
55
+ And I get lockfile
56
+ """
57
+ kana/vim-textobj-user (0.3.12)
58
+ kana/vim-vspec (1.1.0)
59
+ """
60
+ And it stores a dependency 'kana/vim-vspec' in '$tmp/.vim-flavor/deps'
61
+ And it stores a dependency 'kana/vim-textobj-user' in '$tmp/.vim-flavor/deps'
@@ -0,0 +1,61 @@
1
+ Feature: Typical usage
2
+ In order to easily test Vim plugins,
3
+ As a lazy Vim user,
4
+ I want to hide details to do proper testing.
5
+
6
+ Background:
7
+ Given a temporary directory called 'tmp'
8
+ And a home directory called 'home' in '$tmp/home'
9
+ And a repository 'kana/vim-vspec' from offline cache
10
+
11
+ Scenario: Testing a Vim plugin without any dependency
12
+ Given flavorfile
13
+ """
14
+ # No dependency
15
+ """
16
+ And a file called '$tmp/plugin/foo.vim'
17
+ """
18
+ let g:foo = 3
19
+ """
20
+ And a file called '$tmp/t/basics.vim'
21
+ """
22
+ " Tests are written with vim-vspec.
23
+ runtime! plugin/foo.vim
24
+ describe 'g:foo'
25
+ it 'is equal to 3'
26
+ Expect g:foo == 3
27
+ end
28
+ end
29
+ """
30
+ And an executable called '$tmp/t/sh.t'
31
+ """
32
+ #!/bin/bash
33
+ # It is also possible to write tests with arbitrary tools.
34
+ # Such tests must output results in Test Anything Protocol.
35
+ echo 'ok 1'
36
+ echo '1..1'
37
+ """
38
+ When I run `vim-flavor test`
39
+ Then it succeeds
40
+ And it outputs progress like
41
+ """
42
+ -------- Preparing dependencies
43
+ Checking versions...
44
+ Use kana/vim-vspec ... 1.1.0
45
+ Deploying plugins...
46
+ kana/vim-vspec 1.1.0 ... done
47
+ -------- Testing a Vim plugin
48
+ t/sh.t .. ok
49
+ All tests successful.
50
+ Files=1, Tests=1, \d+ wallclock secs .*
51
+ Result: PASS
52
+ t/basics.vim .. ok
53
+ All tests successful.
54
+ Files=1, Tests=1, \d+ wallclock secs .*
55
+ Result: PASS
56
+ """
57
+ And I get lockfile
58
+ """
59
+ kana/vim-vspec (1.1.0)
60
+ """
61
+ And it stores a dependency 'kana/vim-vspec' in '$tmp/.vim-flavor/deps'
@@ -44,7 +44,7 @@ and `vim-flavor` does it.
44
44
  The file is called a flavorfile. A flavorfile contains zero or more
45
45
  declarations about Vim plugins and which versions of Vim plugins to use.
46
46
 
47
- See also [Flavorfile details](../flavorfile).
47
+ See also [more details about flavorfile](flavorfile).
48
48
 
49
49
 
50
50
 
@@ -3,10 +3,14 @@ require 'thor'
3
3
  module Vim
4
4
  module Flavor
5
5
  class CLI < Thor
6
+ def self.common_options_to_deploy
7
+ method_option :vimfiles_path,
8
+ :desc => 'Where to install Vim plugins.',
9
+ :banner => 'DIR'
10
+ end
11
+
6
12
  desc 'install', 'Install Vim plugins according to VimFlavor file.'
7
- method_option :vimfiles_path,
8
- :desc => 'Where to install Vim plugins.',
9
- :banner => 'DIR'
13
+ common_options_to_deploy
10
14
  def install
11
15
  Facade.new().install(
12
16
  options[:vimfiles_path] || default_vimfiles_path
@@ -14,19 +18,32 @@ module Vim
14
18
  end
15
19
 
16
20
  desc 'upgrade', 'Upgrade Vim plugins according to VimFlavor file.'
17
- method_option :vimfiles_path,
18
- :desc => 'Where to install Vim plugins.',
19
- :banner => 'DIR'
21
+ common_options_to_deploy
20
22
  def upgrade
21
23
  Facade.new().upgrade(
22
24
  options[:vimfiles_path] || default_vimfiles_path
23
25
  )
24
26
  end
25
27
 
28
+ desc 'test', 'Test a Vim plugin in the current working directory.'
29
+ def test
30
+ Facade.new().test()
31
+ end
32
+
26
33
  no_tasks do
27
34
  def default_vimfiles_path
28
35
  ENV['HOME'].to_vimfiles_path
29
36
  end
37
+
38
+ def normalize_groups(s)
39
+ groups =
40
+ (s || '').
41
+ split(/,/).
42
+ map(&:strip).
43
+ reject(&:empty?).
44
+ map(&:to_sym)
45
+ 0 < groups.length ? groups : nil
46
+ end
30
47
  end
31
48
  end
32
49
  end
@@ -3,6 +3,8 @@ require 'fileutils'
3
3
  module Vim
4
4
  module Flavor
5
5
  class Facade
6
+ include ShellUtility
7
+
6
8
  def trace message
7
9
  print message
8
10
  end
@@ -20,7 +22,10 @@ module Vim
20
22
  )
21
23
  lockfile.save()
22
24
 
23
- deploy_flavors(lockfile.flavors, vimfiles_path)
25
+ deploy_flavors(
26
+ lockfile.flavors.select {|f| f.group == :runtime},
27
+ vimfiles_path.to_flavors_path
28
+ )
24
29
 
25
30
  trace "Completed.\n"
26
31
  end
@@ -61,27 +66,27 @@ module Vim
61
66
  completed_flavor_table
62
67
  end
63
68
 
64
- def deploy_flavors(flavors, vimfiles_path)
69
+ def deploy_flavors(flavors, flavors_path)
65
70
  trace "Deploying plugins...\n"
66
71
 
67
72
  FileUtils.rm_rf(
68
- ["#{vimfiles_path.to_flavors_path}"],
73
+ [flavors_path],
69
74
  :secure => true
70
75
  )
71
76
 
72
- create_vim_script_for_bootstrap(vimfiles_path)
77
+ create_vim_script_for_bootstrap(flavors_path)
73
78
 
74
79
  flavors.
75
80
  before_each {|f| trace " #{f.repo_name} #{f.locked_version} ..."}.
76
81
  after_each {|f| trace " done\n"}.
77
82
  on_failure {trace " failed\n"}.
78
83
  each do |f|
79
- f.deploy(vimfiles_path)
84
+ f.deploy(flavors_path)
80
85
  end
81
86
  end
82
87
 
83
- def create_vim_script_for_bootstrap(vimfiles_path)
84
- bootstrap_path = vimfiles_path.to_flavors_path.to_bootstrap_path
88
+ def create_vim_script_for_bootstrap(flavors_path)
89
+ bootstrap_path = flavors_path.to_bootstrap_path
85
90
  FileUtils.mkdir_p(File.dirname(bootstrap_path))
86
91
  File.open(bootstrap_path, 'w') do |f|
87
92
  f.write(<<-'END')
@@ -113,6 +118,45 @@ module Vim
113
118
  END
114
119
  end
115
120
  end
121
+
122
+ def test()
123
+ trace "-------- Preparing dependencies\n"
124
+
125
+ flavorfile = FlavorFile.load_or_new(Dir.getwd().to_flavorfile_path)
126
+ flavorfile.flavor 'kana/vim-vspec', '~> 1.0', :group => :development unless
127
+ flavorfile.flavor_table.has_key?('kana/vim-vspec')
128
+ lockfile = LockFile.load_or_new(Dir.getwd().to_lockfile_path)
129
+
130
+ lockfile.update(
131
+ complete(
132
+ flavorfile.flavor_table,
133
+ lockfile.flavor_table,
134
+ :install
135
+ )
136
+ )
137
+ lockfile.save()
138
+
139
+ # FIXME: It's somewhat wasteful to refresh flavors every time.
140
+ deploy_flavors(
141
+ lockfile.flavors,
142
+ Dir.getwd().to_stash_path.to_deps_path
143
+ )
144
+
145
+ trace "-------- Testing a Vim plugin\n"
146
+
147
+ prove_options = '--comments --failure --directives'
148
+ deps_path = Dir.getwd().to_stash_path.to_deps_path
149
+ vspec = "#{deps_path}/#{'kana/vim-vspec'.zap}/bin/vspec"
150
+ plugin_paths = lockfile.flavors.map {|f|
151
+ "#{deps_path}/#{f.repo_name.zap}"
152
+ }
153
+ # FIXME: Testing messages are not outputted in real time.
154
+ print sh %Q{
155
+ prove --ext '.t' #{prove_options} &&
156
+ prove --ext '.vim' #{prove_options} \
157
+ --exec '#{vspec} #{Dir.getwd()} #{plugin_paths.join(' ')}'
158
+ }
159
+ end
116
160
  end
117
161
  end
118
162
  end
@@ -1,6 +1,8 @@
1
1
  module Vim
2
2
  module Flavor
3
3
  class Flavor
4
+ include ShellUtility
5
+
4
6
  # A short name of a repository.
5
7
  # Possible formats are "$user/$repo", "$repo" and "$repo_uri".
6
8
  attr_accessor :repo_name
@@ -8,6 +10,9 @@ module Vim
8
10
  # A constraint to choose a proper version.
9
11
  attr_accessor :version_constraint
10
12
 
13
+ # A group which this flavor belongs to.
14
+ attr_accessor :group
15
+
11
16
  # A version of a plugin to be installed.
12
17
  attr_accessor :locked_version
13
18
 
@@ -61,8 +66,8 @@ module Vim
61
66
  }
62
67
  end
63
68
 
64
- def deploy(vimfiles_path)
65
- deployment_path = "#{vimfiles_path.to_flavors_path}/#{repo_name.zap}"
69
+ def deploy(flavors_path)
70
+ deployment_path = "#{flavors_path}/#{repo_name.zap}"
66
71
  sh %Q[
67
72
  {
68
73
  cd '#{cached_repo_path}' &&
@@ -108,15 +113,6 @@ module Vim
108
113
  versions_from_tags(list_tags())
109
114
  end
110
115
 
111
- def sh script
112
- output = send(:`, script)
113
- if $? == 0
114
- output
115
- else
116
- raise RuntimeError, output
117
- end
118
- end
119
-
120
116
  def satisfied_with?(locked_flavor)
121
117
  repo_name == locked_flavor.repo_name &&
122
118
  version_constraint.compatible?(locked_flavor.locked_version)
@@ -6,6 +6,20 @@ module Vim
6
6
  @flavor_table ||= {}
7
7
  end
8
8
 
9
+ def default_groups
10
+ @default_groups ||= [:runtime]
11
+ end
12
+
13
+ def default_group
14
+ default_groups.last
15
+ end
16
+
17
+ def self.load_or_new(flavorfile_path)
18
+ ff = new()
19
+ ff.load(flavorfile_path) if File.exists?(flavorfile_path)
20
+ ff
21
+ end
22
+
9
23
  def self.load(flavorfile_path)
10
24
  ff = new()
11
25
  ff.load(flavorfile_path)
@@ -19,12 +33,31 @@ module Vim
19
33
  )
20
34
  end
21
35
 
22
- def flavor(repo_name, version_constraint='>= 0')
36
+ # :call-seq:
37
+ # flavor repo_name, version_constraint='>= 0', options={} -> a_flavor
38
+ def flavor(repo_name, *args)
39
+ a = args.shift()
40
+ if a.kind_of?(String)
41
+ version_constraint = a
42
+ a = args.shift()
43
+ else
44
+ version_constraint = '>= 0'
45
+ end
46
+ options = a.kind_of?(Hash) ? a : {}
47
+
23
48
  f = Flavor.new()
24
49
  f.repo_name = repo_name
25
50
  f.version_constraint = VersionConstraint.new(version_constraint)
51
+ f.group = options[:group] || default_group
26
52
  flavor_table[f.repo_name] = f
27
53
  end
54
+
55
+ def group(group, &block)
56
+ default_groups.push(group)
57
+ instance_eval &block
58
+ ensure
59
+ default_groups.pop()
60
+ end
28
61
  end
29
62
  end
30
63
  end
@@ -0,0 +1,14 @@
1
+ module Vim
2
+ module Flavor
3
+ module ShellUtility
4
+ def sh script
5
+ output = send(:`, script)
6
+ if $? == 0
7
+ output
8
+ else
9
+ raise RuntimeError, output
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -5,6 +5,10 @@ module Vim
5
5
  "#{self}/bootstrap.vim"
6
6
  end
7
7
 
8
+ def to_deps_path
9
+ "#{self}/deps"
10
+ end
11
+
8
12
  def to_flavorfile_path
9
13
  "#{self}/VimFlavor"
10
14
  end
@@ -1,5 +1,5 @@
1
1
  module Vim
2
2
  module Flavor
3
- VERSION = '1.0.0'
3
+ VERSION = '1.0.1'
4
4
  end
5
5
  end
data/lib/vim-flavor.rb CHANGED
@@ -10,6 +10,7 @@ module Vim
10
10
  :FlavorFile,
11
11
  :LockFile,
12
12
  :LockFileParser,
13
+ :ShellUtility,
13
14
  :StringExtension,
14
15
  :VERSION,
15
16
  :VersionConstraint,
data/spec/facade_spec.rb CHANGED
@@ -14,15 +14,15 @@ module Vim
14
14
  end
15
15
 
16
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)
17
+ flavors_path = @tmp_path.to_vimfiles_path.to_flavors_path
18
+ Facade.new().create_vim_script_for_bootstrap(flavors_path)
19
19
 
20
- File.should exist(vimfiles_path.to_flavors_path.to_bootstrap_path)
20
+ File.should exist(flavors_path.to_bootstrap_path)
21
21
 
22
22
  _rtp = %x{
23
23
  for plugin_name in 'foo' 'bar' 'baz'
24
24
  do
25
- mkdir -p "#{vimfiles_path.to_flavors_path}/$plugin_name"
25
+ mkdir -p "#{flavors_path}/$plugin_name"
26
26
  done
27
27
  HOME='#{@tmp_path}' vim -u NONE -i NONE -n -N -e -s -c '
28
28
  set verbose=1
@@ -4,20 +4,86 @@ module Vim
4
4
  module Flavor
5
5
  describe FlavorFile do
6
6
  describe '#flavor' do
7
- it 'registers a flavor' do
8
- ff = FlavorFile.new()
9
- ff.flavor 'kana/vim-altr', '>= 1.2.3'
10
- f = ff.flavor_table['kana/vim-altr']
11
- f.repo_name.should == 'kana/vim-altr'
12
- f.version_constraint.should == VersionConstraint.new('>= 1.2.3')
7
+ let(:ff) {FlavorFile.new()}
8
+
9
+ context 'basics' do
10
+ it 'registers a flavor' do
11
+ ff.flavor 'kana/vim-altr', '>= 1.2.3'
12
+ f = ff.flavor_table['kana/vim-altr']
13
+ f.repo_name.should == 'kana/vim-altr'
14
+ f.version_constraint.should == VersionConstraint.new('>= 1.2.3')
15
+ end
16
+
17
+ it 'completes version constraint if it is not given' do
18
+ ff.flavor 'kana/vim-altr'
19
+ f = ff.flavor_table['kana/vim-altr']
20
+ f.repo_name.should == 'kana/vim-altr'
21
+ f.version_constraint.should == VersionConstraint.new('>= 0')
22
+ end
13
23
  end
14
24
 
15
- it 'completes version constraint if it is not given' do
16
- ff = FlavorFile.new()
17
- ff.flavor 'kana/vim-altr'
18
- f = ff.flavor_table['kana/vim-altr']
19
- f.repo_name.should == 'kana/vim-altr'
20
- f.version_constraint.should == VersionConstraint.new('>= 0')
25
+ context 'group option' do
26
+ it 'supports a group option with a version constraint' do
27
+ ff.flavor 'kana/vim-vspec', '~> 1.0', :group => :development
28
+ f = ff.flavor_table['kana/vim-vspec']
29
+ f.version_constraint.should == VersionConstraint.new('~> 1.0')
30
+ f.group.should == :development
31
+ end
32
+
33
+ it 'supports a group option without version constraint' do
34
+ ff.flavor 'kana/vim-vspec', :group => :development
35
+ f = ff.flavor_table['kana/vim-vspec']
36
+ f.version_constraint.should == VersionConstraint.new('>= 0')
37
+ f.group.should == :development
38
+ end
39
+
40
+ it 'uses :default as the default group' do
41
+ ff.flavor 'kana/vim-vspec'
42
+ f = ff.flavor_table['kana/vim-vspec']
43
+ f.group.should == :runtime
44
+ end
45
+ end
46
+
47
+ context 'group block' do
48
+ it 'changes the default group for flavors in a given block' do
49
+ ff.flavor 'a'
50
+ ff.group :outer do
51
+ flavor 'b'
52
+ group :inner do
53
+ flavor 'c'
54
+ end
55
+ flavor 'd'
56
+ end
57
+ ff.flavor 'e'
58
+
59
+ ff.flavor_table['a'].group.should == :runtime
60
+ ff.flavor_table['b'].group.should == :outer
61
+ ff.flavor_table['c'].group.should == :inner
62
+ ff.flavor_table['d'].group.should == :outer
63
+ ff.flavor_table['e'].group.should == :runtime
64
+ end
65
+
66
+ it 'restores the default group even if an exception is raised' do
67
+ ff.flavor 'a'
68
+ ff.group :outer do
69
+ begin
70
+ flavor 'b'
71
+ group :inner do
72
+ raise RuntimeError
73
+ flavor 'c'
74
+ end
75
+ rescue
76
+ end
77
+ flavor 'd'
78
+ end
79
+ ff.flavor 'e'
80
+
81
+ ff.flavor_table['a'].group.should == :runtime
82
+ ff.flavor_table['b'].group.should == :outer
83
+ ff.flavor_table['c'].should be_nil
84
+ ff.flavor_table['d'].group.should == :outer
85
+ ff.flavor_table['e'].group.should == :runtime
86
+ end
21
87
  end
22
88
  end
23
89
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vim-flavor
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-21 00:00:00.000000000 Z
12
+ date: 2012-12-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: parslet
@@ -84,6 +84,7 @@ extensions: []
84
84
  extra_rdoc_files: []
85
85
  files:
86
86
  - .gitignore
87
+ - .gitmodules
87
88
  - .rspec
88
89
  - .travis.yml
89
90
  - Gemfile
@@ -98,6 +99,7 @@ files:
98
99
  - features/command_line/progress_messages.feature
99
100
  - features/flavorfile/README.md
100
101
  - features/flavorfile/comments.feature
102
+ - features/flavorfile/groups.feature
101
103
  - features/flavorfile/repository_name.feature
102
104
  - features/flavorfile/version_constraint.feature
103
105
  - features/install_vim_flavor.md
@@ -105,11 +107,16 @@ files:
105
107
  - features/resolve_dependencies.feature
106
108
  - features/step_definitions/bootstrap_script_steps.rb
107
109
  - features/step_definitions/cli_steps.rb
110
+ - features/step_definitions/dependency_steps.rb
108
111
  - features/step_definitions/directory_steps.rb
112
+ - features/step_definitions/file_steps.rb
109
113
  - features/step_definitions/flavor_steps.rb
110
114
  - features/step_definitions/flavorfile_steps.rb
111
115
  - features/step_definitions/lockfile_steps.rb
112
116
  - features/support/env.rb
117
+ - features/testing_vim_plugins/README.md
118
+ - features/testing_vim_plugins/dependencies.feature
119
+ - features/testing_vim_plugins/typical_usage.feature
113
120
  - features/typical_usage/README.md
114
121
  - features/typical_usage/deploy_to_arbitrary_place.feature
115
122
  - features/typical_usage/install_vim_plugins.feature
@@ -125,6 +132,7 @@ files:
125
132
  - lib/vim-flavor/flavorfile.rb
126
133
  - lib/vim-flavor/lockfile.rb
127
134
  - lib/vim-flavor/lockfileparser.rb
135
+ - lib/vim-flavor/shellutility.rb
128
136
  - lib/vim-flavor/stringextension.rb
129
137
  - lib/vim-flavor/version.rb
130
138
  - lib/vim-flavor/versionconstraint.rb
@@ -168,6 +176,7 @@ test_files:
168
176
  - features/command_line/progress_messages.feature
169
177
  - features/flavorfile/README.md
170
178
  - features/flavorfile/comments.feature
179
+ - features/flavorfile/groups.feature
171
180
  - features/flavorfile/repository_name.feature
172
181
  - features/flavorfile/version_constraint.feature
173
182
  - features/install_vim_flavor.md
@@ -175,11 +184,16 @@ test_files:
175
184
  - features/resolve_dependencies.feature
176
185
  - features/step_definitions/bootstrap_script_steps.rb
177
186
  - features/step_definitions/cli_steps.rb
187
+ - features/step_definitions/dependency_steps.rb
178
188
  - features/step_definitions/directory_steps.rb
189
+ - features/step_definitions/file_steps.rb
179
190
  - features/step_definitions/flavor_steps.rb
180
191
  - features/step_definitions/flavorfile_steps.rb
181
192
  - features/step_definitions/lockfile_steps.rb
182
193
  - features/support/env.rb
194
+ - features/testing_vim_plugins/README.md
195
+ - features/testing_vim_plugins/dependencies.feature
196
+ - features/testing_vim_plugins/typical_usage.feature
183
197
  - features/typical_usage/README.md
184
198
  - features/typical_usage/deploy_to_arbitrary_place.feature
185
199
  - features/typical_usage/install_vim_plugins.feature