anvil-core 0.0.1.pre.alpha.3 → 0.1.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: d11c632bfef80657b2626182273510e405208c03
4
- data.tar.gz: 191dab915a4d5e375f421145dd4e84c2dc9ad35f
3
+ metadata.gz: 1ec595224814976ccada12c8a43dc3041bb43cca
4
+ data.tar.gz: d31891f5299ddd11c15e30317eb33ac10e737ab8
5
5
  SHA512:
6
- metadata.gz: 786e8d0568a15e2490d5a57335dac9e12183f6425441df80383c455e5c0158183cb13d34bcf3c6af13398e53499bd3d0cd57b1df9568733df40957a547c7c73b
7
- data.tar.gz: a026c61d5e629bd7aecf88ec5cd28b3462420956a7278ca924c323676c091813678e67bb75b0bea19fd0857b0e137a743ffa2f7a9f75451232d2bd4418a54c56
6
+ metadata.gz: 1e86c8cef457da7957997a36c0cf976e5181e0a3e45789036ec6454ebf35f0b557b6c73cf98f54a8b0dc81ab8b4244f2c41cc2ea8293ce510c79185434369fd2
7
+ data.tar.gz: c55729de1caf67c05e1a4fe5e3d5f96a0dae0e68c0f65d29f607e9ce2db686189707d3f8ac559f836edae4c062347a1a84c3db1c82b6393a8711f134949c91dd
data/README.md CHANGED
@@ -4,12 +4,11 @@ Anvil is a tool for the real craftsmen to build its own tools.
4
4
 
