danger-prose 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/Gemfile.lock +4 -2
- data/Guardfile +2 -2
- data/README.md +38 -10
- data/Rakefile +1 -9
- data/danger-prose.gemspec +13 -11
- data/lib/danger_plugin.rb +145 -29
- data/lib/proselintrc +82 -0
- data/lib/version.rb +1 -1
- data/spec/danger_plugin_spec.rb +83 -38
- data/spec/fixtures/blog_post.md +4 -1
- data/spec/spec_helper.rb +9 -9
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cbe1a62aa5863906f879c31de1e4a73bc60cba7d
|
4
|
+
data.tar.gz: 4374a4456fcefe699660edf4ad3dcde8fbe2911e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4dbb3ac28eeff44f3c1d7ba4f374011520b81d8aa2b7ef199ea0f9e075c396dc706ebfb1727cef203cf87dc3e21674fea0f4765b535d56155140f2dff9235419
|
7
|
+
data.tar.gz: 1e5a007df22b038d54b87a6919f3693a3a89d3609680bd59ca5b561b2ba515b467a4074c44ce485c6a3ec58ed6d4caac03a265137f2e75472274f3cad1a51655
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
danger-prose (0.0
|
4
|
+
danger-prose (2.0.0)
|
5
5
|
danger
|
6
6
|
|
7
7
|
GEM
|
@@ -14,7 +14,7 @@ GEM
|
|
14
14
|
colored (1.2)
|
15
15
|
cork (0.1.0)
|
16
16
|
colored (~> 1.2)
|
17
|
-
danger (0.8.
|
17
|
+
danger (0.8.5)
|
18
18
|
claide (~> 1.0)
|
19
19
|
colored (~> 1.2)
|
20
20
|
cork (~> 0.1)
|
@@ -91,6 +91,7 @@ GEM
|
|
91
91
|
slop (3.6.0)
|
92
92
|
terminal-table (1.6.0)
|
93
93
|
thor (0.19.1)
|
94
|
+
yard (0.8.7.6)
|
94
95
|
|
95
96
|
PLATFORMS
|
96
97
|
ruby
|
@@ -108,6 +109,7 @@ DEPENDENCIES
|
|
108
109
|
pry
|
109
110
|
rake (~> 10.0)
|
110
111
|
rspec (~> 3.4)
|
112
|
+
yard (~> 0.8)
|
111
113
|
|
112
114
|
BUNDLED WITH
|
113
115
|
1.12.5
|
data/Guardfile
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
|
4
4
|
# To run, use `bundle exec guard`.
|
5
5
|
|
6
|
-
guard :rspec, cmd:
|
7
|
-
require
|
6
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
7
|
+
require 'guard/rspec/dsl'
|
8
8
|
dsl = Guard::RSpec::Dsl.new(self)
|
9
9
|
|
10
10
|
# Feel free to open issues for suggestions and improvements
|
data/README.md
CHANGED
@@ -6,16 +6,44 @@ A description of danger-proselint.
|
|
6
6
|
|
7
7
|
$ gem install danger-proselint
|
8
8
|
|
9
|
-
## Usage
|
10
9
|
|
11
|
-
Add it to your Dangerfile
|
12
10
|
|
13
|
-
|
14
|
-
# Look through all changed Markdown files
|
15
|
-
markdown_files = (modified_files + added_files).select do |line|
|
16
|
-
line.start_with?("_posts") && (line.end_with?(".markdown") || line.end_with?(".md"))
|
17
|
-
end
|
11
|
+
### prose
|
18
12
|
|
19
|
-
|
20
|
-
proselint.
|
21
|
-
|
13
|
+
Lint markdown files inside your projects.
|
14
|
+
This is done using the [proselint](http://proselint.com) python egg.
|
15
|
+
Results are passed out as a table in markdown.
|
16
|
+
|
17
|
+
<blockquote>Specifying custom CocoaPods installation options
|
18
|
+
<pre>
|
19
|
+
# Runs a linter with comma style disabled
|
20
|
+
proselint.disable_linters = ["misc.scare_quotes", "misc.tense_present"]
|
21
|
+
proselint.lint_files "_posts/*.md"
|
22
|
+
|
23
|
+
# Runs a linter with all styles, on modified and added markdown files in this PR
|
24
|
+
proselint.lint_files</pre>
|
25
|
+
</blockquote>
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
#### Attributes
|
30
|
+
<tr>
|
31
|
+
`disable_linters` - Allows you to disable a collection of linters from running. Doesn't work yet.
|
32
|
+
You can get a list of [them here](https://github.com/amperser/proselint#checks)
|
33
|
+
defaults to `["misc.scare_quotes", "typography.symbols"]` when it's nil.
|
34
|
+
<tr>
|
35
|
+
`ignored_words` - Allows you to add a collection of words to skip in spellchecking.
|
36
|
+
defaults to `[""]` when it's nil.
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
#### Methods
|
41
|
+
|
42
|
+
`lint_files` - Lints the globbed markdown files. Will fail if `proselint` cannot be installed correctly.
|
43
|
+
Generates a `markdown` list of warnings for the prose in a corpus of .markdown and .md files.
|
44
|
+
|
45
|
+
`proselint_installed?` - Determine if proselint is currently installed in the system paths.
|
46
|
+
|
47
|
+
`mdspell_installed?` - Determine if mdspell is currently installed in the system paths.
|
48
|
+
|
49
|
+
`check_spelling` - Runs a markdown-specific spell checker, against a corpus of `.markdown` and `.md` files.
|
data/Rakefile
CHANGED
data/danger-prose.gemspec
CHANGED
@@ -8,35 +8,37 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = DangerProse::VERSION
|
9
9
|
spec.authors = ['David Grandinetti', 'Orta Therox']
|
10
10
|
spec.email = ['dbgrandi@gmail.com', 'orta.therox@gmail.com']
|
11
|
-
spec.description =
|
12
|
-
spec.summary =
|
11
|
+
spec.description = 'A danger plugin for working with bodies of markdown prose.'
|
12
|
+
spec.summary = 'A danger plugin for working with bodies of markdown prose.'
|
13
13
|
spec.homepage = 'https://github.com/dbgrandi/danger-prose'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
16
|
-
spec.files = `git ls-files`.split(
|
16
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
18
|
spec.require_paths = ['lib']
|
19
19
|
|
20
20
|
spec.add_dependency 'danger'
|
21
21
|
|
22
|
+
# Let's you test your plugin via the linter
|
23
|
+
spec.add_development_dependency "yard", '~> 0.8'
|
24
|
+
|
22
25
|
# General ruby development
|
23
26
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
24
27
|
spec.add_development_dependency 'rake', '~> 10.0'
|
25
28
|
|
26
29
|
# Testing support
|
27
|
-
spec.add_development_dependency
|
30
|
+
spec.add_development_dependency 'rspec', '~> 3.4'
|
28
31
|
|
29
32
|
# Makes testing easy via `bundle exec guard`
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
32
|
-
|
33
|
+
spec.add_development_dependency 'guard', '~> 2.14'
|
34
|
+
spec.add_development_dependency 'guard-rspec', '~> 4.7'
|
35
|
+
|
33
36
|
# If you want to work on older builds of ruby
|
34
|
-
spec.add_development_dependency
|
37
|
+
spec.add_development_dependency 'listen', '3.0.7'
|
35
38
|
|
36
39
|
# This gives you the chance to run a REPL inside your test
|
37
|
-
# via
|
40
|
+
# via
|
38
41
|
# binding.pry
|
39
42
|
# This will stop test execution and let you inspect the results
|
40
|
-
spec.add_development_dependency
|
41
|
-
|
43
|
+
spec.add_development_dependency 'pry'
|
42
44
|
end
|
data/lib/danger_plugin.rb
CHANGED
@@ -1,72 +1,82 @@
|
|
1
|
-
|
1
|
+
require 'json'
|
2
2
|
|
3
|
+
module Danger
|
3
4
|
# Lint markdown files inside your projects.
|
4
5
|
# This is done using the [proselint](http://proselint.com) python egg.
|
5
6
|
# Results are passed out as a table in markdown.
|
6
7
|
#
|
7
|
-
# @example
|
8
|
+
# @example Running linter with custom disabled linters
|
9
|
+
#
|
10
|
+
# # Runs a linter with comma style and tense present disabled
|
11
|
+
# prose.disable_linters = ["misc.scare_quotes", "misc.tense_present"]
|
12
|
+
# prose.lint_files "_posts/*.md"
|
13
|
+
#
|
14
|
+
# @example Running linter with default linters
|
15
|
+
#
|
16
|
+
# # Runs a linter with all styles, on modified and added markdown files in this PR
|
17
|
+
# prose.lint_files
|
18
|
+
#
|
19
|
+
# @example Running the spell checker
|
20
|
+
#
|
21
|
+
# # Runs a spell checker on all files in `_post`
|
22
|
+
# prose.check_spelling "_posts/*.md"
|
8
23
|
#
|
9
|
-
#
|
10
|
-
# proselint.disable_linters = [“misc.scare_quotes”, "misc.tense_present"]
|
11
|
-
# proselint.lint_files “_posts/*.md”
|
24
|
+
# @example Running the spell checker, with some words whitelisted
|
12
25
|
#
|
13
|
-
#
|
14
|
-
#
|
26
|
+
# prose.ignored_words = ["orta", "artsy"]
|
27
|
+
# prose.lint_files
|
15
28
|
#
|
16
29
|
# @see artsy/artsy.github.io
|
17
30
|
# @tags blogging, blog, writing, jekyll, middleman, hugo, metalsmith, gatsby, express
|
18
31
|
#
|
19
32
|
class DangerProse < Plugin
|
20
|
-
|
21
|
-
# Allows you to disable a collection of linters from being ran.
|
33
|
+
# Allows you to disable a collection of linters from running. Doesn't work yet.
|
22
34
|
# You can get a list of [them here](https://github.com/amperser/proselint#checks)
|
35
|
+
# defaults to `["misc.scare_quotes", "typography.symbols"]` when it's nil.
|
36
|
+
#
|
37
|
+
# @return [Array<String>]
|
23
38
|
attr_accessor :disable_linters
|
24
39
|
|
25
|
-
# Lints the globbed files
|
26
|
-
# Generates a `markdown` list of warnings for the prose in a corpus of .markdown and .md files.
|
40
|
+
# Lints the globbed markdown files. Will fail if `proselint` cannot be installed correctly.
|
41
|
+
# Generates a `markdown` list of warnings for the prose in a corpus of .markdown and .md files.
|
27
42
|
#
|
28
43
|
# @param [String] files
|
29
44
|
# A globbed string which should return the files that you want to lint, defaults to nil.
|
30
45
|
# if nil, modified and added files from the diff will be used.
|
31
46
|
# @return [void]
|
32
47
|
#
|
33
|
-
def lint_files(files=nil)
|
48
|
+
def lint_files(files = nil)
|
34
49
|
# Installs a prose checker if needed
|
35
|
-
system
|
50
|
+
system 'pip install --user proselint' unless proselint_installed?
|
36
51
|
|
37
52
|
# Check that this is in the user's PATH after installing
|
38
|
-
unless proselint_installed?
|
39
|
-
fail "proselint is not in the user's PATH, or it failed to install"
|
40
|
-
return
|
41
|
-
end
|
53
|
+
raise "proselint is not in the user's PATH, or it failed to install" unless proselint_installed?
|
42
54
|
|
43
55
|
# Either use files provided, or use the modified + added
|
44
|
-
markdown_files =
|
45
|
-
markdown_files.select! do |line| (line.end_with?(".markdown") || line.end_with?(".md")) end
|
46
|
-
|
47
|
-
# TODO create the disabled linters JSON in ~/.proselintrc
|
48
|
-
# using @disable_linter
|
56
|
+
markdown_files = get_files files
|
49
57
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
58
|
+
proses = {}
|
59
|
+
to_disable = disable_linters || ["misc.scare_quotes", "typography.symbols"]
|
60
|
+
with_proselint_disabled(to_disable) do
|
61
|
+
# Convert paths to proselint results
|
62
|
+
result_jsons = Hash[markdown_files.uniq.collect { |v| [v, get_proselint_json(v)] }]
|
63
|
+
proses = result_jsons.select { |_, prose| prose['data']['errors'].count }
|
64
|
+
end
|
54
65
|
|
55
66
|
# Get some metadata about the local setup
|
56
|
-
current_branch = env.request_source.pr_json["head"]["ref"]
|
57
67
|
current_slug = env.ci_source.repo_slug
|
58
68
|
|
59
69
|
# We got some error reports back from proselint
|
60
70
|
if proses.count > 0
|
61
71
|
message = "### Proselint found issues\n\n"
|
62
72
|
proses.each do |path, prose|
|
63
|
-
github_loc = "/#{current_slug}/tree/#{
|
73
|
+
github_loc = "/#{current_slug}/tree/#{github.branch_for_head}/#{path}"
|
64
74
|
message << "#### [#{path}](#{github_loc})\n\n"
|
65
75
|
|
66
76
|
message << "Line | Message | Severity |\n"
|
67
77
|
message << "| --- | ----- | ----- |\n"
|
68
78
|
|
69
|
-
prose[
|
79
|
+
prose['data']['errors'].each do |error|
|
70
80
|
message << "#{error['line']} | #{error['message']} | #{error['severity']}\n"
|
71
81
|
end
|
72
82
|
end
|
@@ -81,5 +91,111 @@ module Danger
|
|
81
91
|
def proselint_installed?
|
82
92
|
`which proselint`.strip.empty? == false
|
83
93
|
end
|
94
|
+
|
95
|
+
# Determine if mdspell is currently installed in the system paths.
|
96
|
+
# @return [Bool]
|
97
|
+
#
|
98
|
+
def mdspell_installed?
|
99
|
+
`which mdspell`.strip.empty? == false
|
100
|
+
end
|
101
|
+
|
102
|
+
# Allows you to add a collection of words to skip in spellchecking.
|
103
|
+
# defaults to `[""]` when it's nil.
|
104
|
+
# @return [Array<String>]
|
105
|
+
attr_accessor :ignored_words
|
106
|
+
|
107
|
+
# Runs a markdown-specific spell checker, against a corpus of `.markdown` and `.md` files.
|
108
|
+
#
|
109
|
+
# @param [String] files
|
110
|
+
# A globbed string which should return the files that you want to spell check, defaults to nil.
|
111
|
+
# if nil, modified and added files from the diff will be used.
|
112
|
+
# @return [void]
|
113
|
+
#
|
114
|
+
def check_spelling(files = nil)
|
115
|
+
# Installs my fork of the spell checker if needed
|
116
|
+
# my fork has line numbers + indexes
|
117
|
+
system "npm install -g orta/node-markdown-spellcheck" unless mdspell_installed?
|
118
|
+
|
119
|
+
# Check that this is in the user's PATH after installing
|
120
|
+
raise "mdspell is not in the user's PATH, or it failed to install" unless mdspell_installed?
|
121
|
+
|
122
|
+
markdown_files = get_files files
|
123
|
+
|
124
|
+
skip_words = ignored_words || []
|
125
|
+
File.write(".spelling", skip_words.join("\n"))
|
126
|
+
result_texts = Hash[markdown_files.uniq.collect { |md| [md, `mdspell #{md} -r`.strip] }]
|
127
|
+
spell_issues = result_texts.select { |path, output| output.include? "spelling errors found" }
|
128
|
+
File.unlink(".spelling")
|
129
|
+
|
130
|
+
# Get some metadata about the local setup
|
131
|
+
current_slug = env.ci_source.repo_slug
|
132
|
+
|
133
|
+
if spell_issues.count > 0
|
134
|
+
message = "### Spell Checker found issues\n\n"
|
135
|
+
spell_issues.each do |path, output|
|
136
|
+
github_loc = "/#{current_slug}/tree/#{github.branch_for_head}/#{path}"
|
137
|
+
message << "#### [#{path}](#{github_loc})\n\n"
|
138
|
+
|
139
|
+
message << "Line | Typo |\n"
|
140
|
+
message << "| --- | ------ |\n"
|
141
|
+
|
142
|
+
output.lines[1..-3].each do |line|
|
143
|
+
index_info = line.strip.split("|").first
|
144
|
+
index_line, index = index_info.split(":").map { |n| n.to_i }
|
145
|
+
|
146
|
+
file = File.read(path)
|
147
|
+
|
148
|
+
unknown_word = file[index..-1].split(" ").first
|
149
|
+
|
150
|
+
error_text = line.strip.split("|")[1..-1].join("|").strip
|
151
|
+
error = error_text.gsub(unknown_word, "**" + unknown_word + "**")
|
152
|
+
|
153
|
+
message << "#{index_line} | #{error} | \n"
|
154
|
+
end
|
155
|
+
markdown message
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
private
|
161
|
+
# Creates a temporary proselint settings file
|
162
|
+
# @return void
|
163
|
+
#
|
164
|
+
def with_proselint_disabled(disable_linters)
|
165
|
+
# Create the disabled linters JSON in ~/.proselintrc
|
166
|
+
proselint_template = File.join(File.dirname(__FILE__), 'proselintrc')
|
167
|
+
proselintJSON = JSON.parse(File.read(proselint_template))
|
168
|
+
|
169
|
+
# Disable individual linters
|
170
|
+
disable_linters.each do |linter|
|
171
|
+
proselintJSON['checks'][linter] = false
|
172
|
+
end
|
173
|
+
|
174
|
+
# Re-save the new JSON into the home dir
|
175
|
+
temp_proselint_rc_path = File.join(Dir.home, '.proselintrc')
|
176
|
+
File.write(temp_proselint_rc_path, JSON.pretty_generate(proselintJSON))
|
177
|
+
|
178
|
+
# Run the closure
|
179
|
+
yield
|
180
|
+
|
181
|
+
# Delete .proselintrc
|
182
|
+
File.unlink temp_proselint_rc_path
|
183
|
+
end
|
184
|
+
|
185
|
+
def get_files files
|
186
|
+
# Either use files provided, or use the modified + added
|
187
|
+
markdown_files = files ? Dir.glob(files) : (git.modified_files + git.added_files)
|
188
|
+
markdown_files.select { |line| line.end_with? '.markdown', '.md' }
|
189
|
+
end
|
190
|
+
|
191
|
+
# Always returns a hash, regardless of whether the command gives JSON, weird data, or no response
|
192
|
+
def get_proselint_json path
|
193
|
+
json = `proselint "#{path}" --json`.strip
|
194
|
+
if json[0] == "{" and json[-1] == "}"
|
195
|
+
JSON.parse json
|
196
|
+
else
|
197
|
+
{}
|
198
|
+
end
|
199
|
+
end
|
84
200
|
end
|
85
201
|
end
|
data/lib/proselintrc
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
{
|
2
|
+
"max_errors": 1000,
|
3
|
+
"checks": {
|
4
|
+
"airlinese.misc" : true,
|
5
|
+
"annotations.misc" : true,
|
6
|
+
"archaism.misc" : true,
|
7
|
+
"cliches.hell" : true,
|
8
|
+
"cliches.misc" : true,
|
9
|
+
"consistency.spacing" : true,
|
10
|
+
"consistency.spelling" : true,
|
11
|
+
"corporate_speak.misc" : true,
|
12
|
+
"cursing.filth" : true,
|
13
|
+
"cursing.nfl" : false,
|
14
|
+
"cursing.nword" : true,
|
15
|
+
"dates_times.am_pm" : true,
|
16
|
+
"dates_times.dates" : true,
|
17
|
+
"hedging.misc" : true,
|
18
|
+
"hyperbole.misc" : true,
|
19
|
+
"jargon.misc" : true,
|
20
|
+
"lexical_illusions.misc" : true,
|
21
|
+
"links.broken" : false,
|
22
|
+
"malapropisms.misc" : true,
|
23
|
+
"misc.apologizing" : true,
|
24
|
+
"misc.back_formations" : true,
|
25
|
+
"misc.bureaucratese" : true,
|
26
|
+
"misc.but" : true,
|
27
|
+
"misc.capitalization" : true,
|
28
|
+
"misc.chatspeak" : true,
|
29
|
+
"misc.commercialese" : true,
|
30
|
+
"misc.composition" : true,
|
31
|
+
"misc.currency" : true,
|
32
|
+
"misc.debased" : true,
|
33
|
+
"misc.false_plurals" : true,
|
34
|
+
"misc.illogic" : true,
|
35
|
+
"misc.inferior_superior" : true,
|
36
|
+
"misc.latin" : true,
|
37
|
+
"misc.many_a" : true,
|
38
|
+
"misc.metaconcepts" : true,
|
39
|
+
"misc.metadiscourse" : true,
|
40
|
+
"misc.narcisissm" : true,
|
41
|
+
"misc.not_guilty" : true,
|
42
|
+
"misc.phrasal_adjectives" : true,
|
43
|
+
"misc.preferred_forms" : true,
|
44
|
+
"misc.pretension" : true,
|
45
|
+
"misc.professions" : true,
|
46
|
+
"misc.punctuation" : true,
|
47
|
+
"misc.scare_quotes" : true,
|
48
|
+
"misc.suddenly" : true,
|
49
|
+
"misc.tense_present" : true,
|
50
|
+
"misc.waxed" : true,
|
51
|
+
"misc.whence" : true,
|
52
|
+
"mixed_metaphors.misc" : true,
|
53
|
+
"mondegreens.misc" : true,
|
54
|
+
"needless_variants.misc" : true,
|
55
|
+
"nonwords.misc" : true,
|
56
|
+
"oxymorons.misc" : true,
|
57
|
+
"psychology.misc" : true,
|
58
|
+
"redundancy.misc" : true,
|
59
|
+
"redundancy.ras_syndrome" : true,
|
60
|
+
"skunked_terms.misc" : true,
|
61
|
+
"spelling.able_atable" : true,
|
62
|
+
"spelling.able_ible" : true,
|
63
|
+
"spelling.athletes" : true,
|
64
|
+
"spelling.em_im_en_in" : true,
|
65
|
+
"spelling.er_or" : true,
|
66
|
+
"spelling.in_un" : true,
|
67
|
+
"spelling.misc" : true,
|
68
|
+
"security.credit_card" : true,
|
69
|
+
"security.password" : true,
|
70
|
+
"sexism.misc" : true,
|
71
|
+
"terms.animal_adjectives" : true,
|
72
|
+
"terms.denizen_labels" : true,
|
73
|
+
"terms.eponymous_adjectives" : true,
|
74
|
+
"terms.venery" : true,
|
75
|
+
"typography.diacritical_marks" : true,
|
76
|
+
"typography.exclamation" : true,
|
77
|
+
"typography.symbols" : true,
|
78
|
+
"uncomparables.misc" : true,
|
79
|
+
"weasel_words.misc" : true,
|
80
|
+
"weasel_words.very" : true
|
81
|
+
}
|
82
|
+
}
|
data/lib/version.rb
CHANGED
data/spec/danger_plugin_spec.rb
CHANGED
@@ -1,58 +1,103 @@
|
|
1
1
|
require File.expand_path('../spec_helper', __FILE__)
|
2
2
|
|
3
3
|
module Danger
|
4
|
-
describe
|
4
|
+
describe DangerProse do
|
5
5
|
it 'is a plugin' do
|
6
6
|
expect(Danger::DangerProse < Danger::Plugin).to be_truthy
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
describe 'with Dangerfile' do
|
10
10
|
before do
|
11
11
|
@dangerfile = testing_dangerfile
|
12
12
|
@prose = testing_dangerfile.prose
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
describe 'linter' do
|
16
|
+
it 'handles proselint not being installed' do
|
17
|
+
allow(@prose).to receive(:`).with('which proselint').and_return('')
|
18
|
+
expect(@prose.proselint_installed?).to be_falsy
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'handles proselint being installed' do
|
22
|
+
allow(@prose).to receive(:`).with('which proselint').and_return('/bin/thing/proselint')
|
23
|
+
expect(@prose.proselint_installed?).to be_truthy
|
24
|
+
end
|
25
|
+
|
26
|
+
describe :lint_files do
|
27
|
+
before do
|
28
|
+
# So it doesn't try to install on your computer
|
29
|
+
allow(@prose).to receive(:`).with('which proselint').and_return('/bin/thing/proselint')
|
30
|
+
|
31
|
+
# Proselint returns JSON data, which is nice 👍
|
32
|
+
errors = '[{"start": 1441, "replacements": null, "end": 1445, "severity": "warning", "extent": 4, "column": 1, "message": "!!! is hyperbolic.", "line": 46, "check": "hyperbolic.misc"}]'
|
33
|
+
proselint_response = '{"status" : "success", "data" : { "errors" : ' + errors + '}}'
|
34
|
+
|
35
|
+
# This is where we generate our JSON
|
36
|
+
allow(@prose).to receive(:`).with('proselint "spec/fixtures/blog_post.md" --json').and_return(proselint_response)
|
37
|
+
|
38
|
+
# it's worth noting - you can call anything on your plugin that a Dangerfile responds to
|
39
|
+
# The request source's PR JSON typically looks like
|
40
|
+
# https://raw.githubusercontent.com/danger/danger/bffc246a11dac883d76fc6636319bd6c2acd58a3/spec/fixtures/pr_response.json
|
41
|
+
|
42
|
+
@prose.env.request_source.pr_json = { head: { ref: 'my_fake_branch' } }
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'handles a known JSON report from proselint' do
|
46
|
+
@prose.lint_files('spec/fixtures/*.md')
|
47
|
+
output = @prose.status_report[:markdowns].first
|
19
48
|
|
20
|
-
|
21
|
-
|
22
|
-
|
49
|
+
# A title
|
50
|
+
expect(output).to include('Proselint found issues')
|
51
|
+
# A warning
|
52
|
+
expect(output).to include('!!! is hyperbolic. | warning')
|
53
|
+
# A link to the file inside the fixtures dir
|
54
|
+
expect(output).to include('[spec/fixtures/blog_post.md](/artsy/eigen/tree/my_fake_branch/spec/fixtures/blog_post.md)')
|
55
|
+
end
|
56
|
+
end
|
23
57
|
end
|
24
58
|
|
25
|
-
describe
|
26
|
-
it
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
59
|
+
describe 'spell checking' do
|
60
|
+
it 'handles proselint not being installed' do
|
61
|
+
allow(@prose).to receive(:`).with('which mdspell').and_return('')
|
62
|
+
expect(@prose.mdspell_installed?).to be_falsy
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'handles proselint being installed' do
|
66
|
+
allow(@prose).to receive(:`).with('which mdspell').and_return('/bin/thing/mdspell')
|
67
|
+
expect(@prose.mdspell_installed?).to be_truthy
|
68
|
+
end
|
69
|
+
|
70
|
+
describe 'full command' do
|
71
|
+
before do
|
72
|
+
# So it doesn't try to install on your computer
|
73
|
+
allow(@prose).to receive(:`).with('which mdspell').and_return('/bin/thing/mdspell')
|
74
|
+
|
75
|
+
# mdspell returns JSON data, which is nice 👍
|
76
|
+
proselint_response = " spec/fixtures/blog_post.md\n 1:27 | This post intentional left blank-ish.\n 4:84 | Here's a tpyo - it should registor.\n 4:101 | Here's a tpyo - it should registor.\n\n >> 3 spelling errors found in 1 file"
|
77
|
+
|
78
|
+
# This is where we generate our JSON
|
79
|
+
allow(@prose).to receive(:`).with('mdspell spec/fixtures/blog_post.md -r').and_return(proselint_response)
|
80
|
+
|
81
|
+
# it's worth noting - you can call anything on your plugin that a Dangerfile responds to
|
82
|
+
# The request source's PR JSON typically looks like
|
83
|
+
# https://raw.githubusercontent.com/danger/danger/bffc246a11dac883d76fc6636319bd6c2acd58a3/spec/fixtures/pr_response.json
|
84
|
+
|
85
|
+
@prose.env.request_source.pr_json = { head: { ref: 'my_fake_branch' } }
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'handles a known JSON report from mdspell' do
|
89
|
+
@prose.check_spelling('spec/fixtures/*.md')
|
90
|
+
output = @prose.status_report[:markdowns].first
|
91
|
+
|
92
|
+
# A title
|
93
|
+
expect(output).to include('Spell Checker found issues')
|
94
|
+
# A typo, in bold
|
95
|
+
expect(output).to include('**tpyo**')
|
96
|
+
# A link to the file inside the fixtures dir
|
97
|
+
expect(output).to include('[spec/fixtures/blog_post.md](/artsy/eigen/tree/my_fake_branch/spec/fixtures/blog_post.md)')
|
98
|
+
end
|
53
99
|
end
|
54
100
|
end
|
55
101
|
end
|
56
102
|
end
|
57
103
|
end
|
58
|
-
|
data/spec/fixtures/blog_post.md
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
ROOT = Pathname.new(File.expand_path('../../', __FILE__))
|
2
|
-
|
3
|
-
|
2
|
+
$LOAD_PATH.unshift((ROOT + 'lib').to_s)
|
3
|
+
$LOAD_PATH.unshift((ROOT + 'spec').to_s)
|
4
4
|
|
5
5
|
RSpec.configure do |config|
|
6
|
-
|
6
|
+
# Use color in STDOUT
|
7
7
|
config.color = true
|
8
8
|
end
|
9
9
|
|
@@ -26,11 +26,11 @@ end
|
|
26
26
|
# running a PR on TravisCI
|
27
27
|
def testing_env
|
28
28
|
{
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
29
|
+
'HAS_JOSH_K_SEAL_OF_APPROVAL' => 'true',
|
30
|
+
'TRAVIS_PULL_REQUEST' => '800',
|
31
|
+
'TRAVIS_REPO_SLUG' => 'artsy/eigen',
|
32
|
+
'TRAVIS_COMMIT_RANGE' => '759adcbd0d8f...13c4dc8bb61d',
|
33
|
+
'DANGER_GITHUB_API_TOKEN' => '123sbdq54erfsd3422gdfio'
|
34
34
|
}
|
35
35
|
end
|
36
36
|
|
@@ -38,4 +38,4 @@ end
|
|
38
38
|
def testing_dangerfile
|
39
39
|
env = Danger::EnvironmentManager.new(testing_env)
|
40
40
|
Danger::Dangerfile.new(env, testing_ui)
|
41
|
-
end
|
41
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: danger-prose
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Grandinetti
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-07-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: danger
|
@@ -25,6 +25,20 @@ dependencies:
|
|
25
25
|
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: yard
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0.8'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0.8'
|
28
42
|
- !ruby/object:Gem::Dependency
|
29
43
|
name: bundler
|
30
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -141,6 +155,7 @@ files:
|
|
141
155
|
- Rakefile
|
142
156
|
- danger-prose.gemspec
|
143
157
|
- lib/danger_plugin.rb
|
158
|
+
- lib/proselintrc
|
144
159
|
- lib/version.rb
|
145
160
|
- spec/danger_plugin_spec.rb
|
146
161
|
- spec/fixtures/blog_post.md
|
@@ -165,7 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
165
180
|
version: '0'
|
166
181
|
requirements: []
|
167
182
|
rubyforge_project:
|
168
|
-
rubygems_version: 2.
|
183
|
+
rubygems_version: 2.4.8
|
169
184
|
signing_key:
|
170
185
|
specification_version: 4
|
171
186
|
summary: A danger plugin for working with bodies of markdown prose.
|