anvil-core 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ee2a3e726f71df8d805f6948e7dddf8c865d983d
4
- data.tar.gz: 268c51a44e9bd3aedded2d898e1cf91d353c7b80
3
+ metadata.gz: e6c16dfa2cd3d0c90a22a516bf1b13460181c7cf
4
+ data.tar.gz: af1c0ea76f8e8085021494cad7bb388ece2f12a8
5
5
  SHA512:
6
- metadata.gz: 4b02d16e0f8c0430407742909227a7b31cec9a2d3f5ae2c9fb47a3531e324e42a90784e838bac6d34cf7c1bb26a1665ac22ba84d5171a29583a9980af9a31295
7
- data.tar.gz: 087e1f4ae6030290d71d65902ffd2ba1d0d7580cbe2862f377fe2640a7c6f65dc07108fcd9e2990a72743fa90c47921921c00c0c01b2db71a62c1c514e0b3e50
6
+ metadata.gz: e8f17c066f653dc6b4129a8c2ba29f6c73f758bb1923356c5224113b5d9147a727be611973e573b15b57b68c6243d09cb3a73a5a778761bca381c569db590f7e
7
+ data.tar.gz: 8f5c3e91887ef1dbd0125e8afbfcda7804f3a06b8d5beee3d5f52cf3b86a685dedeb972e105cf3902b6ebfa9381c883923fe1f54b2787f7cf2ccb42668b8e685
data/README.md CHANGED
@@ -23,7 +23,7 @@ Things like:
23
23
  You can find some sample tasks in the samples directory, if you want to give them a try, clone this project and do:
24
24
 
25
25
  ```shell
26
- ANVIL_TASKS_DIR=./sample bin/anvil
26
+ ANVIL_EXTENSIONS_DIR=./sample bin/anvil
27
27
  ```
28
28
 
29
29
  ## Installation
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
@@ -1,6 +1,6 @@
1
1
  module Anvil
2
2
  class Bundler
3
- def update_gem(gem_name)
3
+ def self.update_gem(gem_name)
4
4
  line = Cocaine::CommandLine.new('bundle', 'update :gem')
5
5
  line.run gem: gem_name
6
6
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'anvil/task_manager'
3
+ require 'anvil/extensions_manager'
4
4
  require 'tasks/help_task'
5
5
 
6
6
  module Anvil
@@ -27,7 +27,7 @@ HELP
27
27
  end
28
28
 
29
29
  def load_tasks
30
- Anvil::TaskManager.load_tasks
30
+ Anvil::ExtensionsManager.load_tasks
31
31
  end
32
32
 
33
33
  # Builds a task and prepares it to run
@@ -59,7 +59,7 @@ HELP
59
59
 
60
60
  def print_help
61
61
  printf('%s', HELP)
62
- tasks = Anvil::TaskManager.tasks_by_name
62
+ tasks = Anvil::ExtensionsManager.tasks_by_name
63
63
  tasks.each { |task| print_task_line(task) }
64
64
  end
65
65
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'mixlib/config'
4
4
  require 'anvil/config/class_methods'
5
+ require 'anvil/extensions_manager'
5
6
  require 'gem_ext/mixlib'
6
7
 
7
8
  module Anvil
@@ -9,10 +10,6 @@ module Anvil
9
10
  module Config
10
11
  extend Mixlib::Config
11
12
  extend Anvil::Config::ClassMethods
12
-
13
- config_context :github do
14
- configurable :user
15
- configurable :token
16
- end
17
13
  end
18
14
  end
15
+ Anvil::ExtensionsManager.load_config_extensions
@@ -33,7 +33,7 @@ module Anvil
33
33
  FileUtils.mkdir_p(base_path)
34
34
  FileUtils.mkdir_p(base_tasks_path)
35
35
  FileUtils.mkdir_p(base_projects_path)
36
- FileUtils.touch(base_config_path) unless File.exists?(base_config_path)
36
+ FileUtils.touch(base_config_path) unless File.exist?(base_config_path)
37
37
  end