5
5
  [![Build Status](https://travis-ci.org/anvil-src/anvil-core.png?branch=master)](https://travis-ci.org/anvil-src/anvil-core)
6
6
 
7
-
8
7
  Anvil tries to be a framework for building command line applications
9
8
  to automate tedious tasks like apps or gems releasing process. Pull
10
9
  request updating, etc.
11
10
 
12
- It's purpose is to provide an easy to use Object Oriented framework
11
+ It's purpose is to provide an easy to use Object Oriented toolset
13
12
  that developers can use to automate par of its day to day work.
14
13
 
15
14
  Things like:
@@ -19,6 +18,14 @@ Things like:
19
18
  * Doing complex build which involve several projects and branches.
20
19
  * Any other stuff you might want.
21
20
 
21
+ ## Sample tasks
22
+
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
+
25
+ ```shell
26
+ ANVIL_TASKS_DIR=./sample bin/anvil
27
+ ```
28
+
22
29
  ## Installation
23
30
 
24
31
  To install it:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1-alpha.3
1
+ 0.1.0
data/lib/anvil.rb CHANGED
@@ -1,6 +1,9 @@
1
+ # encoding: UTF-8
2
+
1
3
  require 'anvil/version'
2
4
  require 'active_support/core_ext'
3
5
 
6
+ # Main anvil module
4
7
  module Anvil
5
8
  Error = Class.new(StandardError)
6
9
 
data/lib/anvil/assure.rb CHANGED
@@ -1,4 +1,7 @@
1
+ # encoding: UTF-8
2
+
1
3
  module Anvil
4
+ # Basic precondition for the tasks. If this fails, the task stops
2
5
  class Assure
3
6
  class << self
4
7
  def from_name(assure_name)
@@ -1,4 +1,7 @@
1
+ # encoding: UTF-8
2
+
1
3
  module Anvil
4
+ # Make sure that a directory exists before running the task
2
5
  class DirectoryAssure < Anvil::FileAssure
3
6
  def assured?(dir)
4
7
  super && assure_dir?(dir)
@@ -1,4 +1,7 @@
1
+ # encoding: UTF-8
2
+
1
3
  module Anvil
4
+ # Make sure that a file exists before running the task
2
5
  class FileAssure < Anvil::Assure
3
6
  def assured?(file)
4
7
  assure_exists? file
@@ -0,0 +1,8 @@
1
+ module Anvil
2
+ class Bundler
3
+ def update_gem(gem_name)
4
+ line = Cocaine::CommandLine.new('bundle', 'update :gem')
5
+ line.run gem: gem_name
6
+ end
7
+ end
8
+ end
data/lib/anvil/cli.rb CHANGED
@@ -1,7 +1,10 @@
1
+ # encoding: UTF-8
2
+
1
3
  require 'anvil/task_manager'
2
4
  require 'tasks/help_task'
3
5
 
4
6
  module Anvil
7
+ # Anvil command line interface
5
8
  class Cli
6
9
  HELP = <<-HELP
7
10
  Anvil is a tool for making your life easier.
@@ -9,6 +12,10 @@ Anvil is a tool for making your life easier.
9
12
  Available tasks:
10
13
  HELP
11
14
 
15
+ # Runs a task or prints its help if it needs arguments
16
+ #
17
+ # @param argv [Array] Command line arguments
18
+ # @return [Object, nil] Anything the task returns
12
19
  def run(argv)
13
20
  load_tasks
14
21
 
@@ -23,6 +30,10 @@ HELP
23
30
  Anvil::TaskManager.load_tasks
24
31
  end
25
32
 
33
+ # Builds a task and prepares it to run
34
+ #
35
+ # @param argv [Array] Command line arguments
36
+ # @return [Anvil::Task] A task ready to run
26
37
  def build_task(argv)
27
38
  arguments = argv.dup
28
39
  task_name = arguments.shift
data/lib/anvil/config.rb CHANGED
@@ -1,8 +1,11 @@
1
+ # encoding: UTF-8
2
+
1
3
  require 'mixlib/config'
2
4
  require 'anvil/config/class_methods'
3
5
  require 'gem_ext/mixlib'
4
6
 
5
7
  module Anvil
8
+ # Configuration management
6
9
  module Config
7
10
  extend Mixlib::Config
8
11
  extend Anvil::Config::ClassMethods
@@ -1,7 +1,10 @@
1
+ # encoding: UTF-8
2
+
1
3
  require 'fileutils'
2
4
 
3
5
  module Anvil
4
6
  module Config
7
+ # Configuration initialization
5
8
  module ClassMethods
6
9
  def base_path
7
10
  File.expand_path('~/.anvil')
data/lib/anvil/parser.rb CHANGED
@@ -1,4 +1,9 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'anvil/task'
4
+
1
5
  module Anvil
6
+ # Parser for anvil command line arguments and options
2
7
  class Parser < OptionParser
3
8
  attr_accessor :options
4
9
  attr_accessor :task
@@ -7,10 +12,9 @@ module Anvil
7
12
  @options ||= {}
8
13
  end
9
14
 
10
- def arguments(args = [])
11
- @arguments ||= []
12
- @arguments += args if args.any?
13
- @arguments.compact
15
+ def arguments(args = nil)
16
+ return @arguments if @arguments
17
+ @arguments = [args.presence].compact.flatten
14
18
  end
15
19
 
16
20
  def banner
@@ -30,5 +34,10 @@ module Anvil
30
34
 
31
35
  message
32
36
  end
37
+
38
+ def from(name)
39
+ task_klass = Anvil::Task.from_name(name)
40
+ instance_eval(&task_klass.parser_block) if task_klass.parser_block
41
+ end
33
42
  end
34
43
  end
@@ -1,14 +1,23 @@
1
+ # encoding: UTF-8
2
+
1
3
  require 'cocaine'
2
4
 
3
5
  module Anvil
6
+ # Rubygems wrapper for common commands
4
7
  class Rubygems
5
8
  class << self
9
+ # Runs gem build for a gemspec
10
+ #
11
+ # @param gemspec [String] The gemspec's filename
6
12
  def build(gemspec)
7
13
  line = Cocaine::CommandLine.new 'gem', 'build :gemspec'
8
14
 
9
15
  line.run gemspec: gemspec
10
16
  end
11
17
 
18
+ # Runs gem install for a gem file
19
+ #
20
+ # @param gem_file [String] The gems' filename
12
21
  def install(gem_file)
13
22
  line = Cocaine::CommandLine.new 'gem', 'install :gem_file'
14
23
 
data/lib/anvil/task.rb CHANGED
@@ -1,8 +1,11 @@
1
+ # encoding: UTF-8
2
+
1
3
  require 'anvil/task/class_methods'
2
4
  require 'anvil/task/naming'
3
5
  require 'anvil/task/options'
4
6
 
5
7
  module Anvil
8
+ # Common class for all tasks
6
9
  class Task
7
10
  extend ClassMethods
8
11
  extend Naming
@@ -14,11 +17,16 @@ module Anvil
14
17
  @options = options
15
18
  end
16
19
 
20
+ # Runs a task and its callbacks if the assures are OK
21
+ #
22
+ # @return [Object, nil] anything the task might return
17
23
  def run
18
24
  if run_assures
19
25
  run_before_callbacks
20
- run_task
26
+ task_return_value = run_task
21
27
  run_after_callbacks
28
+
29
+ task_return_value
22
30
  end
23
31
  end
24
32
 
@@ -1,3 +1,5 @@
1
+ # encoding: UTF-8
2
+
1
3
  require 'optparse'
2
4
 
3
5
  module Anvil
@@ -2,11 +2,16 @@ require 'active_support/core_ext/string'
2
2
 
3
3
  module Anvil
4
4
  class Task
5
+ # Methods for inferring task class names from cli arguments
5
6
  module Naming
6
7
  def get_namespace(task_name)
7
8
  task_name.to_s.split ':'
8
9
  end
9
10
 
11
+ # Returns a ruby class from a CLI name
12
+ #
13
+ # @param task_name [String] the CLI name for a task e.g. anvil:build
14
+ # @return [Class] an {Anvil::Task} descendant
10
15
  def from_name(task_name)
11
16
  namespaced_task = get_namespace task_name
12
17
  camelized_task = "#{namespaced_task.pop}_task".camelize
@@ -1,17 +1,23 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'anvil/parser'
2
4
 
3
5
  module Anvil
4
6
  class Task
7
+ # Cli options parsing definition
5
8
  module Options
9
+ attr_reader :parser_block
10
+
6
11
  def help
7
12
  parser.help
8
13
  end
9
14
 
10
15
  def parser(&block)
11
- @parser ||= define_parser(&block)
16
+ @parser_block = block
17
+ @parser ||= build_parser(&block)
12
18
  end
13
19
 
14
- def define_parser(&block)
20
+ def build_parser(&block)
15
21
  parser = Anvil::Parser.new
16
22
  parser.task = self
17
23
  configure_parser(parser, &block)
@@ -1,5 +1,8 @@
1
+ # encoding: UTF-8
2
+
1
3
  module Anvil
2
4
  class Task
5
+ # Tools to work with github repositories
3
6
  module Repositories
4
7
  def resolve_url(url)
5
8
  if url =~ /^\w+\/\w+$/
@@ -1,43 +1,70 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'rubygems'
1
4
  require 'anvil/config'
2
5
  require 'anvil/task'
3
- require 'rubygems'
6
+ require 'rugged'
4
7
 
5
8
  module Anvil
9
+ # Manage loading and finding anvil tasks
6
10
  module TaskManager
7
11
  @tasks_loaded = false
8
12
 
13
+ # Loads all known anvil tasks
9
14
  def self.load_tasks
10
15
  all_files.each { |file| load(file) }
11
16
  @tasks_loaded = true
12
17
  end
13
18
 
19
+ # @return [Array] all the core anvil tasks
14
20
  def self.files_from_anvil
15
21
  files_from_path(File.expand_path('../..', __FILE__))
16
22
  end
17
23
 
24
+ # @return [Array] all possible anvil tasks in this project
18
25
  def self.files_from_current_project
19
26
  path = current_project_path + '/lib/anvil/'
20
27
  files_from_path(path)
21
28
  end
22
29
 
30
+ # @return [String] top level dir if this is a git managed project
23
31
  def self.current_project_path
24
- %x{git rev-parse --show-toplevel}.strip
32
+ Rugged::Repository.discover(ENV['PWD']).gsub('.git/', '')
33
+ rescue Rugged::RepositoryError
34
+ ''
25
35
  end
26
36
 
37
+ # @param path [String] a path to glob their anvil tasks
38
+ # @return [Array] all anvil tasks in the given path
27
39
  def self.files_from_path(path)
28
40
  Dir[path + '/tasks/**/*_task.rb']
29
41
  end
30
42
 
43
+ # @return [Array] anvil tasks installed in gems
31
44
  def self.files_from_gems
32
45
  Gem.find_latest_files 'anvil/tasks/**/*_task.rb'
33
46
  end
34
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
35
60
  def self.all_files
36
- [files_from_anvil,
61
+ [files_from_env,
62
+ files_from_anvil,
37
63
  files_from_current_project,
38
64
  files_from_gems].compact.reduce(&:+).uniq
39
65
  end
40
66
 
67
+ # @return [Array] all known {Anvil::Task} desdendants
41
68
  def self.all_tasks
42
69
  load_tasks unless @tasks_loaded
43
70
  ::Anvil::Task.descendants
@@ -5,13 +5,18 @@ class Gem::BumpTask < Anvil::Task
5
5
  description "Bumps a gem's version"
6
6
 
7
7
  parser do
8
- arguments %w[term]
8
+ arguments %w(term)
9
+
10
+ on('-p', '--[no-]persist', 'Commit tag and push the changes') do |p|
11
+ options[:persist] = p
12
+ end
9
13
  end
10
14
 
11
15
  attr_reader :term
12
16
 
13
17
  def initialize(term, options = {})
14
- @term = term
18
+ @term = term.to_sym
19
+ @options = options
15
20
  end
16
21
 
17
22
  def task
@@ -58,7 +63,7 @@ class Gem::BumpTask < Anvil::Task
58
63
  f.close
59
64
  end
60
65
 
61
- commit_and_tag version
66
+ commit_and_tag version if options[:persist]
62
67
  end
63
68
 
64
69
  def prepare_repo
@@ -4,7 +4,7 @@ class HelpTask < Anvil::Task
4
4
  description 'Help for the anvil tasks. Usage: anvil help TASK'
5
5
 
6
6
  parser do
7
- arguments %w[task_name]
7
+ arguments %w(task_name)
8
8
  end
9
9
 
10
10
  attr_reader :task_name
@@ -0,0 +1,17 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Anvil::Parser do
6
+ let(:task) { DummyTask }
7
+
8
+ describe '#from' do
9
+ before do
10
+ task.stub(:parser_block).and_return(proc { 'opts' })
11
+ end
12
+
13
+ it 'inherits parser block from another task' do
14
+ expect(subject.from('dummy')).to eq('opts')
15
+ end
16
+ end
17
+ end
@@ -1,33 +1,75 @@
1
+ # encoding: UTF-8
2
+
1
3
  require 'spec_helper'
2
4
  require 'anvil/task/options'
3
5
 
4
6
  describe Anvil::Task::Options do
5
- let(:klass) { DummyTask }
7
+ let(:klass) do
8
+ Class.new do
9
+ def self.description
10
+ 'Dummy task'
11
+ end
12
+ extend Anvil::Task::Options
13
+ end
14
+ end
6
15
 
7
- describe '.define_parser' do
16
+ describe '.build_parser' do
8
17
  it 'returns an instance of Anvil::Parser' do
9
- expect(klass.define_parser).to be_kind_of(Anvil::Parser)
18
+ expect(klass.build_parser).to be_kind_of(Anvil::Parser)
10
19
  end
11
20
  end
12
21
 
13
22
  describe '.parse_options!' do
14
- let(:klass) do
15
- Class.new(DummyTask) do
16
- parser do
17
- on('-i', '--install') do |i|
18
- options[:install] = i
23
+ context 'with more than one argument and options' do
24
+ before do
25
+ klass.class_eval do
26
+ parser do
27
+ arguments %w(arg1 arg2)
28
+ on('-i', '--install') do |i|
29
+ options[:install] = i
30
+ end
19
31
  end
20
32
  end
21
33
  end
34
+ let(:arguments) { %w(arg1 arg2 --install) }
35
+ let(:expected) { ['arg1', 'arg2', { install: true }] }
36
+
37
+ it 'returns the correct arguments and options' do
38
+ expect(klass.parse_options!(arguments)).to be_eql(expected)
39
+ end
22
40
  end
23
41
 
24
- let(:arguments) { %w{arg1 arg2 --install} }
42
+ context 'with one argument and options' do
43
+ before do
44
+ klass.class_eval do
45
+ parser do
46
+ arguments %w(arg1)
47
+ on('-i', '--install') do |i|
48
+ options[:install] = i
49
+ end
50
+ end
51
+ end
52
+ end
53
+ let(:arguments) { %w{arg1 --install} }
54
+ let(:expected) { ['arg1', { install: true }] }
25
55
 
26
- let(:expected) do
27
- ['arg1', 'arg2', { install: true }]
56
+ it 'returns the correct arguments and options' do
57
+ expect(klass.parse_options!(arguments)).to be_eql(expected)
58
+ end
28
59
  end
29
- it 'returns the correct arguments and options' do
30
- expect(klass.parse_options!(arguments)).to be_eql(expected)
60
+
61
+ context 'only with one argument' do
62
+ let(:arguments) { %w(arg1) }
63
+ let(:expected) { arguments }
64
+ let(:parser_block) do
65
+ proc do
66
+ arguments %w(arg1)
67
+ end
68
+ end
69
+
70
+ it 'returns the correct arguments and options' do
71
+ expect(klass.parse_options!(arguments)).to be_eql(expected)
72
+ end
31
73
  end
32
74
  end
33
75
  end
@@ -21,6 +21,33 @@ describe Anvil::TaskManager do
21
21
  end
22
22
  end
23
23
 
24
+ describe '.current_project_path' do
25
+ let(:pwd) { '/home/user/src/project/' }
26
+ context 'on a path managed by git' do
27
+ before do
28
+ Rugged::Repository.stub(:discover)
29
+ .and_return(pwd + '.git/')
30
+ end
31
+
32
+ it 'returns the repo workdir' do
33
+ expect(described_class.current_project_path)
34
+ .to eq(pwd)
35
+ end
36
+ end
37
+
38
+ context 'on a path not managed by git' do
39
+ before do
40
+ Rugged::Repository.stub(:discover)
41
+ .and_raise(Rugged::RepositoryError)
42
+ end
43
+
44
+ it 'returns an empty string' do
45
+ expect(described_class.current_project_path)
46
+ .to be_empty
47
+ end
48
+ end
49
+ end
50
+
24
51
  describe '.files_from_gems' do
25
52
  it 'asks Gem to return the anvil tasks' do
26
53
  expect(Gem).to receive(:find_latest_files).with('anvil/tasks/**/*_task.rb')
@@ -28,6 +55,14 @@ describe Anvil::TaskManager do
28
55
  end
29
56
  end
30
57
 
58
+ describe '.files_from_env' do
59
+ context 'with empty env variable' do
60
+ it 'returns an empty array' do
61
+ expect(described_class.files_from_env).to eq([])
62
+ end
63
+ end
64
+ end
65
+
31
66
  describe '.load_tasks' do
32
67
  let(:all_files) { %w[file1 file2] }
33
68
 
@@ -4,7 +4,7 @@ require 'git'
4
4
  require 'anvil'
5
5
 
6
6
  describe Gem::BumpTask do
7
- subject { Gem::BumpTask.new :major }
7
+ subject { Gem::BumpTask.new 'major' }
8
8
 
9
9
  describe '#task' do
10
10
  before { subject.stub(:read_version).and_return('2.0.0') }
@@ -18,9 +18,19 @@ describe Gem::BumpTask do
18
18
  end
19
19
 
20
20
  describe '#write_version' do
21
- it 'writes the file and push the changes' do
22
- expect(subject).to receive(:version_file).with('w+')
23
- expect(subject).to receive(:commit_and_tag)
21
+ context 'when persisting' do
22
+ subject { Gem::BumpTask.new 'major', persist: true }
23
+ it 'writes the file and push the changes' do
24
+ expect(subject).to receive(:version_file).with('w+')
25
+ expect(subject).to receive(:commit_and_tag)
26
+ end
27
+ end
28
+
29
+ context 'when no persisting' do
30
+ it 'writes the file but does not persist the change in git' do
31
+ expect(subject).to receive(:version_file).with('w+')
32
+ expect(subject).to_not receive(:commit_and_tag)
33
+ end
24
34
  end
25
35
 
26
36
  after { subject.send :write_version, '2.0.0' }
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.0.1.pre.alpha.3
4
+ version: 0.1.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-03-07 00:00:00.000000000 Z
12
+ date: 2014-05-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: git
@@ -31,14 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '4.0'
34
+ version: 4.0.0
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '4.0'
41
+ version: 4.0.0
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: mixlib-config
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -81,6 +81,20 @@ dependencies:
81
81
  - - "~>"
82
82
  - !ruby/object:Gem::Version
83
83
  version: '1.3'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rugged
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '0.19'
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '0.19'
84
98
  - !ruby/object:Gem::Dependency
85
99
  name: bundler
86
100
  requirement: !ruby/object:Gem::Requirement
@@ -139,7 +153,7 @@ dependencies:
139
153
  version: '0.18'
140
154
  description: Anvil is a tool for building tools.
141
155
  email:
142
- - nflamel@otrobloggeek.com
156
+ - nflamel@gmail.com
143
157
  - jondeandres@gmail.com
144
158
  executables:
145
159
  - anvil
@@ -156,6 +170,7 @@ files:
156
170
  - lib/anvil/assure.rb
157
171
  - lib/anvil/assures/directory_assure.rb
158
172
  - lib/anvil/assures/file_assure.rb
173
+ - lib/anvil/bundler.rb
159
174
  - lib/anvil/cli.rb
160
175
  - lib/anvil/config.rb
161
176
  - lib/anvil/config/class_methods.rb
@@ -181,6 +196,7 @@ files:
181
196
  - spec/lib/anvil/assures/file_assure_spec.rb
182
197
  - spec/lib/anvil/cli_spec.rb
183
198
  - spec/lib/anvil/config_spec.rb
199
+ - spec/lib/anvil/parser_spec.rb
184
200
  - spec/lib/anvil/task/naming_spec.rb
185
201
  - spec/lib/anvil/task/options_spec.rb
186
202
  - spec/lib/anvil/task_manager_spec.rb
@@ -216,12 +232,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
216
232
  version: '0'
217
233
  required_rubygems_version: !ruby/object:Gem::Requirement
218
234
  requirements:
219
- - - ">"
235
+ - - ">="
220
236
  - !ruby/object:Gem::Version
221
- version: 1.3.1
237
+ version: '0'
222
238
  requirements: []
223
239
  rubyforge_project:
224
- rubygems_version: 2.2.0
240
+ rubygems_version: 2.2.2
225
241
  signing_key:
226
242
  specification_version: 4
227
243
  summary: Anvil is a tool for building tools. A tool that a real craftsmen uses to
@@ -232,6 +248,7 @@ test_files:
232
248
  - spec/lib/anvil/assures/file_assure_spec.rb
233
249
  - spec/lib/anvil/cli_spec.rb
234
250
  - spec/lib/anvil/config_spec.rb
251
+ - spec/lib/anvil/parser_spec.rb
235
252
  - spec/lib/anvil/task/naming_spec.rb
236
253
  - spec/lib/anvil/task/options_spec.rb
237
254
  - spec/lib/anvil/task_manager_spec.rb