goodcheck 1.1.0 → 1.2.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: 655728b9b54f9f48689ab1537e36db901b6e0ce7
4
- data.tar.gz: 58b694b053b4fdf26c96c4b7369d87fffdac05cb
3
+ metadata.gz: 1a38825ec6d8bc5b187a12a85f2ef8247e97b3d1
4
+ data.tar.gz: 533593b7f064c57417e2719e9831595d4de5f896
5
5
  SHA512:
6
- metadata.gz: 3241668c77b0b0fcea6a1bf1db06002a2e4df90a91c1bab4013fc15fbb51d65a036e5da91a8e6938019aa59ff3552eb2d13f79b2bf533067d6e04cf62e5f3f8d
7
- data.tar.gz: b5d60bbef44eef2f3c97b23dbcd8ae8f7cf4d2203dcdad431e86e675c9c123170ad79cba50e926c52a43c3e21e4f744d10d64a2c6397c8c9bea3f8ff499879b9
6
+ metadata.gz: b6bfeb6c399bcb7ea16c66e2a285c556b5838ef976328512ad773bc8e51a32b9551829551026389db4f2ab89ff9679d2fe59fcf6fbe394ece71524082f702dcd
7
+ data.tar.gz: 7ba0ded6e4fc1d395ef14012ecc399853a65751357d54a22c5f2b4e8e6b4f63bc47f0a727d82ea8c571ef8da20fa2969b47763260cdf823083531742ddf7f09f
@@ -2,7 +2,12 @@
2
2
 
3
3
  ## master
4
4
 
5
- ## 1.1.0 (2018-06-16)
5
+ ## 1.2.0 (2018-06-29)
6
+
7
+ * `case_insensitive` option is now renamed to `case_sensitive`. #4
8
+ * Return analysis JSON object from JSON reporter. #13 (@aergonaut)
9
+
10
+ ## 1.1.0 (2018-05-16)
6
11
 
7
12
  * Support `{}` syntax in glob. #11
8
13
  * Add `case_insensitive` option for `token` pattern. #10
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- goodcheck (1.1.0)
4
+ goodcheck (1.2.0)
5
5
  activesupport (~> 5.0)
6
6
  rainbow (~> 3.0.0)
7
7
  strong_json (~> 0.5.0)
@@ -35,4 +35,4 @@ DEPENDENCIES
35
35
  rake (~> 10.0)
36
36
 
37
37
  BUNDLED WITH
38
- 1.16.0
38
+ 1.16.2
data/README.md CHANGED
@@ -71,7 +71,7 @@ The *rule* hash contains the following keys.
71
71
  ### *pattern*
72
72
 
73
73
  A *pattern* can be a *literal pattern*, *regexp pattern*, *token pattern*, or a string.
74
- When a string is given, it is interpreted as a *literal pattern* with `case_insensitive: false`.
74
+ When a string is given, it is interpreted as a *literal pattern* with `case_sensitive: true`.
75
75
 
76
76
  #### *literal pattern*
77
77
 
@@ -81,12 +81,12 @@ When a string is given, it is interpreted as a *literal pattern* with `case_inse
81
81
  id: com.sample.GitHub
82
82
  pattern:
83
83
  literal: Github
84
- case_insensitive: false
84
+ case_sensitive: true
85
85
  message: Write GitHub, not Github
86
86
  ```
87
87
 
88
88
  All regexp meta characters included in the `literal` value will be escaped.
89
- `case_insensitive` is an optional key and the default is `false`.
89
+ `case_sensitive` is an optional key and the default is `true`.
90
90
 
91
91
  #### *regexp pattern*
92
92
 
@@ -96,15 +96,15 @@ All regexp meta characters included in the `literal` value will be escaped.
96
96
  id: com.sample.digits
97
97
  pattern:
98
98
  regexp: \d{4,}
99
- case_insensitive: true
99
+ case_sensitive: false
100
100
  multiline: false
101
101
  message: Insert delimiters when writing large numbers
102
102
  justification:
103
103
  - When you are not writing numbers, including phone numbers, zip code, ...
104
104
  ```
105
105
 
106
- It accepts two optional attributes, `case_insensitive` and `multiline`.
107
- The default values of `case_insensitive` and `multiline` are `false`.
106
+ It accepts two optional attributes, `case_sensitive` and `multiline`.
107
+ The default values of `case_sensitive` and `multiline` are `true` and `false` respectively.
108
108
 
109
109
  The regexp will be passed to `Regexp.compile`.
110
110
  The precise definition of regular expression can be found in the documentation for Ruby.
@@ -117,7 +117,7 @@ The precise definition of regular expression can be found in the documentation f
117
117
  id: com.sample.no-blink
118
118
  pattern:
119
119
  token: "<blink"
120
- case_insensitive: true
120
+ case_sensitive: false
121
121
  message: Stop using <blink> tag
122
122
  glob: "**/*.html"
123
123
  justifications:
@@ -131,8 +131,8 @@ In that case, try using *regexp pattern*.
131
131
  The generated regexp of `<blink` is `<\s*blink\b`.
132
132
  It matches with `<blink />` and `< BLINK>`, but does not match with `https://www.chromium.org/blink`.
