config_curator 0.1.1 → 0.2.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: dd8b835a413ec4e9f789730aee2df2afc6b495d3
4
- data.tar.gz: 0d5edcc08ff046b1d1271c5426a3a5a2dc5b03ce
3
+ metadata.gz: 0cc743eac4dc51e37ac3c8c373868ed9b099853e
4
+ data.tar.gz: c5857e0fc09a20c537069875c4515b706b8d3ebc
5
5
  SHA512:
6
- metadata.gz: d208bfb15fdb6a0845cb4f9837850e634e05f59a7a4db4e39c0a631452f5f3d63a8272fb32c0837696328d7039a8867d4bc7303d8dc4a83c25d568fd1d31712d
7
- data.tar.gz: a6b8394a2e5e7f9d1232f7e4054d278f839d89c6cc19e5dbe34f93da0fda408552d0e0e49f529e8e19710f3e56140d4987f1a945cc01488fc88f18d93052f14d
6
+ metadata.gz: 815a4f93e970b6cdeeb9e0fa848d7d6d2c50ed192d20ea4c973b2a885d1900732532418126f52ddc0d9d0c16034e3547c223387b707ee64f0f98d34f376cf4ee
7
+ data.tar.gz: d0cb7b9cff4ac26b07d1405942871a51ce04f388387736e6bca432d32e16321fc1cd93d88174ed2b50b8177dc00a70b6527831b73f0d4c6409f7eb638fc2693d
data/.rubocop.yml ADDED
@@ -0,0 +1,17 @@
1
+ AllCops:
2
+ Include:
3
+ - Gemfile
4
+ - Guardfile
5
+ - Rakefile
6
+
7
+ Style/PercentLiteralDelimiters:
8
+ PreferredDelimiters:
9
+ '%q': '{}'
10
+ '%Q': '{}'
11
+
12
+ Style/RegexpLiteral:
13
+ Exclude:
14
+ - Guardfile
15
+
16
+ Style/SpaceInsideHashLiteralBraces:
17
+ Enabled: false
data/.travis.yml CHANGED
@@ -4,4 +4,11 @@ rvm:
4
4
  - 2.0.0
5
5
  - 2.1.1
6
6
  - 2.1.2
7
+
8
+ before_install:
9
+ - 'echo ''gem: --no-document'' > ~/.gemrc'
10
+
11
+ install:
12
+ - bundle update
13
+
7
14
  script: bundle exec rake travis
data/.yardopts CHANGED
@@ -1,5 +1,6 @@
1
1
  --markup-provider=redcarpet
2
2
  --markup=markdown
3
+ --plugin redcarpet-ext
3
4
  lib/**/*.rb
4
5
  -
5
6
  README.md
