npmdc 0.2.5 → 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: 537a9fb442684ccc9060002f319790fee0e957de
4
- data.tar.gz: 4790c3f98f4df7ba95c919741d10cec5efad8f68
3
+ metadata.gz: edf001bda970b1e162aeb42fb68139881f4c12ac
4
+ data.tar.gz: 0b05cecf21b35f46c54706f68d610d2bb6e4f4f4
5
5
  SHA512:
6
- metadata.gz: e600166b3f97c343ed26f5529cb3cb1cba64ec767127c7e37eda61f182718241e0f78fb7b3a24d8a273ec160e5934ad1d49a7011a9a16d077c2e96cb402c1254
7
- data.tar.gz: a76611ac04b63bd4077d435703e0aee7dafc72a734d22db8cdaeb1eebcdf52e503aae45a0ad461e7ca4b2bde7f43b859ab3d0a7427007580a663b24dc6701cf4
6
+ metadata.gz: 0753c101fab5213fdd03d5246a99ab2f71d887d1d31e6335020c94de6971934dec00d1e6aa839f1b3105ea55a0508068c776cf7f63dd546cd74f4d8282783103
7
+ data.tar.gz: 8d2581dd9b526ec1dc366b552f8189818d690c00f4dd1d6c382d72fe41bbded948cc7cde36d7da2aed0c1a719b0b9654b2897e95aeda62189686f782d1a44df5
data/.travis.yml CHANGED
@@ -1,11 +1,11 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  cache: bundler
4
- matrix:
5
- include:
6
- - rvm: 2.3.3
7
- gemfile: gemfiles/rails42.gemfile
8
- - rvm: 2.3.3
9
- gemfile: gemfiles/rails5.gemfile
4
+ rvm:
5
+ - 2.3.3
6
+
7
+ gemfile:
8
+ - gemfiles/rails42.gemfile
9
+ - gemfiles/rails5.gemfile
10
10
 
11
11
  before_install: gem install bundler -v 1.13.6
data/CHANGELOG.md CHANGED
@@ -71,3 +71,10 @@ Thanks to @aderyabin !
71
71
  * Added new `types` option
72
72
 
73
73
  * Added specs for 'short' formatter
74
+
75
+
76
+ ### 0.3.0
77
+
78
+ * Added new version check functionality
79
+
80
+ * Added specs for version check
data/README.md CHANGED
@@ -53,14 +53,16 @@ $ bundle exec npmdc [options]
53
53
 
54
54
  _Options:_
55
55
 
56
- * --path PATH - Path to frontend code
57
-
58
- * --color - Disable color formatting of output
59
-
60
- * -f, --format FORMAT - Set format of output
61
-
62
- * -t, --types dependencies devDependencies - Dependency types to check
63
-
56
+ ```bash
57
+ [--path=PATH] # Path to package.json config
58
+ [--color], [--no-color] # Enable color
59
+ # Default: true
60
+ t, [--types=one two three] # types for check
61
+ # Default: ["dependencies", "devDependencies"]
62
+ # Possible values: dependencies, devDependencies
63
+ f, [--format=FORMAT] # Output format
64
+ # Possible values: progress, doc, short
65
+ ```
64
66
  ## Development
65
67
 
66
68
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/lib/npmdc/checker.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  require 'colorize'
2
2
  require 'json'
3
+ require 'forwardable'
4
+ require 'semantic_range'
3
5
  require 'npmdc/formatter'
4
6
  require 'npmdc/errors'
5
- require 'forwardable'
6
7
 
7
8
  module Npmdc
8
9
  class Checker
@@ -19,7 +20,10 @@ module Npmdc
19
20
  @missing_dependencies = Set.new
20
21
  end
21
22
 
22
- delegate [:output, :dep_output, :check_start_output, :check_finish_output] => :formatter
23
+ delegate [
24
+ :output, :error_output, :dep_output,
25
+ :check_start_output, :check_finish_output
26
+ ] => :formatter
23
27
 
24
28
  def call
25
29
  begin
@@ -29,18 +33,8 @@ module Npmdc
29
33
  check_dependencies(package_json_data[dep], dep) if package_json_data[dep]
30
34
  end
31
35
 