133
133
 
134
- It accepts one optional attribute, `case_insensitive`.
135
- The default value of `case_insensitive` is `false`.
134
+ It accepts one optional attribute, `case_sensitive`.
135
+ The default value of `case_sensitive` is `true`.
136
136
 
137
137
  ### *glob*
138
138
 
@@ -18,7 +18,6 @@ require "goodcheck/array_helper"
18
18
  require "goodcheck/analyzer"
19
19
  require "goodcheck/issue"
20
20
  require "goodcheck/rule"
21
- require "goodcheck/matcher"
22
21
  require "goodcheck/pattern"
23
22
  require "goodcheck/config"
24
23
  require "goodcheck/config_loader"
@@ -5,7 +5,7 @@ module Goodcheck
5
5
 
6
6
  def load_config!
7
7
  content = JSON.parse(JSON.dump(YAML.load(config_path.read, config_path.to_s)), symbolize_names: true)
8
- loader = ConfigLoader.new(path: config_path, content: content)
8
+ loader = ConfigLoader.new(path: config_path, content: content, stderr: stderr)
9
9
  @config = loader.load
10
10
  end
11
11
  end
@@ -5,10 +5,17 @@ module Goodcheck
5
5
  class InvalidPattern < StandardError; end
6
6
 
7
7
  Schema = StrongJSON.new do
8
- let :regexp_pattern, object(regexp: string, case_insensitive: boolean?, multiline: boolean?)
9
- let :literal_pattern, object(literal: string, case_insensitive: boolean?)
10
- let :token_pattern, object(token: string, case_insensitive: boolean?)
11
- let :pattern, enum(regexp_pattern, literal_pattern, token_pattern, string)
8
+ let :deprecated_regexp_pattern, object(regexp: string, case_insensitive: boolean?, multiline: boolean?)
9
+ let :deprecated_literal_pattern, object(literal: string, case_insensitive: boolean?)
10
+ let :deprecated_token_pattern, object(token: string, case_insensitive: boolean?)
11
+
12
+ let :regexp_pattern, object(regexp: string, case_sensitive: boolean?, multiline: boolean?)
13
+ let :literal_pattern, object(literal: string, case_sensitive: boolean?)
14
+ let :token_pattern, object(token: string, case_sensitive: boolean?)
15
+
16
+ let :pattern, enum(regexp_pattern, literal_pattern, token_pattern,
17
+ deprecated_regexp_pattern, deprecated_literal_pattern, deprecated_token_pattern,
18
+ string)
12
19
 
13
20
  let :encoding, enum(*Encoding.name_list.map {|name| literal(name) })
14
21
  let :glob, object(pattern: string, encoding: optional(encoding))
@@ -30,10 +37,14 @@ module Goodcheck
30
37
 
31
38
  attr_reader :path
32
39
  attr_reader :content
40
+ attr_reader :stderr
41
+ attr_reader :printed_warnings
33
42
 
34
- def initialize(path:, content:)
43
+ def initialize(path:, content:, stderr:)
35
44
  @path = path
36
45
  @content = content
46
+ @stderr = stderr
47
+ @printed_warnings = Set.new
37
48
  end
38
49
 
39
50
  def load
@@ -68,24 +79,43 @@ module Goodcheck
68
79
  def load_pattern(pattern)
69
80
  case pattern
70
81
  when String
71
- Pattern.literal(pattern, case_insensitive: false)
82
+ Pattern.literal(pattern, case_sensitive: true)
72
83
  when Hash
73
84
  case
74
85
  when pattern[:literal]
75
- ci = pattern[:case_insensitive]
86
+ cs = case_sensitive?(pattern)
76
87
  literal = pattern[:literal]
77
- Pattern.literal(literal, case_insensitive: ci)
88
+ Pattern.literal(literal, case_sensitive: cs)
78
89
  when pattern[:regexp]
79
90
  regexp = pattern[:regexp]
80
- ci = pattern[:case_insensitive]
91
+ cs = case_sensitive?(pattern)
81
92
  multiline = pattern[:multiline]
82
- Pattern.regexp(regexp, case_insensitive: ci, multiline: multiline)
93
+ Pattern.regexp(regexp, case_sensitive: cs, multiline: multiline)
83
94
  when pattern[:token]