38
38
 
39
39
  def init_config
@@ -0,0 +1,114 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'rubygems'
4
+ require 'anvil/task'
5
+ require 'rugged'
6
+
7
+ module Anvil
8
+ # Manage loading and finding anvil tasks
9
+ class ExtensionsManager
10
+ PATTERNS = {
11
+ tasks: '/tasks/**/*_task.rb',
12
+ config_extensions: '/config_extensions/**/*.rb'
13
+ }
14
+ @tasks_loaded = false
15
+
16
+ class << self
17
+ attr_accessor :tasks_loaded
18
+
19
+ def tasks_by_name
20
+ new.tasks_by_name
21
+ end
22
+
23
+ def load_tasks
24
+ new.load_tasks
25
+ end
26
+
27
+ def load_config_extensions
28
+ new.load_config_extensions
29
+ end
30
+ end
31
+
32
+ def tasks_by_name
33
+ all_tasks.sort_by { |t| t.name }
34
+ end
35
+
36
+ # @return [Array] all known {Anvil::Task} desdendants
37
+ def all_tasks
38
+ load_tasks unless self.class.tasks_loaded
39
+ ::Anvil::Task.descendants
40
+ end
41
+
42
+ # Loads all known anvil tasks
43
+ def load_tasks
44
+ all_files_for(:tasks).each { |file| load(file) }
45
+ self.class.tasks_loaded = true
46
+ end
47
+
48
+ def load_config_extensions
49
+ all_files_for(:config_extensions).each { |file| load(file) }
50
+ end
51
+
52
+ # @param extension_type [Symbol] either :tasks or :config.
53
+ # @see {Anvil::ExtensionsManager::PATTERNS}
54
+ # @return [Array] all known anvil files for a given extension type
55
+ def all_files_for(extension_type)
56
+ [files_from_env(extension_type),
57
+ files_from_anvil(extension_type),
58
+ files_from_current_project(extension_type),
59
+ files_from_gems(extension_type)
60
+ ].compact.reduce(&:+).uniq
61
+ end
62
+
63
+ # @param extension_type [Symbol] either :tasks or :config.
64
+ # @see {Anvil::ExtensionsManager::PATTERNS}
65
+ # @return [Array] all the core anvil extensions
66
+ def files_from_anvil(extension_type)
67
+ files_from_path(File.expand_path('../..', __FILE__), extension_type)
68
+ end
69
+
70
+ # @param extension_type [Symbol] either :tasks or :config.
71
+ # @see {Anvil::ExtensionsManager::PATTERNS}
72
+ # @return [Array] all possible anvil extensions
73
+ def files_from_current_project(pattern)
74
+ path = current_project_path + '/lib/anvil/'
75
+ files_from_path(path, pattern)
76
+ end
77
+
78
+ # @param extension_type [Symbol] either :tasks or :config.
79
+ # @see {Anvil::ExtensionsManager::PATTERNS}
80
+ # @return [Array] anvil extensions installed in gems
81
+ def files_from_gems(pattern)
82
+ Gem.find_latest_files "anvil#{PATTERNS[pattern]}"
83
+ end
84
+
85
+ # @param extension_type [Symbol] either :tasks or :config.
86
+ # @see {Anvil::ExtensionsManager::PATTERNS}
87
+ # @return [Array] anvil tasks in the specified dir
88
+ def files_from_env(pattern)
89
+ if ENV['ANVIL_EXTENSIONS_DIR']
90
+ env_dir_list = ENV['ANVIL_EXTENSIONS_DIR'].split(':').join(',')
91
+
92
+ Dir["{#{env_dir_list}}#{PATTERNS[pattern]}"]
93
+ else
94
+ []
95
+ end
96
+ end
97
+
98
+ protected
99
+
100
+ # @return [String] top level dir if this is a git managed project
101
+ def current_project_path
102
+ Rugged::Repository.discover(Dir.pwd).gsub('.git/', '')
103
+ rescue Rugged::RepositoryError
104
+ ''
105
+ end
106
+
107
+ # @param path [String] a path to glob their anvil tasks
108
+ # @param pattern [Symbol] the pattern to load files
109
+ # @return [Array] all anvil tasks in the given path
110
+ def files_from_path(path, pattern)
111
+ Dir["#{path}#{PATTERNS[pattern]}"]
112
+ end
113
+ end
114
+ end
@@ -9,16 +9,31 @@ module Anvil
9
9
 