32
- rescue NoNodeModulesError => e
33
- output("Failed! Can't find `node_modules` folder inside '#{e.message}' directory!")
34
- output("\nRun `npm install` to install missing packages.", :warn)
35
-
36
- rescue WrongPathError => e
37
- output("There is no '#{e.message}' directory.")
38
-
39
- rescue MissedPackageError => e
40
- output("There is no `package.json` file inside '#{e.message}' directory.")
41
-
42
- rescue JsonParseError => e
43
- output("Can't parse JSON file #{e.message}")
36
+ rescue CheckerError => e
37
+ error_output(e)
44
38
  else
45
39
  success = true unless !@missing_dependencies.empty?
46
40
  ensure
@@ -63,7 +57,7 @@ module Npmdc
63
57
  def installed_modules
64
58
  @installed_modules ||= begin
65
59
  modules_directory = File.join(path, 'node_modules')
66
- raise NoNodeModulesError, path unless Dir.exist?(modules_directory)
60
+ raise(NoNodeModulesError, path: path) unless Dir.exist?(modules_directory)
67
61
 
68
62
  Dir.glob("#{modules_directory}/*").each_with_object({}) do |file_path, modules|
69
63
  next unless File.directory?(file_path)
@@ -73,33 +67,50 @@ module Npmdc
73
67
  end
74
68
 
75
69
  def package_json(directory, filename = 'package.json')
76
- raise WrongPathError, directory unless Dir.exist?(directory)
77
- file_path = File.join(directory, filename)
78
- raise MissedPackageError, directory unless File.file?(file_path)
70
+ raise(WrongPathError, directory: directory) unless Dir.exist?(directory)
71
+
72
+ path = File.join(directory, filename)
73
+ raise(MissedPackageError, directory: directory) unless File.file?(path)
79
74
 
80
75
  begin
81
- JSON.parse(File.read(file_path))
76
+ JSON.parse(File.read(path))
82
77
  rescue JSON::ParserError
83
- raise JsonParseError, file_path
78
+ raise(JsonParseError, path: path)
84
79
  end
85
80
  end
86
81
 
87
82
  def check_dependencies(deps, type)
88
83
  check_start_output(type)
84
+
89
85
  deps.each_key do |dep|
90
86
  @dependencies_count += 1
91
87
  check_dependency(dep, deps[dep])
92
88
  end
89
+
93
90
  check_finish_output
94
91
  end
95
92
 
96
93
  def check_dependency(dep, version)
97
- if installed_modules[dep]
98
- dep_output(dep, :success)
94
+ installed_module = installed_modules[dep]
95
+
96
+ if installed_module
97
+ check_version(installed_module, dep, version)
99
98
  else
100
99
  @missing_dependencies << "#{dep}@#{version}"
101
100
  dep_output(dep, :failure)
102
101
  end
103
102
  end
103
+
104
+ def check_version(installed_module, dep, version)
105
+ if !installed_module.key?('version') || !SemanticRange.valid(installed_module['version'])
106
+ @missing_dependencies << "#{dep}@#{version}"
107
+ dep_output(dep, :failure)
108
+ elsif SemanticRange.satisfies(installed_module['version'], version)
109
+ dep_output(dep, :success)
110
+ else
111
+ @missing_dependencies << "#{dep}@#{version}"
112
+ dep_output("#{dep} expected version '#{version}' but got '#{installed_module['version']}'", :failure)
113
+ end
114
+ end
104
115
  end
105
116
  end
data/lib/npmdc/cli.rb CHANGED
@@ -9,12 +9,13 @@ module Npmdc
9
9
  method_option :path, desc: 'Path to package.json config'
10
10
  method_option :color, desc: 'Enable color', type: :boolean, default: true
11
11
  method_option :types, aliases: [:t],
12
- desc: 'types for check',
12
+ desc: 'Dependency types to check',
13
13
  type: :array,
14
+ enum: Npmdc::Config::DEPEPENDENCY_TYPES,
14
15
  default: Npmdc::Config::DEPEPENDENCY_TYPES
15
16
  method_option :format, aliases: [:f],
16
- desc: "Output format,
17
- possible values: #{Npmdc::Formatter::FORMATTERS.keys.join(", ")}"
17
+ desc: 'Output format',
18
+ enum: Npmdc::Formatter::FORMATTERS.keys.map(&:to_s)
18
19
 
19
20
  def check
20
21
  Npmdc.call(options)
data/lib/npmdc/errors.rb CHANGED
@@ -1,9 +1,60 @@
1
1
  module Npmdc
2
2
  module Errors
