rubocop-md 0.1.0.pre → 0.1.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/.gitignore +1 -0
- data/.rubocop.yml +3 -0
- data/.travis.yml +14 -2
- data/Gemfile +1 -1
- data/README.md +56 -3
- data/config/default.yml +3 -0
- data/gemfiles/rubocopmaster.gemfile +5 -0
- data/lib/rubocop/markdown/preprocess.rb +52 -40
- data/lib/rubocop/markdown/rubocop_ext.rb +22 -13
- data/lib/rubocop/markdown/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e46efefca545c73bc0fabdb88966fdb1894d9bf
|
4
|
+
data.tar.gz: 2f843d47ab0553f8595f0ef7233cc9095349c070
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e27a59d16c41ad2f3374d764b7172f3041a62e5c5c5809bdce88e644fe6d7f27c2e847123f398ec272f687bf797a4b130def0dbc4b9d3f5be19f2e343ff142a
|
7
|
+
data.tar.gz: 795ed0e01b160c7e5ac3ad18dfd50e39adcc96725e91bd210bec64e9008622f70d07f4536125900a794345a25c4979bbe89905ab5a4d8aa733779e62d4eb18f0
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
sudo: false
|
2
2
|
language: ruby
|
3
|
-
rvm:
|
4
|
-
- 2.4.2
|
5
3
|
before_install: gem install bundler -v 1.15.4
|
4
|
+
|
5
|
+
matrix:
|
6
|
+
fast_finish: true
|
7
|
+
include:
|
8
|
+
- rvm: ruby-head
|
9
|
+
gemfile: gemfiles/rubocopmaster.gemfile
|
10
|
+
- rvm: jruby-9.1.0.0
|
11
|
+
gemfile: Gemfile
|
12
|
+
- rvm: 2.4.2
|
13
|
+
gemfile: Gemfile
|
14
|
+
- rvm: 2.3.1
|
15
|
+
gemfile: Gemfile
|
16
|
+
- rvm: 2.2.0
|
17
|
+
gemfile: Gemfile
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,18 @@
|
|
1
|
-
|
1
|
+
[](http://badge.fury.io/rb/rubocop-md)
|
2
|
+
[](https://travis-ci.org/palkan/rubocop-md)
|
2
3
|
|
3
|
-
|
4
|
+
# Rubocop Markdown
|
4
5
|
|
6
|
+
Run Rubocop against your Markdown files to make sure that code examples follow style guidelines and have valid syntax.
|
7
|
+
|
8
|
+
## Features
|
9
|
+
|
10
|
+
- Analyzes code blocks within Markdown files
|
11
|
+
- Shows correct line numbers in output
|
12
|
+
- Preserves specified language (i.e., do not try to analyze "\`\`\`sh")
|
13
|
+
- **Supports autocorrect 📝**
|
14
|
+
|
15
|
+
This project was developed to keep [test-prof](https://github.com/palkan/test-prof) guides consistent with Ruby style guide.
|
5
16
|
|
6
17
|
## Installation
|
7
18
|
|
@@ -21,7 +32,49 @@ Or install it yourself as:
|
|
21
32
|
|
22
33
|
## Usage
|
23
34
|
|
24
|
-
|
35
|
+
### Command line
|
36
|
+
|
37
|
+
Just require `rubocop-md` in your command:
|
38
|
+
|
39
|
+
```sh
|
40
|
+
rubocop -r "rubocop-md" ./lib
|
41
|
+
```
|
42
|
+
|
43
|
+
Autocorrect works too:
|
44
|
+
|
45
|
+
```sh
|
46
|
+
rubocop -r "rubocop-md" -a ./lib
|
47
|
+
```
|
48
|
+
|
49
|
+
### Configuration file
|
50
|
+
|
51
|
+
First, add `rubocop-md` to your `.rubocop.yml`:
|
52
|
+
|
53
|
+
```yml
|
54
|
+
require:
|
55
|
+
- "rubocop-md"
|
56
|
+
```
|
57
|
+
|
58
|
+
Additional options:
|
59
|
+
|
60
|
+
```yml
|
61
|
+
# .rubocop.yml
|
62
|
+
Markdown:
|
63
|
+
# Whether to run RuboCop against non-valid snippets
|
64
|
+
WarnInvalid: true
|
65
|
+
```
|
66
|
+
|
67
|
+
## How it works?
|
68
|
+
|
69
|
+
- Preprocess Markdown source into Ruby source preserving line numbers
|
70
|
+
- Let RuboCop do its job
|
71
|
+
- Restore Markdown from preprocessed Ruby if it has been autocorrected
|
72
|
+
|
73
|
+
## Limitations
|
74
|
+
|
75
|
+
- RuboCop cache is disabled for Markdown files (because cache knows nothing about preprocessing)
|
76
|
+
- Uses naive Regexp-based approach to extract code blocks from Markdown, support only backticks-style code blocks
|
77
|
+
- No language detection included; if you do not specify language for your code blocks, you'd better turn `WarnInvalid` off (see above)
|
25
78
|
|
26
79
|
## Development
|
27
80
|
|
data/config/default.yml
CHANGED
@@ -4,7 +4,7 @@ module RuboCop
|
|
4
4
|
module Markdown
|
5
5
|
# Transform source Markdown file into valid Ruby file
|
6
6
|
# by commenting out all non-code lines
|
7
|
-
|
7
|
+
class Preprocess
|
8
8
|
# This is a regexp to extract code blocks from .md files.
|
9
9
|
#
|
10
10
|
# Only recognizes backticks-style code blocks.
|
@@ -45,31 +45,6 @@ module RuboCop
|
|
45
45
|
end
|
46
46
|
|
47
47
|
class << self
|
48
|
-
# rubocop:disable Metrics/MethodLength
|
49
|
-
def call(src)
|
50
|
-
parts = src.split(MD_REGEXP)
|
51
|
-
|
52
|
-
walker = Walker.new
|
53
|
-
|
54
|
-
parts.each do |part|
|
55
|
-
if walker.code_body?
|
56
|
-
next walker.next! if maybe_ruby?(@syntax) && valid_syntax?(part)
|
57
|
-
end
|
58
|
-
|
59
|
-
if walker.code_attr?
|
60
|
-
@syntax = part.gsub(/(^\s+|\s+$)/, "")
|
61
|
-
next walker.next!
|
62
|
-
end
|
63
|
-
|
64
|
-
comment_lines! part
|
65
|
-
|
66
|
-
walker.next!
|
67
|
-
end
|
68
|
-
|
69
|
-
parts.join
|
70
|
-
end
|
71
|
-
# rubocop:enable Metrics/MethodLength
|
72
|
-
|
73
48
|
# Revert preprocess changes.
|
74
49
|
#
|
75
50
|
# When autocorrect is applied, RuboCop re-writes the file
|
@@ -81,25 +56,62 @@ module RuboCop
|
|
81
56
|
contents.gsub!(/^##{MARKER}/m, "")
|
82
57
|
File.write(file, contents)
|
83
58
|
end
|
59
|
+
end
|
84
60
|
|
85
|
-
|
61
|
+
attr_reader :config
|
86
62
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
syntax.empty? || RUBY_TYPES.include?(syntax)
|
91
|
-
end
|
63
|
+
def initialize(file)
|
64
|
+
@config = Markdown.config_store.for(file)
|
65
|
+
end
|
92
66
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
67
|
+
# rubocop:disable Metrics/MethodLength
|
68
|
+
def call(src)
|
69
|
+
parts = src.split(MD_REGEXP)
|
70
|
+
|
71
|
+
walker = Walker.new
|
98
72
|
|
99
|
-
|
100
|
-
|
101
|
-
|
73
|
+
parts.each do |part|
|
74
|
+
if walker.code_body?
|
75
|
+
next walker.next! if maybe_ruby?(@syntax) && valid_syntax?(part)
|
76
|
+
end
|
77
|
+
|
78
|
+
if walker.code_attr?
|
79
|
+
@syntax = part.gsub(/(^\s+|\s+$)/, "")
|
80
|
+
next walker.next!
|
81
|
+
end
|
82
|
+
|
83
|
+
comment_lines! part
|
84
|
+
|
85
|
+
walker.next!
|
102
86
|
end
|
87
|
+
|
88
|
+
parts.join
|
89
|
+
end
|
90
|
+
# rubocop:enable Metrics/MethodLength
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
# Check codeblock attribute to prevent from parsing
|
95
|
+
# non-Ruby snippets and avoid false positives
|
96
|
+
def maybe_ruby?(syntax)
|
97
|
+
syntax.empty? || RUBY_TYPES.include?(syntax)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Try to parse with Ripper.
|
101
|
+
# Invalid Ruby (non-Ruby) code returns `nil`.
|
102
|
+
def valid_syntax?(src)
|
103
|
+
return true if warn_invalid?
|
104
|
+
!Ripper.sexp(src).nil?
|
105
|
+
end
|
106
|
+
|
107
|
+
# Where to show warning when snippet is not a valid Ruby
|
108
|
+
def warn_invalid?
|
109
|
+
config["Markdown"] && config["Markdown"].fetch("WarnInvalid", false)
|
110
|
+
end
|
111
|
+
|
112
|
+
def comment_lines!(src)
|
113
|
+
return if src =~ /\A\n\z/
|
114
|
+
src.gsub!(/^(.)/m, "##{MARKER}\\1")
|
103
115
|
end
|
104
116
|
end
|
105
117
|
end
|
@@ -2,19 +2,22 @@ module RuboCop
|
|
2
2
|
module Markdown # :nodoc:
|
3
3
|
MARKDOWN_EXTENSIONS = %w[.md .markdown].freeze
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
5
|
+
class << self
|
6
|
+
attr_accessor :config_store
|
7
|
+
# Merge markdown config into default configuration
|
8
|
+
# See https://github.com/backus/rubocop-rspec/blob/master/lib/rubocop/rspec/inject.rb
|
9
|
+
def inject!
|
10
|
+
path = CONFIG_DEFAULT.to_s
|
11
|
+
hash = ConfigLoader.send(:load_yaml_configuration, path)
|
12
|
+
config = Config.new(hash, path)
|
13
|
+
puts "configuration from #{path}" if ConfigLoader.debug?
|
14
|
+
config = ConfigLoader.merge_with_default(config, path)
|
15
|
+
ConfigLoader.instance_variable_set(:@default_configuration, config)
|
16
|
+
end
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
+
def markdown_file?(file)
|
19
|
+
MARKDOWN_EXTENSIONS.include?(File.extname(file))
|
20
|
+
end
|
18
21
|
end
|
19
22
|
end
|
20
23
|
end
|
@@ -22,6 +25,12 @@ end
|
|
22
25
|
RuboCop::Markdown.inject!
|
23
26
|
|
24
27
|
RuboCop::Runner.prepend(Module.new do
|
28
|
+
# Set config store for Markdown
|
29
|
+
def initialize(*)
|
30
|
+
super
|
31
|
+
RuboCop::Markdown.config_store = @config_store
|
32
|
+
end
|
33
|
+
|
25
34
|
# Do not cache markdown files, 'cause cache doesn't know about processing.
|
26
35
|
# NOTE: we should involve preprocessing in RuboCop::CachedData#deserialize_offenses
|
27
36
|
def file_offense_cache(file)
|
@@ -51,7 +60,7 @@ end)
|
|
51
60
|
RuboCop::ProcessedSource.prepend(Module.new do
|
52
61
|
def parse(src, *args)
|
53
62
|
# only process Markdown files
|
54
|
-
src = RuboCop::Markdown::Preprocess.call(src) if
|
63
|
+
src = RuboCop::Markdown::Preprocess.new(path).call(src) if
|
55
64
|
path.nil? || RuboCop::Markdown.markdown_file?(path)
|
56
65
|
super(src, *args)
|
57
66
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-md
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vladimir Dementyev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -84,6 +84,7 @@ files:
|
|
84
84
|
- Rakefile
|
85
85
|
- bin/setup
|
86
86
|
- config/default.yml
|
87
|
+
- gemfiles/rubocopmaster.gemfile
|
87
88
|
- lib/rubocop-md.rb
|
88
89
|
- lib/rubocop/markdown.rb
|
89
90
|
- lib/rubocop/markdown/preprocess.rb
|
@@ -105,9 +106,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
105
106
|
version: '0'
|
106
107
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
108
|
requirements:
|
108
|
-
- - "
|
109
|
+
- - ">="
|
109
110
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
111
|
+
version: '0'
|
111
112
|
requirements: []
|
112
113
|
rubyforge_project:
|
113
114
|
rubygems_version: 2.6.13
|