10
10
  def change_project(project)
11
11
  Dir.chdir(project_path(project))
12
+ rescue Errno::ENOENT
13
+ log_project_does_not_exists project
12
14
  end
13
15
 
14
16
  def on_project(project)
15
17
  Dir.chdir(project_path(project)) do
16
18
  yield(git)
17
19
  end
20
+ rescue Errno::ENOENT
21
+ log_project_does_not_exists project
22
+ end
23
+
24
+ def on_each_project(projects)
25
+ projects.each do |project|
26
+ on_project(project) { |project_git| yield project, project_git }
27
+ end
18
28
  end
19
29
 
20
30
  protected
21
31
 
32
+ def log_project_does_not_exists(project)
33
+ logger.info "Anvil knows nothing about #{project}."
34
+ logger.info 'Please, check anvil help projects:add first to add the project to anvil.'
35
+ end
36
+
22
37
  def git
23
38
  Git.open(Dir.pwd)
24
39
  end
@@ -0,0 +1,8 @@
1
+ module Anvil
2
+ module Config
3
+ config_context :github do
4
+ configurable :user
5
+ configurable :token
6
+ end
7
+ end
8
+ end
@@ -21,6 +21,7 @@ module Projects
21
21
 
22
22
  def task
23
23
  url_to_clone = resolve_url(repo)
24
+ logger.info "Clonning #{repo} on anvil's projects folder."
24
25
  clone_repo(url_to_clone, name)
25
26
  end
26
27
 
@@ -1,27 +1,27 @@
1
1
  require 'spec_helper'
2
- require 'anvil/task_manager'
2
+ require 'anvil/extensions_manager'
3
3
 
4
- describe Anvil::TaskManager do
5
- describe '.all_tasks' do
4
+ describe Anvil::ExtensionsManager do
5
+ describe '#all_tasks' do
6
6
  it 'returns the Anvil::Task descendants' do
7
7
  expect(::Anvil::Task).to receive(:descendants)
8
- described_class.all_tasks
8
+ subject.all_tasks
9
9
  end
10
10
  end
11
11
 
12
- describe '.files_from_current_project' do
13
- let(:gemfile_path) { described_class.current_project_path }
12
+ describe '#files_from_current_project' do
13
+ let(:gemfile_path) { subject.send :current_project_path }
14
14
  let(:project_task_path) { gemfile_path + '/lib/anvil/' }
15
15
 
16
16
  it 'returns the task files in the path' do
17
- expect(described_class)
18
- .to receive(:files_from_path).with(project_task_path)
17
+ expect(subject)
18
+ .to receive(:files_from_path).with(project_task_path, :tasks)
19
19
 
20
- described_class.files_from_current_project
20
+ subject.files_from_current_project(:tasks)
21
21
  end
22
22
  end
23
23
 
24
- describe '.current_project_path' do
24
+ describe 'current_project_path' do
25
25
  let(:pwd) { '/home/user/src/project/' }
26
26
  context 'on a path managed by git' do
27
27
  before do
@@ -30,7 +30,7 @@ describe Anvil::TaskManager do
30
30
  end
31
31
 
32
32
  it 'returns the repo workdir' do
33
- expect(described_class.current_project_path)
33
+ expect(subject.send(:current_project_path))
34
34
  .to eq(pwd)
35
35
  end
36
36
  end