3
- class NoNodeModulesError < StandardError; end
4
- class MissedPackageError < StandardError; end
5
- class JsonParseError < StandardError; end
6
- class MissedDepsError < StandardError; end
7
- class WrongPathError < StandardError; end
3
+ class Error < StandardError
4
+ attr_reader :options
5
+
6
+ def initialize(msg = nil, **options)
7
+ @options = options
8
+
9
+ super(msg)
10
+ end
11
+
12
+ def banner
13
+ raise(NotImplementedError, '#banner has to be implemented in subclass')
14
+ end
15
+ end
16
+
17
+ class CheckerError < Error; end
18
+ class ConfigurationError < Error; end
19
+
20
+ class NoNodeModulesError < CheckerError
21
+ def banner
22
+ path = options.fetch(:path)
23
+ [
24
+ "Can't find `node_modules` folder inside '#{path}' directory!",
25
+ ["\nRun `npm install` to install missing packages.", :warn]
26
+ ]
27
+ end
28
+ end
29
+
30
+ class WrongPathError < CheckerError
31
+ def banner
32
+ directory = options.fetch(:directory)
33
+ "There is no '#{directory}' directory."
34
+ end
35
+ end
36
+
37
+ class MissedPackageError < CheckerError
38
+ def banner
39
+ directory = options.fetch(:directory)
40
+ "There is no `package.json` file inside '#{directory}' directory."
41
+ end
42
+ end
43
+
44
+ class JsonParseError < CheckerError
45
+ def banner
46
+ path = options.fetch(:path)
47
+ "Can't parse JSON file #{path}"
48
+ end
49
+ end
50
+
51
+
52
+ class UnknownFormatter < ConfigurationError
53
+ def banner
54
+ formatter = options.fetch(:formatter)
55
+
56
+ "Unknown '#{formatter}' formatter"
57
+ end
58
+ end
8
59
  end
9
60
  end
@@ -4,7 +4,6 @@ require 'npmdc/formatters/short'
4
4
 
5
5
  module Npmdc
6
6
  module Formatter
7
-
8
7
  FORMATTERS = {
9
8
  progress: Npmdc::Formatters::Progress,
10
9
  doc: Npmdc::Formatters::Documentation,
@@ -14,7 +13,13 @@ module Npmdc
14
13
  class << self
15
14
  def call(options)
16
15
  fmt = options.fetch('format', Npmdc.config.format)
17
- FORMATTERS[fmt.to_sym].new(options)
16
+ klass(fmt).new(options)
17
+ end
18
+
19
+ private
20
+
21
+ def klass(fmt)
22
+ FORMATTERS[fmt.to_sym] || raise(Npmdc::Errors::UnknownFormatter, formatter: fmt)
18
23
  end
19
24
  end
20
25
  end
@@ -33,6 +33,20 @@ module Npmdc
33
33
  @output.puts "Checking #{type}:"
34
34
  end
35
35
 
36
+ def error_output(error)
37
+ banner = error.banner
38
+ case banner
39
+ when Array
40
+ error.banner.each do |message|
41
+ output(*message)
42
+ end
43
+ else
44
+ output(banner)
45
+ end
46
+ end
47
+
48
+ private
49
+
36
50
  def color_message(message, status = nil)
37
51
  if @disable_colorization || !status
38
52
  message
@@ -46,4 +60,4 @@ module Npmdc
46
60
  end
47
61
  end
48
62
  end
49
- end
63
+ end
data/lib/npmdc/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Npmdc
2
- VERSION = '0.2.5'
2
+ VERSION = '0.3.0'
3
3
  end
data/lib/npmdc.rb CHANGED
@@ -6,6 +6,11 @@ module Npmdc
6
6
  class << self
7
7
  def call(options = {})
8
8
  Npmdc::Checker.new(options).call
9
+
10
+ rescue Npmdc::Errors::ConfigurationError => e
11
+ Npmdc.config.output.puts e.banner
12
+
13
+ false
9
14
  end
10
15
 
11
16
  def config
data/npmdc.gemspec CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.required_ruby_version = '>= 2.2.2'
22
22
  spec.add_dependency 'thor', '> 0.18'
23
23
  spec.add_dependency 'colorize', '~> 0.8.1'
24
+ spec.add_dependency 'semantic_range', '~> 1.0'
24
25
  spec.add_development_dependency 'bundler', '~> 1.13'
25
26
  spec.add_development_dependency 'rake', '~> 10.0'
26
27
  spec.add_development_dependency 'rspec', '~> 3.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: npmdc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emil Kashkevich
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-06 00:00:00.000000000 Z
11
+ date: 2016-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.8.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: semantic_range
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement