npmdc 0.2.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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