@@ -42,39 +42,40 @@ describe Anvil::TaskManager do
42
42
  end
43
43
 
44
44
  it 'returns an empty string' do
45
- expect(described_class.current_project_path)
45
+ expect(subject.send(:current_project_path))
46
46
  .to be_empty
47
47
  end
48
48
  end
49
49
  end
50
50
 
51
- describe '.files_from_gems' do
51
+ describe '#files_from_gems' do
52
52
  it 'asks Gem to return the anvil tasks' do
53
- expect(Gem).to receive(:find_latest_files).with('anvil/tasks/**/*_task.rb')
54
- described_class.files_from_gems
53
+ expect(Gem)
54
+ .to receive(:find_latest_files).with('anvil/tasks/**/*_task.rb')
55
+ subject.files_from_gems(:tasks)
55
56
  end
56
57
  end
57
58
 
58
- describe '.files_from_env' do
59
+ describe '#files_from_env' do
59
60
  context 'with empty env variable' do
60
61
  it 'returns an empty array' do
61
- expect(described_class.files_from_env).to eq([])
62
+ expect(subject.files_from_env(:tasks)).to eq([])
62
63
  end
63
64
  end
64
65
  end
65
66
 
66
- describe '.load_tasks' do
67
+ describe '#load_tasks' do
67
68
  let(:all_files) { %w[file1 file2] }
68
69
 
69
70
  before do
70
- described_class.stub(:all_files).and_return(all_files)
71
+ allow(subject).to receive(:all_files_for).and_return(all_files)
71
72
  end
72
73
 
73
74
  it 'loads the files' do
74
- expect(described_class).to receive(:load).with(all_files[0])
75
- expect(described_class).to receive(:load).with(all_files[1])
75
+ expect(subject).to receive(:load).with(all_files[0])
76
+ expect(subject).to receive(:load).with(all_files[1])
76
77
 
77
- described_class.load_tasks
78
+ subject.load_tasks
78
79
  end
79
80
  end
80
81
  end
@@ -45,4 +45,15 @@ describe Anvil::Task::Projects, fakefs: true do
45
45
  expect { |b| subject.on_project(project, &b) }.to yield_with_args
46
46
  end
47
47
  end
48
+
49
+ describe '#on_each_project' do
50
+ let(:projects) { %w(anvil-core anvil-plugins) }
51
+ before do
52
+ expect(subject).to receive(:on_project).twice.and_yield(double('git'))
53
+ end
54
+
55
+ it 'works on each project' do
56
+ expect { |b| subject.on_each_project(projects, &b) }.to yield_control.twice
57
+ end
58
+ end
48
59
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: anvil-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fran Casas
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-05-22 00:00:00.000000000 Z
12
+ date: 2014-06-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: git
@@ -174,6 +174,7 @@ files:
174
174
  - lib/anvil/cli.rb
175
175
  - lib/anvil/config.rb
176
176
  - lib/anvil/config/class_methods.rb
177
+ - lib/anvil/extensions_manager.rb
177
178
  - lib/anvil/parser.rb
178
179
  - lib/anvil/rubygems.rb
179
180
  - lib/anvil/task.rb
@@ -182,9 +183,9 @@ files:
182
183
  - lib/anvil/task/options.rb
183
184
  - lib/anvil/task/projects.rb
184
185
  - lib/anvil/task/repositories.rb
185
- - lib/anvil/task_manager.rb
186
186
  - lib/anvil/version.rb
187
187
  - lib/anvil/versioner.rb
188
+ - lib/config_extensions/core.rb
188
189
  - lib/gem_ext/mixlib.rb
189
190
  - lib/tasks/gem/build_task.rb
190
191
  - lib/tasks/gem/bump_task.rb
@@ -197,11 +198,11 @@ files:
197
198
  - spec/lib/anvil/assures/file_assure_spec.rb
198
199
  - spec/lib/anvil/cli_spec.rb
199
200
  - spec/lib/anvil/config_spec.rb
