danger-prose 1.0.0 → 2.0.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 +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.
|