simple_english 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.
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Lint Markdown prose with the SimpleEnglish Plain-mode rules.
4
+ # Pattern rules run on LanguageTool. Counting rules run here.
5
+ # This file is the composition root. The pieces live in lib/simple_english/.
6
+
7
+ require_relative "simple_english/finding"
8
+ require_relative "simple_english/markdown"
9
+ require_relative "simple_english/counts"
10
+ require_relative "simple_english/languagetool"
11
+ require_relative "simple_english/install"
12
+ require_relative "simple_english/extractor"
13
+ require_relative "simple_english/annotated_text"
14
+ require_relative "simple_english/suppressions"
15
+ require_relative "simple_english/config"
16
+ require_relative "simple_english/engine"
17
+ require_relative "simple_english/http"
18
+ require_relative "simple_english/client"
19
+ require_relative "simple_english/server"
20
+
21
+ module SimpleEnglish
22
+ VERSION = "0.1.0"
23
+
24
+ module_function
25
+
26
+ # Returns findings, or nil when the daemon is unreachable. The
27
+ # caller (bin/se) owns the exit status. Diagnostics go to
28
+ # stderr here.
29
+ def lint_text(text)
30
+ return nil unless Client.ensure_up(install: Install.from_env)
31
+ Client.lint(text)
32
+ end
33
+
34
+ # One entry point for files. Markdown keeps the counting rules. Code
35
+ # files lint comments through the daemon. nil means unreachable:
36
+ # the caller decides how fatal that is.
37
+ def lint_file(path, text = File.read(path))
38
+ language = Extractor.language_for(path)
39
+ findings =
40
+ if language
41
+ # Comment-free files never reach the daemon. No boot, no POST.
42
+ return [] if Extractor.comment_spans(text, language).empty?
43
+ return nil unless Client.ensure_up(install: Install.from_env)
44
+ result = Client.lint(text, language: language)
45
+ if result.nil?
46
+ warn "error: se daemon did not answer. Run `se serve` and read its output."
47
+ end
48
+ result
49
+ else
50
+ lint_text(text)
51
+ end
52
+ return nil unless findings
53
+ Suppressions.filter(text, findings)
54
+ end
55
+
56
+ def corpus_test
57
+ pairs = Dir.glob(File.expand_path("../test/corpus/*-before.md", __dir__))
58
+ .sort
59
+ failed = pairs.flat_map do |before|
60
+ after = before.sub(/-before\.md\z/, "-after.md")
61
+ before_findings = lint_text(File.read(before))
62
+ after_findings = lint_text(File.read(after))
63
+ messages = []
64
+ if before_findings.nil? || after_findings.nil?
65
+ messages << "#{before}: daemon unreachable"
66
+ else
67
+ messages << "#{before}: no findings, the rule set misses this case" if before_findings.empty?
68
+ unless after_findings.empty?
69
+ messages << "#{after}: still flagged: #{after_findings.map(&:rule).join(", ")}"
70
+ end
71
+ end
72
+ messages
73
+ end
74
+ failed.each { |failure| puts "FAIL #{failure}" }
75
+ puts "corpus: #{pairs.size} pairs, #{failed.size} failures"
76
+ failed.empty?
77
+ end
78
+ end