201
+ - spec/lib/anvil/extensions_manager_spec.rb
200
202
  - spec/lib/anvil/parser_spec.rb
201
203
  - spec/lib/anvil/task/naming_spec.rb
202
204
  - spec/lib/anvil/task/options_spec.rb
203
205
  - spec/lib/anvil/task/projects_spec.rb
204
- - spec/lib/anvil/task_manager_spec.rb
205
206
  - spec/lib/anvil/task_spec.rb
206
207
  - spec/lib/anvil/versioner_spec.rb
207
208
  - spec/lib/tasks/gem/build_task_spec.rb
@@ -250,11 +251,11 @@ test_files:
250
251
  - spec/lib/anvil/assures/file_assure_spec.rb
251
252
  - spec/lib/anvil/cli_spec.rb
252
253
  - spec/lib/anvil/config_spec.rb
254
+ - spec/lib/anvil/extensions_manager_spec.rb
253
255
  - spec/lib/anvil/parser_spec.rb
254
256
  - spec/lib/anvil/task/naming_spec.rb
255
257
  - spec/lib/anvil/task/options_spec.rb
256
258
  - spec/lib/anvil/task/projects_spec.rb
257
- - spec/lib/anvil/task_manager_spec.rb
258
259
  - spec/lib/anvil/task_spec.rb
259
260
  - spec/lib/anvil/versioner_spec.rb
260
261
  - spec/lib/tasks/gem/build_task_spec.rb
@@ -1,77 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'rubygems'
4
- require 'anvil/config'
5
- require 'anvil/task'
6
- require 'rugged'
7
-
8
- module Anvil
9
- # Manage loading and finding anvil tasks
10
- module TaskManager
11
- @tasks_loaded = false
12
-
13
- # Loads all known anvil tasks
14
- def self.load_tasks
15
- all_files.each { |file| load(file) }
16
- @tasks_loaded = true
17
- end
18
-
19
- # @return [Array] all the core anvil tasks
20
- def self.files_from_anvil
21
- files_from_path(File.expand_path('../..', __FILE__))
22
- end
23
-
24
- # @return [Array] all possible anvil tasks in this project
25
- def self.files_from_current_project
26
- path = current_project_path + '/lib/anvil/'
27
- files_from_path(path)
28
- end
29
-
30
- # @return [String] top level dir if this is a git managed project
31
- def self.current_project_path
32
- Rugged::Repository.discover(Dir.pwd).gsub('.git/', '')
33
- rescue Rugged::RepositoryError
34
- ''
35
- end
36
-
37
- # @param path [String] a path to glob their anvil tasks
38
- # @return [Array] all anvil tasks in the given path
39
- def self.files_from_path(path)
40
- Dir[path + '/tasks/**/*_task.rb']
41
- end
42
-
43
- # @return [Array] anvil tasks installed in gems
44
- def self.files_from_gems
45
- Gem.find_latest_files 'anvil/tasks/**/*_task.rb'
46
- end
47
-
48
- # @return [Array] anvil tasks in the specified dir
49
- def self.files_from_env
50
- if ENV['ANVIL_TASKS_DIR']
51
- env_dir_list = ENV['ANVIL_TASKS_DIR'].split(':').join(',')
52
-
53
- Dir["{#{env_dir_list}}/*_task.rb"]
54
- else
55
- []
56
- end
57
- end
58
-
59
- # @return [Array] all known anvil task files
60
- def self.all_files
61
- [files_from_env,
62
- files_from_anvil,
63
- files_from_current_project,
64
- files_from_gems].compact.reduce(&:+).uniq
65
- end
66
-
67
- # @return [Array] all known {Anvil::Task} desdendants
68
- def self.all_tasks
69
- load_tasks unless @tasks_loaded
70
- ::Anvil::Task.descendants
71
- end
72
-
73
- def self.tasks_by_name
74
- all_tasks.sort_by { |t| t.name }
75
- end
76
- end
77
- end