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 +4 -4
- data/.travis.yml +6 -6
- data/CHANGELOG.md +7 -0
- data/README.md +10 -8
- data/lib/npmdc/checker.rb +33 -22
- data/lib/npmdc/cli.rb +4 -3
- data/lib/npmdc/errors.rb +56 -5
- data/lib/npmdc/formatter.rb +7 -2
- data/lib/npmdc/formatters/base.rb +15 -1
- data/lib/npmdc/version.rb +1 -1
- data/lib/npmdc.rb +5 -0
- data/npmdc.gemspec +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: edf001bda970b1e162aeb42fb68139881f4c12ac
|
4
|
+
data.tar.gz: 0b05cecf21b35f46c54706f68d610d2bb6e4f4f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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
data/README.md
CHANGED
@@ -53,14 +53,16 @@ $ bundle exec npmdc [options]
|
|
53
53
|
|
54
54
|
_Options:_
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
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 [
|
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
|
33
|
-
|
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
|
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
|
77
|
-
|
78
|
-
|
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(
|
76
|
+
JSON.parse(File.read(path))
|
82
77
|
rescue JSON::ParserError
|
83
|
-
raise
|
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
|
-
|
98
|
-
|
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
|
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:
|
17
|
-
|
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
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
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
|
data/lib/npmdc/formatter.rb
CHANGED
@@ -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
|
-
|
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
data/lib/npmdc.rb
CHANGED
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.
|
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-
|
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
|