data/CHANGELOG.md CHANGED
@@ -1,4 +1,9 @@
1
- # Config Curator ChangeLog
1
+ # ChangeLog
2
+
3
+ ## 0.2.0
4
+
5
+ - Merged [ruby-gem](https://github.com/razor-x/ruby-gem) for improved development.
6
+ - Style changes and refactoring to pass Rubocop.
2
7
 
3
8
  ## 0.1.0
4
9
 
data/Guardfile CHANGED
@@ -1,10 +1,23 @@
1
- guard :rspec, cmd: 'bundle exec rspec --color --format Fuubar' do
2
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
3
- watch(%r{^lib/config_curator/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
4
- watch(%r{^spec/.+_spec\.rb$})
5
- watch('spec/spec_helper.rb') { 'spec' }
1
+ scope groups: [:doc, :lint, :unit]
2
+
3
+ group :doc do
4
+ guard :yard do
5
+ watch(%r{^lib/(.+)\.rb$})
6
+ end
7
+ end
8
+
9
+ group :lint do
10
+ guard :rubocop do
11
+ watch(%r{.+\.rb$})
12
+ watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
13
+ end
6
14
  end
7
15
 
8
- guard :yard do
9
- watch(%r{^lib/(.+)\.rb$})
16
+ group :unit do
17
+ guard :rspec, cmd: 'bundle exec rspec --color --format Fuubar' do
18
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
19
+ watch(%r{^lib/config_curator/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
20
+ watch(%r{^spec/.+_spec\.rb$})
21
+ watch('spec/spec_helper.rb') { 'spec' }
22
+ end
10
23
  end
data/README.md CHANGED
@@ -1,9 +1,5 @@
1
1
  # Config Curator
2
2
 
3
- by Evan Boyd Sosenko.
4
-
5
- _Simple and intelligent configuration file management._
6
-
7
3
  [![Gem Version](http://img.shields.io/gem/v/config_curator.svg?style=flat)](https://rubygems.org/gems/config_curator)
8
4
  [![MIT License](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](./LICENSE.txt)
9
5
  [![Dependency Status](http://img.shields.io/gemnasium/razor-x/config_curator.svg?style=flat)](https://gemnasium.com/razor-x/config_curator)
@@ -11,6 +7,12 @@ _Simple and intelligent configuration file management._
11
7
  [![Coverage Status](http://img.shields.io/coveralls/razor-x/config_curator.svg?style=flat)](https://coveralls.io/r/razor-x/config_curator)
12
8
  [![Code Climate](http://img.shields.io/codeclimate/github/razor-x/config_curator.svg?style=flat)](https://codeclimate.com/github/razor-x/config_curator)
13
9
 
10
+ by Evan Boyd Sosenko.
11
+
12
+ _Simple and intelligent configuration file management._
13
+
14
+ ## Description
15
+
14
16
  ## Installation
15
17
 
16
18
  Add this line to your application's Gemfile:
@@ -48,7 +50,9 @@ Config Curator is fully scriptable for easy inclusion into other Ruby programs.
48
50
  The API is well documented for this purpose
49
51
  (see [Documentation](#documentation) above).
50
52
 
51
- ## Source Repository
53
+ ## Development and Testing
54
+
55
+ ### Source Code
52
56
 
53
57
  The [Config Curator source](https://github.com/razor-x/config_curator)
54
58
  is hosted on GitHub.
@@ -58,6 +62,37 @@ To clone the project run
58
62
  $ git clone https://github.com/razor-x/config_curator.git
59
63
  ````
60
64
 
65
+ ### Rake
66
+
67
+ Run `rake -T` to see all Rake tasks.
68
+
69
+ ````
70
+ rake all # Run all tasks
71
+ rake build # Build config_curator-0.0.0.gem into the pkg directory
72
+ rake bump:current # Show current gem version
73
+ rake bump:major # Bump major part of gem version
74
+ rake bump:minor # Bump minor part of gem version
75
+ rake bump:patch # Bump patch part of gem version
76
+ rake bump:pre # Bump pre part of gem version
77
+ rake bump:set # Sets the version number using the VERSION environment variable
78
+ rake install # Build and install config_curator-0.0.0.gem into system gems
79
+ rake release # Create tag v0.0.0 and build and push config_curator-0.0.0.gem to Rubygems
80
+ rake rubocop # Run RuboCop
81
+ rake rubocop:auto_correct # Auto-correct RuboCop offenses
82
+ rake spec # Run RSpec code examples
83
+ rake yard # Generate YARD Documentation
84
+ ````
85
+
86
+ ### Guard
87
+
88
+ Guard tasks have been separated into the following groups:
89
+
90
+ - `doc`
91
+ - `lint`
92
+ - `unit`
93
+
94
+ By default, Guard will generate documentation, lint, and run unit tests.
95
+
61
96
  ## Contributing
62
97
 
63
98
  Please submit and comment on bug reports and feature requests.
@@ -66,9 +101,10 @@ To submit a patch:
66
101
 
67
102
  1. Fork it (https://github.com/razor-x/config_curator/fork).
68
103
  2. Create your feature branch (`git checkout -b my-new-feature`).
69
- 3. Commit your changes (`git commit -am 'Add some feature'`).
70
- 4. Push to the branch (`git push origin my-new-feature`).
71
- 5. Create a new Pull Request.
104
+ 3. Make changes. Write and run tests.
105
+ 4. Commit your changes (`git commit -am 'Add some feature'`).
106
+ 5. Push to the branch (`git push origin my-new-feature`).
107
+ 6. Create a new Pull Request.
72
108
 
73
109
  ## License
74
110
 
data/Rakefile CHANGED
@@ -1,9 +1,23 @@
1
- require 'bundler/gem_tasks'
2
1
  require 'bump/tasks'
2
+ require 'bundler/gem_tasks'
3
3
  require 'rspec/core/rake_task'
4
+ require 'rubocop/rake_task'
5
+ require 'yard'
6
+
7
+ task default: [:yard, :rubocop, :spec]
8
+ task travis: [:rubocop, :spec]
9
+
10
+ desc 'Run all tasks'
11
+ task all: [:yard, :rubocop, :spec]
4
12
 
5
- RSpec::Core::RakeTask.new :spec
13
+ YARD::Config.load_plugin 'redcarpet-ext'
14
+ YARD::Rake::YardocTask.new do |t|
15
+ t.files = ['**/*.rb', '-', 'README.md', 'CHANGELOG.md', 'LICENSE.txt']
16
+ t.options = ['--markup-provider=redcarpet', '--markup=markdown']
17
+ end
6
18
 
7
- task default: :spec
19
+ RuboCop::RakeTask.new do |t|
20
+ t.formatters = ['progress']
21
+ end
8
22
 
9
- task travis: [:spec]
23
+ RSpec::Core::RakeTask.new
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  lib = File.expand_path('../lib', __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'config_curator/version'
@@ -8,14 +7,14 @@ Gem::Specification.new do |spec|
8
7
  spec.version = ConfigCurator::VERSION
9
8
  spec.authors = ['Evan Boyd Sosenko']
10
9
  spec.email = ['razorx@evansosenko.com']
11
- spec.summary = %q{Simple and intelligent configuration file management.}
12
10
  spec.description = %q{}
11
+ spec.summary = %q{Simple and intelligent configuration file management.}
13
12
  spec.homepage = 'https://github.com/razor-x/config_curator'
14
13
  spec.license = 'MIT'
15
14
 
16
- spec.files = `git ls-files -z`.split("\x0")
15
+ spec.files = `git ls-files`.split($/)
17
16
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
+ spec.test_files = spec.files.grep(%r{^(features|spec|test)/})
19
18
  spec.require_paths = ['lib']
20
19
 
21
20
  spec.required_ruby_version = '>= 2.0.0'
@@ -24,17 +23,24 @@ Gem::Specification.new do |spec|
24
23
  spec.add_dependency 'thor', '~> 0.19.1'
25
24
 
26
25
  spec.add_development_dependency 'bundler', '~> 1.6'
27
- spec.add_development_dependency 'rake', '~> 10.3.1'
28
26
  spec.add_development_dependency 'bump', '~> 0.5.0'
29
27
 
30
- spec.add_development_dependency 'yard', '0.8.7.4'
31
- spec.add_development_dependency 'redcarpet', '3.1.1'
28
+ spec.add_development_dependency 'yard', '~> 0.8.7.4'
29
+ spec.add_development_dependency 'yard-redcarpet-ext', '~> 0.0.3'
30
+ spec.add_development_dependency 'redcarpet', '~> 3.1.2'
32
31
  spec.add_development_dependency 'github-markup', '1.2.1'
33
32
 
34
- spec.add_development_dependency 'rspec', '~> 2.14.1'
33
+ spec.add_development_dependency 'rubocop', '~> 0.23.0'
34
+
35
+ spec.add_development_dependency 'rake', '~> 10.3.2'
36
+
37
+ spec.add_development_dependency 'guard', '~> 2.6.1'
38
+ spec.add_development_dependency 'guard-yard', '~> 2.1.0'
39
+ spec.add_development_dependency 'guard-rubocop', '~> 1.1.0'
40
+ spec.add_development_dependency 'guard-rspec', '~> 4.2.9'
41
+
42
+ spec.add_development_dependency 'rspec', '~> 3.0.0'
35
43
  spec.add_development_dependency 'simplecov', '~> 0.8.2'
36
44
  spec.add_development_dependency 'coveralls', '~> 0.7.0'
37
- spec.add_development_dependency 'fuubar', '~> 1.3.2'
38
- spec.add_development_dependency 'guard-rspec', '~> 4.2.8'
39
- spec.add_development_dependency 'guard-yard', '~> 2.1.1'
45
+ spec.add_development_dependency 'fuubar', '~> 2.0.0.rc1'
40
46
  end
data/lib/.rubocop.yml ADDED
@@ -0,0 +1,4 @@
1
+ inherit_from: ../.rubocop.yml
2
+
3
+ Style/LineLength:
4
+ Max: 100
@@ -7,7 +7,3 @@ require 'config_curator/unit'
7
7
  require 'config_curator/units/config_file'
8
8
  require 'config_curator/units/symlink'
9
9
  require 'config_curator/units/component'
10
-
11
- # Simple and intelligent configuration file management.
12
- module ConfigCurator
13
- end
@@ -2,10 +2,8 @@ require 'logger'
2
2
  require 'thor'
3
3
 
4
4
  module ConfigCurator
5
-
6
5
  # Thor class for the `curate` command.
7
6
  class CLI < Thor
8
-
9
7
  default_task :install
10
8
 
11
9
  class_option :verbose, type: :boolean, aliases: %i(v)
@@ -15,11 +13,12 @@ module ConfigCurator
15
13
  # Installs the collection.
16
14
  # @param manifest [String] path to the manifest file to use
17
15
  # @return [Boolean] value of {Collection#install} or {Collection#install?}
18
- desc "install", "Installs all units in collection."
19
- option :dryrun, type: :boolean, aliases: %i(n),
20
- desc: %q{Only simulate the install. Don't make any actual changes.}
21
- def install manifest='manifest.yml'
22
- unless File.exists? manifest
16
+ desc 'install', 'Installs all units in collection.'
17
+ option :dryrun,
18
+ type: :boolean, aliases: %i(n),
19
+ desc: %q{Only simulate the install. Don't make any actual changes.}
20
+ def install(manifest = 'manifest.yml')
21
+ unless File.exist? manifest
23
22
  logger.fatal { "Manifest file '#{manifest}' does not exist." }
24
23
  return false
25
24
  end
@@ -27,21 +26,12 @@ module ConfigCurator
27
26
  collection.load_manifest manifest
28
27
  result = options[:dryrun] ? collection.install? : collection.install
29
28
 
30
- msg = "Install #{'simulation ' if options[:dryrun]}" + \
31
- if result
32
- 'completed without error.'
33
- elsif result.nil?
34
- 'failed.'
35
- else
36
- 'failed. No changes were made.'
37
- end
38
-
39
- if result then logger.info msg else logger.error msg end
40
- return result
29
+ msg = install_message(result, options[:dryrun])
30
+ result ? logger.info(msg) : logger.error(msg)
31
+ result
41
32
  end
42
33
 
43
34
  no_commands do
44
-
45
35
  # Makes a collection object to use for the instance.
46
36
  # @return [Collection] the collection object
47
37
  def collection
@@ -56,19 +46,34 @@ module ConfigCurator
56
46
  log.formatter = proc do |severity, _, _, msg|
57
47
  "#{severity} -- #{msg}\n"
58
48
  end
59
- log.level = \
60
- if options[:debug]
61
- Logger::DEBUG
62
- elsif options[:verbose]
63
- Logger::INFO
64
- elsif options[:quiet]
65
- Logger::FATAL
66
- else
67
- Logger::WARN
68
- end
49
+ log.level = log_level(options)
69
50
  end
70
51
  end
71
52
  end
72
- end
73
53
 
54
+ private
55
+
56
+ def log_level(options)
57
+ if options[:debug]
58
+ Logger::DEBUG
59
+ elsif options[:verbose]
60
+ Logger::INFO
61
+ elsif options[:quiet]
62
+ Logger::FATAL
63
+ else
64
+ Logger::WARN
65
+ end
66
+ end
67
+
68
+ def install_message(result, dryrun)
69
+ "Install #{'simulation ' if dryrun}" + \
70
+ if result
71
+ 'completed without error.'
72
+ elsif result.nil?
73
+ 'failed.'
74
+ else
75
+ 'failed. No changes were made.'
76
+ end
77
+ end
78
+ end
74
79
  end
@@ -3,30 +3,28 @@ require 'logger'
3
3
  require 'yaml'
4
4
 
5
5
  module ConfigCurator
6
-
7
6
  # Manages collections of units.
8
7
  # @example Load a list of units and install them
9
8
  # Collection.new(manifest_path: 'manifest.yml').install
10
9
  class Collection
11
-
12
10
  # Supported unit types.
13
11
  UNIT_TYPES = %i(unit component config_file symlink)
14
12
 
15
13
  # The possible attributes specific to each unit type.
16
14
  # This should not include generic attributes
17
15
  # such as {Unit#source} and {Unit#destination}.
18
- UNIT_ATTRIBUTESS = {
16
+ UNIT_ATTRIBUTES = {
19
17
  unit: %i(hosts packages),
20
18
  component: %i(hosts packages fmode dmode owner group),
21
19
  config_file: %i(hosts packages fmode owner group),
22
- symlink: %i(hosts packages),
20
+ symlink: %i(hosts packages)
23
21
  }
24
22
 
25
23
  attr_accessor :logger, :manifest, :units
26
24
 
27
- def initialize manifest_path: nil, logger: nil
25
+ def initialize(manifest_path: nil, logger: nil)
28
26
  self.logger = logger unless logger.nil?
29
- self.load_manifest manifest_path unless manifest_path.nil?
27
+ load_manifest manifest_path unless manifest_path.nil?
30
28
  end
31
29
 
32
30
  # Logger instance to use.
@@ -40,7 +38,7 @@ module ConfigCurator
40
38
  # Loads the manifest from file.
41
39
  # @param file [Hash] the yaml file to load
42
40
  # @return [Hash] the loaded manifest
43
- def load_manifest file
41
+ def load_manifest(file)
44
42
  self.manifest = YAML.load_file file
45
43
  end
46
44
 
@@ -52,32 +50,22 @@ module ConfigCurator
52
50
  k = type.to_s.pluralize.to_sym
53
51
  u[k] = []
54
52
 
55
- if manifest
56
- manifest[k].each do |v|
57
- u[k] << create_unit(type, attributes: v)
58
- end unless manifest[k].nil?
59
- end
53
+ next unless manifest
54
+ next if manifest[k].nil?
55
+
56
+ manifest[k].each { |v| u[k] << create_unit(type, attributes: v) }
60
57
  end
61
58
  end
62
59
  end
63
60
 
64
61
  # Installs all units from the manifest.
65
- # @return [Boolean, nil] if units were installed or nil when fails mid-install
62
+ # @return [Boolean, nil] if units were installed or nil if fails mid-install
66
63
  def install
67
64
  return false unless install? quiet: !(logger.level == Logger::DEBUG)
68
65
 
69
- UNIT_TYPES.each do |t|
70
- type_name = t.to_s.humanize capitalize: false
71
-
72
- units[t.to_s.pluralize.to_sym].each do |unit|
73
- begin
74
- if unit.install
75
- logger.info { "Installed #{type_name}: #{unit.source} ⇨ #{unit.destination_path}" }
76
- end
77
- rescue Unit::InstallFailed => e
78
- logger.fatal { "Halting install! Install attempt failed for #{type_name}: #{e}" }
79
- return nil
80
- end
66
+ UNIT_TYPES.each do |type|
67
+ units[type.to_s.pluralize.to_sym].each do |unit|
68
+ return nil unless install_unit(unit, type)
81
69
  end
82
70
  end
83
71
  true
@@ -86,20 +74,11 @@ module ConfigCurator
86
74
  # Checks all units in the manifest for any detectable install issues.
87
75
  # @param quiet [Boolean] suppress some {#logger} output
88
76
  # @return [Boolean] if units can be installed
89
- def install? quiet: false
77
+ def install?(quiet: false)
90
78
  result = true
91
- UNIT_TYPES.each do |t|
92
- type_name = t.to_s.humanize capitalize: false
93
-
94
- units[t.to_s.pluralize.to_sym].each do |unit|
95
- begin
96
- if unit.install?
97
- logger.info { "Testing install for #{type_name}: #{unit.source} ⇨ #{unit.destination_path}" }
98
- end unless quiet
99
- rescue Unit::InstallFailed => e
100
- result = false
101
- logger.error { "Cannot install #{type_name}: #{e}" }
102
- end
79
+ UNIT_TYPES.each do |type|
80
+ units[type.to_s.pluralize.to_sym].each do |unit|
81
+ result = install_unit?(unit, type, quiet) ? result : false
103
82
  end
104
83
  end
105
84
  result
@@ -107,21 +86,16 @@ module ConfigCurator
107
86
 
108
87
  # Creates a new unit object for the collection.
109
88
  # @param type [Symbol] a unit type in {UNIT_TYPES}
110
- # @param attributes [Hash] attributes for the unit from {UNIT_ATTRIBUTESS}
89
+ # @param attributes [Hash] attributes for the unit from {UNIT_ATTRIBUTES}
111
90
  # @return [Unit] the unit object of the appropriate subclass
112
- def create_unit type, attributes: {}
113
- options = {}
114
- %i(root package_tool).each do |k|
115
- options[k] = manifest[k] unless manifest[k].nil?
116
- end if manifest
117
-
91
+ def create_unit(type, attributes: {})
118
92
  "#{self.class.name.split('::').first}::#{type.to_s.camelize}".constantize
119
- .new(options: options, logger: logger).tap do |unit|
93
+ .new(options: unit_options, logger: logger).tap do |unit|
120
94
  {src: :source, dst: :destination}.each do |k, v|
121
95
  unit.send "#{v}=".to_sym, attributes[k] unless attributes[k].nil?
122
96
  end
123
97
 
124
- UNIT_ATTRIBUTESS[type].each do |v|
98
+ UNIT_ATTRIBUTES[type].each do |v|
125
99
  unit.send "#{v}=".to_sym, defaults[v] unless defaults[v].nil?
126
100
  unit.send "#{v}=".to_sym, attributes[v] unless attributes[v].nil?
127
101
  end
@@ -130,11 +104,64 @@ module ConfigCurator
130
104
 
131
105
  private
132
106
 
107
+ # Formats a unit type for display.
108
+ # @param type [Symbol] the unit type
109
+ # @return [String] formatted unit type
110
+ def type_name(type)
111
+ type.to_s.humanize capitalize: false
112
+ end
113
+
133
114
  # Hash of any defaults given in the manifest.
115
+ # @return [Hash] the defaults
134
116
  def defaults
135
117
  return {} unless manifest
136
118
  manifest[:defaults].nil? ? {} : manifest[:defaults]
137
119
  end
138
- end
139
120
 
121
+ # Load basic unit options from the manifest.
122
+ # @return [Hash] the options
123
+ def unit_options
124
+ options = {}
125
+ return options unless manifest
126
+ %i(root package_tool).each do |k|
127
+ options[k] = manifest[k] unless manifest[k].nil?
128
+ end
129
+ options
130
+ end
131
+
132
+ # Installs a unit.
133
+ # @param unit [Unit] the unit to install
134
+ # @param type [Symbol] the unit type
135
+ # @param quiet [Boolean] suppress some {#logger} output
136
+ # @return [Boolean] if unit was installed
137
+ def install_unit(unit, type, quiet = false)
138
+ unit.install
139
+ logger.info do
140
+ "Installed #{type_name(type)}: #{unit.source} ⇨ #{unit.destination_path}"
141
+ end unless quiet
142
+ return true
143
+
144
+ rescue Unit::InstallFailed => e
145
+ logger.fatal { "Halting install! Install attempt failed for #{type_name(type)}: #{e}" }
146
+ return false
147
+ end
148
+
149
+ # Checks if a unit can be installed.
150
+ # @param unit [Unit] the unit to check
151
+ # @param type [Symbol] the unit type
152
+ # @param quiet [Boolean] suppress some {#logger} output
153
+ # @return [Boolean] if unit can be installed
154
+ def install_unit?(unit, type, quiet = false)
155
+ unit.install?
156
+ logger.info do
157
+ "Testing install for #{type_name(type)}:" \
158
+ " #{unit.source} ⇨ #{unit.destination_path}"
159
+ end unless quiet
160
+ return true
161
+
162
+ rescue Unit::InstallFailed => e
163
+ logger.error { "Cannot install #{type_name(type)}: #{e}" }
164
+ return false
165
+ end
166
+ end
140
167
  end
@@ -2,7 +2,6 @@ require 'mkmf'
2
2
  require 'open3'
3
3
 
4
4
  module ConfigCurator
5
-
6
5
  # Lookup if a package is installed on the system.
7
6
  # See {TOOLS} for supported package tools.
8
7
  # If {#tool} is not explicitly set, it will try and choose one automatically.
@@ -11,7 +10,6 @@ module ConfigCurator
11
10
  # @example Lookup a package using `pacman`
12
11
  # PackageLookup.new(tool: :pacman).installed? 'ruby' #=> true
13
12
  class PackageLookup
14
-
15
13
  include Utils
16
14
 
17
15
  # Error when a package lookup cannot be completed.
@@ -22,12 +20,12 @@ module ConfigCurator
22
20
  TOOLS = {
23
21
  dpkg: 'dpkg',
24
22
  pacman: 'pacman',
25
- pkgng: 'pkg',
23
+ pkgng: 'pkg'
26
24
  }
27
25
 
28
26
  attr_accessor :tool, :tools
29
27
 
30
- def initialize tool: nil
28
+ def initialize(tool: nil)
31
29
  self.tool = tool
32
30
  end
33
31
 
@@ -44,9 +42,8 @@ module ConfigCurator
44
42
  return @tool if @tool
45
43
 
46
44
  tools.each do |k, v|
47
- if command? v
48
- return @tool = k
49
- end
45
+ next unless command? v
46
+ return @tool = k
50
47
  end
51
48
  @tool
52
49
  end
@@ -54,7 +51,7 @@ module ConfigCurator
54
51
  # Checks if package is installed.
55
52
  # @param package [String] package name to check
56
53
  # @return [Boolean] if package is installed
57
- def installed? package
54
+ def installed?(package)
58
55
  fail LookupFailed, 'No supported package tool found.' if tool.nil?
59
56
 
60
57
  cmd = tools[tool]
@@ -69,26 +66,25 @@ module ConfigCurator
69
66
  # Tool specific package lookup methods below.
70
67
  #
71
68
 
72
- def dpkg package
69
+ def dpkg(package)
73
70
  cmd = command? 'dpkg'
74
71
  Open3.popen3 cmd, '-s', package do |_, _ , _, wait_thr|
75
72
  wait_thr.value.to_i == 0
76
73
  end
77
74
  end
78
75
 
79
- def pacman package
76
+ def pacman(package)
80
77
  cmd = command? 'pacman'
81
78
  Open3.popen3 cmd, '-qQ', package do |_, _ , _, wait_thr|
82
79
  wait_thr.value.to_i == 0
83
80
  end
84
81
  end
85
82
 
86
- def pkgng package
83
+ def pkgng(package)
87
84
  cmd = command? 'pkg'
88
85
  Open3.popen3 cmd, 'info', package do |_, _ , _, wait_thr|
89
86
  wait_thr.value.to_i == 0
90
87
  end
91
88
  end
92
89
  end
93
-
94
90
  end
@@ -2,12 +2,10 @@ require 'logger'
2
2
  require 'socket'
3
3
 
4
4
  module ConfigCurator
5
-
6
5
  # A unit is the base class for a type of configuration
7
6
  # that should be installed.
8
7
  # All units must specify a {#source} and a {#destination}.
9
8
  class Unit
10
-
11
9
  include Utils
12
10
 
13
11
  # Error if the unit will fail to install.
@@ -21,10 +19,10 @@ module ConfigCurator
21
19
  root: Dir.home,
22
20
 
23
21
  # Package tool to use. See #package_lookup.
24
- package_tool: nil,
22
+ package_tool: nil
25
23
  }
26
24
 
27
- def initialize options: {}, logger: nil
25
+ def initialize(options: {}, logger: nil)
28
26
  self.options options
29
27
  self.logger = logger unless logger.nil?
30
28
  end
@@ -32,7 +30,7 @@ module ConfigCurator
32
30
  # Uses {DEFAULT_OPTIONS} as initial value.
33
31
  # @param options [Hash] merged with current options
34
32
  # @return [Hash] current options
35
- def options options = {}
33
+ def options(options = {})
36
34
  @options ||= DEFAULT_OPTIONS
37
35
  @options = @options.merge options
38
36
  end
@@ -99,7 +97,7 @@ module ConfigCurator
99
97
  # Checks if the packages required for this unit are installed.
100
98
  # @return [Boolean] if the packages in {#packages} are installed
101
99
  def packages_installed?
102
- packages.map(&method(:pkg_exists?)).delete_if{ |e| e }.empty?
100
+ packages.map(&method(:pkg_exists?)).delete_if { |e| e }.empty?
103
101
  end
104
102
 
105
103
  private
@@ -110,9 +108,8 @@ module ConfigCurator
110
108
  end
111
109
 
112
110
  # @return [Boolean] if the package exists on the system
113
- def pkg_exists? pkg
111
+ def pkg_exists?(pkg)
114
112
  package_lookup.installed? pkg
115
113
  end
116
114
  end
117
-
118
115
  end
@@ -1,13 +1,11 @@
1
1
  require 'mkmf'
2
2
 
3
3
  module ConfigCurator
4
-
5
4
  # A component is a folder that should be copied.
6
5
  # The {#destination} will become a mirror of the {#source}.
7
6
  # The contents of the {#destination_path} is
8
7
  # completely replaced by the contents of the {#source_path}.
9
8
  class Component < Unit
10
-
11
9
  attr_accessor :fmode, :dmode, :owner, :group
12
10
 
13
11
  # (see Unit#install)
@@ -24,9 +22,9 @@ module ConfigCurator
24
22
  def install?
25
23
  s = super
26
24
  return s unless s
27
- fail InstallFailed, "No component source path specified." if source_path.nil?
28
- fail InstallFailed, "No component install path specified." if destination_path.nil?
29
- fail InstallFailed, "Source path does not exist: #{source}" unless Dir.exists? source_path
25
+ fail InstallFailed, 'No component source path specified.' if source_path.nil?
26
+ fail InstallFailed, 'No component install path specified.' if destination_path.nil?
27
+ fail InstallFailed, "Source path does not exist: #{source}" unless Dir.exist? source_path
30
28
  true
31
29
  end
32
30
 
@@ -40,7 +38,7 @@ module ConfigCurator
40
38
  FileUtils.mkdir_p destination_path
41
39
  cmd = [command?('rsync'), '-rt', '--del', "#{source_path}/", destination_path]
42
40
  logger.debug { "Running command: #{cmd.join ' '}" }
43
- system *cmd
41
+ system(*cmd)
44
42
  else
45
43
  FileUtils.remove_entry_secure destination_path
46
44
  FileUtils.mkdir_p destination_path
@@ -53,14 +51,15 @@ module ConfigCurator
53
51
  def set_mode
54
52
  chmod = command? 'chmod'
55
53
  find = command? 'find'
56
- if chmod && find
57
- {fmode: 'f', dmode: 'd'}.each do |k, v|
58
- next if self.send(k).nil?
59
- cmd = [find, destination_path, '-type', v, '-exec']
60
- cmd.concat [chmod, self.send(k).to_s(8), '{}', '+']
61
- logger.debug { "Running command: #{cmd.join ' '}" }
62
- system *cmd
63
- end
54
+
55
+ return unless chmod && find
56
+
57
+ {fmode: 'f', dmode: 'd'}.each do |k, v|
58
+ next if send(k).nil?
59
+ cmd = [find, destination_path, '-type', v, '-exec']
60
+ cmd.concat [chmod, send(k).to_s(8), '{}', '+']
61
+ logger.debug { "Running command: #{cmd.join ' '}" }
62
+ system(*cmd)
64
63
  end
65
64
  end
66
65
 
@@ -69,12 +68,12 @@ module ConfigCurator
69
68
  def set_owner
70
69
  return unless owner || group
71
70
  chown = command? 'chown'
72
- if chown
73
- cmd = [chown, '-R', "#{owner}:#{group}", destination_path]
74
- logger.debug { "Running command: #{cmd.join ' '}" }
75
- system *cmd
76
- end
71
+
72
+ return unless chown
73
+
74
+ cmd = [chown, '-R', "#{owner}:#{group}", destination_path]
75
+ logger.debug { "Running command: #{cmd.join ' '}" }
76
+ system(*cmd)
77
77
  end
78
78
  end
79
-
80
79
  end
@@ -1,8 +1,6 @@
1
1
  module ConfigCurator
2
-
3
2
  # A config file is a file that should be copied.
4
3
  class ConfigFile < Unit
5
-
6
4
  attr_accessor :fmode, :owner, :group
7
5
 
8
6
  # Will use files of the form `filename.hostname.ext` if found.
@@ -10,7 +8,12 @@ module ConfigCurator
10
8
  def source
11
9
  path = super
12
10
  host_specific_file = search_for_host_specific_file path if path
13
- if host_specific_file then return host_specific_file else return path end
11
+
12
+ if host_specific_file
13
+ return host_specific_file
14
+ else
15
+ return path
16
+ end
14
17
  end
15
18
 
16
19
  # (see Unit#destination)
@@ -34,8 +37,8 @@ module ConfigCurator
34
37
  def install?
35
38
  s = super
36
39
  return s unless s
37
- fail InstallFailed, "No file source path specified." if source_path.nil?
38
- fail InstallFailed, "Source path does not exist: #{source}" unless File.exists? source_path
40
+ fail InstallFailed, 'No file source path specified.' if source_path.nil?
41
+ fail InstallFailed, "Source path does not exist: #{source}" unless File.exist? source_path
39
42
  true
40
43
  end
41
44
 
@@ -61,11 +64,11 @@ module ConfigCurator
61
64
 
62
65
  # Will look for files with the naming pattern `filename.hostname.ext`.
63
66
  # @param path [String] path to the non-host-specific file
64
- def search_for_host_specific_file path
67
+ def search_for_host_specific_file(path)
65
68
  directory = File.dirname path
66
69
  extension = File.extname path
67
70
  basename = File.basename path.chomp(extension)
68
- if Dir.exists? directory
71
+ if Dir.exist? directory
69
72
  file = Dir.entries(directory).grep(/^#{basename}.#{hostname.downcase}/).first
70
73
  File.join directory, file unless file.nil?
71
74
  else
@@ -73,5 +76,4 @@ module ConfigCurator
73
76
  end
74
77
  end
75
78
  end
76
-
77
79
  end
@@ -1,10 +1,8 @@
1
1
  module ConfigCurator
2
-
3
2
  # A symlink is a symbolic link that should be created.
4
3
  # The {#destination_path} will be a link
5
4
  # that points to the {#source_path}.
6
5
  class Symlink < Unit
7
-
8
6
  # (see Unit#install)
9
7
  def install
10
8
  s = super
@@ -17,8 +15,8 @@ module ConfigCurator
17
15
  def install?
18
16
  s = super
19
17
  return s unless s
20
- fail InstallFailed, "No source file specified." if source_path.nil?
21
- fail InstallFailed, "No destination specified." if destination_path.nil?
18
+ fail InstallFailed, 'No source file specified.' if source_path.nil?
19
+ fail InstallFailed, 'No destination specified.' if destination_path.nil?
22
20
  true
23
21
  end
24
22
 
@@ -30,5 +28,4 @@ module ConfigCurator
30
28
  FileUtils.symlink source_path, destination_path, force: true
31
29
  end
32
30
  end
33
-
34
31
  end
@@ -1,18 +1,15 @@
1
1
  module ConfigCurator
2
-
3
2
  # Utility class.
4
3
  module Utils
5
-
6
4
  private
7
5
 
8
6
  # Checks if command exists.
9
7
  # @param command [String] command name to check
10
8
  # @return [String, nil] full path to command or nil if not found
11
- def command? command
9
+ def command?(command)
12
10
  MakeMakefile::Logging.instance_variable_set :@logfile, File::NULL
13
11
  MakeMakefile::Logging.quiet = true
14
12
  MakeMakefile.find_executable command.to_s
15
13
  end
16
14
  end
17
-
18
15
  end
@@ -1,4 +1,5 @@
1
+ # Simple and intelligent configuration file management.
1
2
  module ConfigCurator
2
3
  # Config Curator version.
3
- VERSION = '0.1.1'
4
+ VERSION = '0.2.0'
4
5
  end
data/spec/.rubocop.yml ADDED
@@ -0,0 +1,7 @@
1
+ inherit_from: ../.rubocop.yml
2
+
3
+ Style/StringLiterals:
4
+ Enabled: false
5
+
6
+ Style/LineLength:
7
+ Max: 120
data/spec/cli_spec.rb CHANGED
@@ -25,7 +25,7 @@ describe ConfigCurator::CLI do
25
25
  describe "#install" do
26
26
 
27
27
  it "installs the collection" do
28
- allow(File).to receive(:exists?).with('manifest.yml').and_return(true)
28
+ allow(File).to receive(:exist?).with('manifest.yml').and_return(true)
29
29
  expect(cli.collection).to receive(:load_manifest).with('manifest.yml')
30
30
  expect(cli.collection).to receive(:install).and_return(true)
31
31
  expect(cli.install 'manifest.yml').to be true
@@ -33,10 +33,10 @@ describe ConfigCurator::CLI do
33
33
 
34
34
  context "when --dryrun is set" do
35
35
 
36
- before(:each) { allow(cli).to receive(:options).and_return({dryrun: true}) }
36
+ before(:each) { allow(cli).to receive(:options).and_return(dryrun: true) }
37
37
 
38
38
  it "only checks if install would succeed" do
39
- allow(File).to receive(:exists?).with('manifest.yml').and_return(true)
39
+ allow(File).to receive(:exist?).with('manifest.yml').and_return(true)
40
40
  expect(cli.collection).to receive(:load_manifest).with('manifest.yml')
41
41
  expect(cli.collection).to receive(:install?).and_return(true)
42
42
  expect(cli.collection).to_not receive(:install)
@@ -47,7 +47,7 @@ describe ConfigCurator::CLI do
47
47
  context "manifest not found" do
48
48
 
49
49
  it "returns false and doesn't do anything else" do
50
- allow(File).to receive(:exists?).with('manifest.yml').and_return(false)
50
+ allow(File).to receive(:exist?).with('manifest.yml').and_return(false)
51
51
  expect(cli.collection).to_not receive(:install)
52
52
  expect(cli.collection).to_not receive(:install?)
53
53
  expect(cli.install 'manifest.yml').to be false
@@ -55,10 +55,10 @@ describe ConfigCurator::CLI do
55
55
 
56
56
  context "when --dryrun is set" do
57
57
 
58
- before(:each) { allow(cli).to receive(:options).and_return({dryrun: true}) }
58
+ before(:each) { allow(cli).to receive(:options).and_return(dryrun: true) }
59
59
 
60
60
  it "returns false and doesn't do anything else" do
61
- allow(File).to receive(:exists?).with('manifest.yml').and_return(false)
61
+ allow(File).to receive(:exist?).with('manifest.yml').and_return(false)
62
62
  expect(cli.collection).to_not receive(:install)
63
63
  expect(cli.collection).to_not receive(:install?)
64
64
  expect(cli.install 'manifest.yml').to be false
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,3 @@
1
- require 'config_curator'
2
-
3
1
  require 'coveralls'
4
2
  require 'simplecov'
5
3
 
@@ -10,9 +8,15 @@ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
10
8
 
11
9
  SimpleCov.start
12
10
 
11
+ require 'config_curator'
12
+
13
13
  RSpec.configure do |c|
14
14
  c.expect_with(:rspec) { |e| e.syntax = :expect }
15
15
 
16
+ c.before(:each) do
17
+ allow(FileUtils).to receive(:remove_entry_secure).with(anything)
18
+ end
19
+
16
20
  stderr = $stderr
17
21
  stdout = $stdout
18
22
  c.before(:all) do
@@ -23,6 +27,4 @@ RSpec.configure do |c|
23
27
  $stderr = stderr
24
28
  $stdout = stdout
25
29
  end
26
-
27
- c.before(:each) { allow(FileUtils).to receive(:remove_entry_secure).with(anything) }
28
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: config_curator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Boyd Sosenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-30 00:00:00.000000000 Z
11
+ date: 2014-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -53,61 +53,61 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.6'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rake
56
+ name: bump
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 10.3.1
61
+ version: 0.5.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 10.3.1
68
+ version: 0.5.0
69
69
  - !ruby/object:Gem::Dependency
70
- name: bump
70
+ name: yard
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.5.0
75
+ version: 0.8.7.4
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.5.0
82
+ version: 0.8.7.4
83
83
  - !ruby/object:Gem::Dependency
84
- name: yard
84
+ name: yard-redcarpet-ext
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '='
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.8.7.4
89
+ version: 0.0.3
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '='
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.8.7.4
96
+ version: 0.0.3
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: redcarpet
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '='
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 3.1.1
103
+ version: 3.1.2
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - '='
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 3.1.1
110
+ version: 3.1.2
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: github-markup
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -123,89 +123,145 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: 1.2.1
125
125
  - !ruby/object:Gem::Dependency
126
- name: rspec
126
+ name: rubocop
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 2.14.1
131
+ version: 0.23.0
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 2.14.1
138
+ version: 0.23.0
139
139
  - !ruby/object:Gem::Dependency
140
- name: simplecov
140
+ name: rake
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: 0.8.2
145
+ version: 10.3.2
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: 0.8.2
152
+ version: 10.3.2
153
153
  - !ruby/object:Gem::Dependency
154
- name: coveralls
154
+ name: guard
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: 0.7.0
159
+ version: 2.6.1
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: 0.7.0
166
+ version: 2.6.1
167
167
  - !ruby/object:Gem::Dependency
168
- name: fuubar
168
+ name: guard-yard
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: 2.1.0
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 2.1.0
181
+ - !ruby/object:Gem::Dependency
182
+ name: guard-rubocop
169
183
  requirement: !ruby/object:Gem::Requirement
170
184
  requirements:
171
185
  - - "~>"
172
186
  - !ruby/object:Gem::Version
173
- version: 1.3.2
187
+ version: 1.1.0
174
188
  type: :development
175
189
  prerelease: false
176
190
  version_requirements: !ruby/object:Gem::Requirement
177
191
  requirements:
178
192
  - - "~>"
179
193
  - !ruby/object:Gem::Version
180
- version: 1.3.2
194
+ version: 1.1.0
181
195
  - !ruby/object:Gem::Dependency
182
196
  name: guard-rspec
183
197
  requirement: !ruby/object:Gem::Requirement
184
198
  requirements:
185
199
  - - "~>"
186
200
  - !ruby/object:Gem::Version
187
- version: 4.2.8
201
+ version: 4.2.9
188
202
  type: :development
189
203
  prerelease: false
190
204
  version_requirements: !ruby/object:Gem::Requirement
191
205
  requirements:
192
206
  - - "~>"
193
207
  - !ruby/object:Gem::Version
194
- version: 4.2.8
208
+ version: 4.2.9
195
209
  - !ruby/object:Gem::Dependency
196
- name: guard-yard
210
+ name: rspec
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: 3.0.0
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: 3.0.0
223
+ - !ruby/object:Gem::Dependency
224
+ name: simplecov
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: 0.8.2
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: 0.8.2
237
+ - !ruby/object:Gem::Dependency
238
+ name: coveralls
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "~>"
242
+ - !ruby/object:Gem::Version
243
+ version: 0.7.0
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: 0.7.0
251
+ - !ruby/object:Gem::Dependency
252
+ name: fuubar
197
253
  requirement: !ruby/object:Gem::Requirement
198
254
  requirements:
199
255
  - - "~>"
200
256
  - !ruby/object:Gem::Version
201
- version: 2.1.1
257
+ version: 2.0.0.rc1
202
258
  type: :development
203
259
  prerelease: false
204
260
  version_requirements: !ruby/object:Gem::Requirement
205
261
  requirements:
206
262
  - - "~>"
207
263
  - !ruby/object:Gem::Version
208
- version: 2.1.1
264
+ version: 2.0.0.rc1
209
265
  description: ''
210
266
  email:
211
267
  - razorx@evansosenko.com
@@ -216,6 +272,7 @@ extra_rdoc_files: []
216
272
  files:
217
273
  - ".gitignore"
218
274
  - ".rspec"
275
+ - ".rubocop.yml"
219
276
  - ".travis.yml"
220
277
  - ".yardopts"
221
278
  - CHANGELOG.md
@@ -226,6 +283,7 @@ files:
226
283
  - Rakefile
227
284
  - bin/curate
228
285
  - config_curator.gemspec
286
+ - lib/.rubocop.yml
229
287
  - lib/config_curator.rb
230
288
  - lib/config_curator/cli.rb
231
289
  - lib/config_curator/collection.rb
@@ -236,6 +294,7 @@ files:
236
294
  - lib/config_curator/units/symlink.rb
237
295
  - lib/config_curator/utils.rb
238
296
  - lib/config_curator/version.rb
297
+ - spec/.rubocop.yml
239
298
  - spec/cli_spec.rb
240
299
  - spec/collection_spec.rb
241
300
  - spec/package_lookup_spec.rb
@@ -269,6 +328,7 @@ signing_key:
269
328
  specification_version: 4
270
329
  summary: Simple and intelligent configuration file management.
271
330
  test_files:
331
+ - spec/.rubocop.yml
272
332
  - spec/cli_spec.rb
273
333
  - spec/collection_spec.rb
274
334
  - spec/package_lookup_spec.rb