84
95
  tok = pattern[:token]
85
- ci = pattern[:case_insensitive]
86
- Pattern.token(tok, case_insensitive: ci)
96
+ cs = case_sensitive?(pattern)
97
+ Pattern.token(tok, case_sensitive: cs)
87
98
  end
88
99
  end
89
100
  end
101
+
102
+ def case_sensitive?(pattern)
103
+ case
104
+ when pattern.key?(:case_sensitive)
105
+ pattern[:case_sensitive]
106
+ when pattern.key?(:case_insensitive)
107
+ print_warning_once "👻 `case_insensitive` option is deprecated. Use `case_sensitive` option instead."
108
+ !pattern[:case_insensitive]
109
+ else
110
+ true
111
+ end
112
+ end
113
+
114
+ def print_warning_once(message)
115
+ unless printed_warnings.include?(message)
116
+ stderr.puts "[Warning] " + message
117
+ printed_warnings << message
118
+ end
119
+ end
90
120
  end
91
121
  end
@@ -8,23 +8,23 @@ module Goodcheck
8
8
  @regexp = regexp
9
9
  end
10
10
 
11
- def self.literal(literal, case_insensitive:)
12
- new(source: literal, regexp: Regexp.compile(Regexp.escape(literal), case_insensitive))
11
+ def self.literal(literal, case_sensitive:)
12
+ new(source: literal, regexp: Regexp.compile(Regexp.escape(literal), !case_sensitive))
13
13
  end
14
14
 
15
- def self.regexp(regexp, case_insensitive:, multiline:)
15
+ def self.regexp(regexp, case_sensitive:, multiline:)
16
16
  options = 0
17
- options |= Regexp::IGNORECASE if case_insensitive
17
+ options |= Regexp::IGNORECASE unless case_sensitive
18
18
  options |= Regexp::MULTILINE if multiline
19
19
 
20
20
  new(source: regexp, regexp: Regexp.compile(regexp, options))
21
21
  end
22
22
 
23
- def self.token(tokens, case_insensitive:)
24
- new(source: tokens, regexp: compile_tokens(tokens, case_insensitive: case_insensitive))
23
+ def self.token(tokens, case_sensitive:)
24
+ new(source: tokens, regexp: compile_tokens(tokens, case_sensitive: case_sensitive))
25
25
  end
26
26
 
27
- def self.compile_tokens(source, case_insensitive:)
27
+ def self.compile_tokens(source, case_sensitive:)
28
28
  tokens = []
29
29
  s = StringScanner.new(source)
30
30
 
@@ -52,7 +52,7 @@ module Goodcheck
52
52
  end
53
53
 
54
54
  options = Regexp::MULTILINE
55
- options |= Regexp::IGNORECASE if case_insensitive
55
+ options |= Regexp::IGNORECASE unless case_sensitive
56
56
 
57
57
  Regexp.new(tokens.join('\s*').gsub(/\\s\*(\\s\+\\s\*)+/, '\s+'), options)
58
58
  end
@@ -30,6 +30,7 @@ module Goodcheck
30
30
  }
31
31
  end
32
32
  stdout.puts ::JSON.dump(json)
33
+ json
33
34
  end
34
35
 
35
36
  def file(path)
@@ -1,3 +1,3 @@
1
1
  module Goodcheck
2
- VERSION = "1.1.0"
2
+ VERSION = "1.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: goodcheck
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Soutaro Matsumoto
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-16 00:00:00.000000000 Z
11
+ date: 2018-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -129,7 +129,6 @@ files:
129
129
  - lib/goodcheck/glob.rb
130
130
  - lib/goodcheck/issue.rb
131
131
  - lib/goodcheck/location.rb
132
- - lib/goodcheck/matcher.rb
133
132
  - lib/goodcheck/pattern.rb
134
133
  - lib/goodcheck/reporters/json.rb
135
134
  - lib/goodcheck/reporters/text.rb
@@ -155,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
154
  version: '0'
156
155
  requirements: []
157
156
  rubyforge_project:
158
- rubygems_version: 2.6.8
157
+ rubygems_version: 2.6.14.1
159
158
  signing_key:
160
159
  specification_version: 4
161
160
  summary: Regexp based customizable linter
@@ -1,21 +0,0 @@
1
- module Goodcheck
2
- class Matcher
3
- attr_reader :path
4
- attr_reader :src
5
- attr_reader :rule
6
-
7
- def initialize(path:, src:, rule:)
8
- @path = path
9
- @src = src
10
- @rule = rule
11
- end
12
-
13
- def each
14
- if block_given?
15
-
16
- else
17
- enum_for :each
18
- end
19
- end
20
- end
21
- end