gherkin_language 0.0.7 → 0.0.8
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/.rubocop.yml +6 -6
 - data/README.md +2 -0
 - data/Rakefile +1 -1
 - data/bin/gherkin_language +4 -1
 - data/features/confused_words.feature +52 -0
 - data/features/sentences.feature +12 -12
 - data/gherkin_language.gemspec +1 -1
 - data/lib/gherkin_language.rb +32 -161
 - data/lib/gherkin_language/error.rb +34 -0
 - data/lib/gherkin_language/language_tool_process.rb +142 -0
 - metadata +4 -1
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: db5be66787bff52612008a4e2999084191cdff53
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 294d5c8d58ea483b2bb877f90cdbe4e7a0bae614
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 65eb341ef2cf91a80d11c42f531c20a1dc994e751dd0b538f579efb14a8065ef5acdb41ff7aedf7fc903a6c528b7261a00b30b6c7e9064861c004fd52aac2790
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: e3916bf3b624a8b8564122e9d4d05f16cbd1cee536d77e0754e88669377519fcdfbb27b507698bb63ae3e37cc3fc334cdc28360623a4274ee90862c466a70cc2
         
     | 
    
        data/.rubocop.yml
    CHANGED
    
    | 
         @@ -7,21 +7,21 @@ 
     | 
|
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
            # Offense count: 5
         
     | 
| 
       9 
9 
     | 
    
         
             
            Metrics/AbcSize:
         
     | 
| 
       10 
     | 
    
         
            -
              Max:  
     | 
| 
      
 10 
     | 
    
         
            +
              Max: 36
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
            # Offense count: 2
         
     | 
| 
       13 
13 
     | 
    
         
             
            # Configuration parameters: CountComments.
         
     | 
| 
       14 
14 
     | 
    
         
             
            Metrics/ClassLength:
         
     | 
| 
       15 
     | 
    
         
            -
              Max:  
     | 
| 
      
 15 
     | 
    
         
            +
              Max: 172
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
17 
     | 
    
         
             
            # Offense count: 2
         
     | 
| 
       18 
18 
     | 
    
         
             
            Metrics/CyclomaticComplexity:
         
     | 
| 
       19 
     | 
    
         
            -
              Max:  
     | 
| 
      
 19 
     | 
    
         
            +
              Max: 7
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
            # Offense count: 17
         
     | 
| 
       22 
22 
     | 
    
         
             
            # Configuration parameters: AllowURI, URISchemes.
         
     | 
| 
       23 
23 
     | 
    
         
             
            Metrics/LineLength:
         
     | 
| 
       24 
     | 
    
         
            -
              Max:  
     | 
| 
      
 24 
     | 
    
         
            +
              Max: 117
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
            # Offense count: 8
         
     | 
| 
       27 
27 
     | 
    
         
             
            # Configuration parameters: CountComments.
         
     | 
| 
         @@ -34,5 +34,5 @@ Metrics/ParameterLists: 
     | 
|
| 
       34 
34 
     | 
    
         
             
              Max: 8
         
     | 
| 
       35 
35 
     | 
    
         | 
| 
       36 
36 
     | 
    
         
             
            # Offense count: 2
         
     | 
| 
       37 
     | 
    
         
            -
            Metrics/PerceivedComplexity:
         
     | 
| 
       38 
     | 
    
         
            -
              Max:  
     | 
| 
      
 37 
     | 
    
         
            +
            #Metrics/PerceivedComplexity:
         
     | 
| 
      
 38 
     | 
    
         
            +
            #  Max: 8
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -23,6 +23,8 @@ To tag all words used, start it with `--tag`. This allows to build up a glossary 
     | 
|
| 
       23 
23 
     | 
    
         | 
| 
       24 
24 
     | 
    
         
             
            To ignore specific rules, mention them with an `--ignore RULE`. This allows to bypass the checks.
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
      
 26 
     | 
    
         
            +
            To check for confused words, based on ngrams, add `--ngram`. Please note, that it requires much disk space and time.
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
       26 
28 
     | 
    
         | 
| 
       27 
29 
     | 
    
         
             
            Glossary
         
     | 
| 
       28 
30 
     | 
    
         
             
            --------
         
     | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/bin/gherkin_language
    CHANGED
    
    | 
         @@ -17,9 +17,12 @@ OptionParser.new do |opts| 
     | 
|
| 
       17 
17 
     | 
    
         
             
              opts.on('--no-cache', 'do not use cache') do |no_cache|
         
     | 
| 
       18 
18 
     | 
    
         
             
                options[:no_cache] = no_cache
         
     | 
| 
       19 
19 
     | 
    
         
             
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
              opts.on('--ngram', 'check based on ngrams') do |ngram|
         
     | 
| 
      
 21 
     | 
    
         
            +
                options[:ngram] = ngram
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
       20 
23 
     | 
    
         
             
            end.parse!
         
     | 
| 
       21 
24 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
            language = GherkinLanguage.new(options.key? 
     | 
| 
      
 25 
     | 
    
         
            +
            language = GherkinLanguage.new(options.key?(:no_cache), options.key?(:ngram))
         
     | 
| 
       23 
26 
     | 
    
         | 
| 
       24 
27 
     | 
    
         
             
            if options.key? :sentences
         
     | 
| 
       25 
28 
     | 
    
         
             
              ARGV.each { |file| puts language.extract_sentences language.parse file }
         
     | 
| 
         @@ -0,0 +1,52 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Feature: Confused Words
         
     | 
| 
      
 2 
     | 
    
         
            +
              As a Business Analyst
         
     | 
| 
      
 3 
     | 
    
         
            +
              I want to be informed for confused words
         
     | 
| 
      
 4 
     | 
    
         
            +
              so that I know when I'm using wrong words
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              Background:
         
     | 
| 
      
 7 
     | 
    
         
            +
                Given a file named "confused_words.rb" with:
         
     | 
| 
      
 8 
     | 
    
         
            +
                  """
         
     | 
| 
      
 9 
     | 
    
         
            +
                  $LOAD_PATH << '../../lib'
         
     | 
| 
      
 10 
     | 
    
         
            +
                  require 'gherkin_language'
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                  no_cache = true
         
     | 
| 
      
 13 
     | 
    
         
            +
                  ngrams = true
         
     | 
| 
      
 14 
     | 
    
         
            +
                  language = GherkinLanguage.new(no_cache, ngrams)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  language.analyze 'test.feature'
         
     | 
| 
      
 16 
     | 
    
         
            +
                  exit language.report
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                  """
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              Scenario: Warns for confused word
         
     | 
| 
      
 21 
     | 
    
         
            +
                Given a file named "test.feature" with:
         
     | 
| 
      
 22 
     | 
    
         
            +
                  """
         
     | 
| 
      
 23 
     | 
    
         
            +
                  Feature: Test
         
     | 
| 
      
 24 
     | 
    
         
            +
                    Scenario: Tag
         
     | 
| 
      
 25 
     | 
    
         
            +
                      Given I do not now where it is
         
     | 
| 
      
 26 
     | 
    
         
            +
                      When execute
         
     | 
| 
      
 27 
     | 
    
         
            +
                      Then pass
         
     | 
| 
      
 28 
     | 
    
         
            +
                  """
         
     | 
| 
      
 29 
     | 
    
         
            +
                When I run `ruby confused_words.rb`
         
     | 
| 
      
 30 
     | 
    
         
            +
                Then it should fail with exactly:
         
     | 
| 
      
 31 
     | 
    
         
            +
                  """
         
     | 
| 
      
 32 
     | 
    
         
            +
                  [non-conformance] CONFUSION_RULE
         
     | 
| 
      
 33 
     | 
    
         
            +
                    Statistic suggests that 'know' (to be aware of) might be the correct word here, not 'now' (in this moment). Please check.
         
     | 
| 
      
 34 
     | 
    
         
            +
                    Context: Given I do not now where it is when execute then pass
         
     | 
| 
      
 35 
     | 
    
         
            +
                    Replacements: know
         
     | 
| 
      
 36 
     | 
    
         
            +
                    References: test.feature
         
     | 
| 
      
 37 
     | 
    
         
            +
                  """
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
              Scenario: Accept non confused words
         
     | 
| 
      
 40 
     | 
    
         
            +
                Given a file named "test.feature" with:
         
     | 
| 
      
 41 
     | 
    
         
            +
                  """
         
     | 
| 
      
 42 
     | 
    
         
            +
                  Feature: Test
         
     | 
| 
      
 43 
     | 
    
         
            +
                    Scenario: Tag
         
     | 
| 
      
 44 
     | 
    
         
            +
                      Given I do not know where it is
         
     | 
| 
      
 45 
     | 
    
         
            +
                      When execute
         
     | 
| 
      
 46 
     | 
    
         
            +
                      Then pass
         
     | 
| 
      
 47 
     | 
    
         
            +
                  """
         
     | 
| 
      
 48 
     | 
    
         
            +
                When I run `ruby confused_words.rb`
         
     | 
| 
      
 49 
     | 
    
         
            +
                Then it should pass with exactly:
         
     | 
| 
      
 50 
     | 
    
         
            +
                  """
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                  """
         
     | 
    
        data/features/sentences.feature
    CHANGED
    
    | 
         @@ -80,18 +80,18 @@ Feature: Sentences 
     | 
|
| 
       80 
80 
     | 
    
         
             
                  """
         
     | 
| 
       81 
81 
     | 
    
         
             
                  Feature: Test
         
     | 
| 
       82 
82 
     | 
    
         
             
                    Scenario Outline: Test
         
     | 
| 
       83 
     | 
    
         
            -
                      When <A> 
     | 
| 
       84 
     | 
    
         
            -
                      Then < 
     | 
| 
      
 83 
     | 
    
         
            +
                      When <A>
         
     | 
| 
      
 84 
     | 
    
         
            +
                      Then <B>
         
     | 
| 
       85 
85 
     | 
    
         | 
| 
       86 
86 
     | 
    
         
             
                      Examples: Table
         
     | 
| 
       87 
     | 
    
         
            -
                        | A |
         
     | 
| 
       88 
     | 
    
         
            -
                        | 1 |
         
     | 
| 
       89 
     | 
    
         
            -
                        | 2 |
         
     | 
| 
      
 87 
     | 
    
         
            +
                        | A | B |
         
     | 
| 
      
 88 
     | 
    
         
            +
                        | 1 | 3 |
         
     | 
| 
      
 89 
     | 
    
         
            +
                        | 2 | 4 |
         
     | 
| 
       90 
90 
     | 
    
         | 
| 
       91 
91 
     | 
    
         
             
                      Examples: Second Table
         
     | 
| 
       92 
     | 
    
         
            -
                        | B |  
     | 
| 
       93 
     | 
    
         
            -
                        |  
     | 
| 
       94 
     | 
    
         
            -
                        |  
     | 
| 
      
 92 
     | 
    
         
            +
                        | B | A |
         
     | 
| 
      
 93 
     | 
    
         
            +
                        | 5 | 7 |
         
     | 
| 
      
 94 
     | 
    
         
            +
                        | 6 | 8 |
         
     | 
| 
       95 
95 
     | 
    
         
             
                  """
         
     | 
| 
       96 
96 
     | 
    
         
             
                When I run `ruby extract_sentences.rb`
         
     | 
| 
       97 
97 
     | 
    
         
             
                Then it should pass with:
         
     | 
| 
         @@ -99,11 +99,11 @@ Feature: Sentences 
     | 
|
| 
       99 
99 
     | 
    
         
             
                  Test
         
     | 
| 
       100 
100 
     | 
    
         
             
                  Test
         
     | 
| 
       101 
101 
     | 
    
         
             
                  Table
         
     | 
| 
      
 102 
     | 
    
         
            +
                  When 1 then 3
         
     | 
| 
      
 103 
     | 
    
         
            +
                  When 2 then 4
         
     | 
| 
       102 
104 
     | 
    
         
             
                  Second Table
         
     | 
| 
       103 
     | 
    
         
            -
                  When  
     | 
| 
       104 
     | 
    
         
            -
                  When  
     | 
| 
       105 
     | 
    
         
            -
                  When 2 3 then 5
         
     | 
| 
       106 
     | 
    
         
            -
                  When 2 4 then 6
         
     | 
| 
      
 105 
     | 
    
         
            +
                  When 7 then 5
         
     | 
| 
      
 106 
     | 
    
         
            +
                  When 8 then 6
         
     | 
| 
       107 
107 
     | 
    
         
             
                  """
         
     | 
| 
       108 
108 
     | 
    
         | 
| 
       109 
109 
     | 
    
         
             
              Scenario: Extract Sentences considers feature description
         
     | 
    
        data/gherkin_language.gemspec
    CHANGED
    
    
    
        data/lib/gherkin_language.rb
    CHANGED
    
    | 
         @@ -1,6 +1,8 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # encoding: utf-8
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'gherkin/formatter/json_formatter'
         
     | 
| 
       3 
3 
     | 
    
         
             
            require 'gherkin/parser/parser'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'gherkin_language/error'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'gherkin_language/language_tool_process'
         
     | 
| 
       4 
6 
     | 
    
         
             
            require 'rexml/document'
         
     | 
| 
       5 
7 
     | 
    
         
             
            require 'stringio'
         
     | 
| 
       6 
8 
     | 
    
         
             
            require 'multi_json'
         
     | 
| 
         @@ -14,143 +16,7 @@ require 'digest' 
     | 
|
| 
       14 
16 
     | 
    
         | 
| 
       15 
17 
     | 
    
         
             
            # gherkin utilities
         
     | 
| 
       16 
18 
     | 
    
         
             
            class GherkinLanguage
         
     | 
| 
       17 
     | 
    
         
            -
               
     | 
| 
       18 
     | 
    
         
            -
              class LanguageToolProcess
         
     | 
| 
       19 
     | 
    
         
            -
                attr_accessor :errors, :unknown_words
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                VERSION = 'LanguageTool-3.0'
         
     | 
| 
       22 
     | 
    
         
            -
                URL = "https://www.languagetool.org/download/#{VERSION}.zip"
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                # This value entity class represents a language error
         
     | 
| 
       25 
     | 
    
         
            -
                class Error
         
     | 
| 
       26 
     | 
    
         
            -
                  attr_accessor :category, :context, :issuetype, :message, :replacements, :rule, :from_y, :to_y
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                  def initialize(category, context, issuetype, message, replacements, rule, from_y, to_y)
         
     | 
| 
       29 
     | 
    
         
            -
                    @category = category
         
     | 
| 
       30 
     | 
    
         
            -
                    @context = context
         
     | 
| 
       31 
     | 
    
         
            -
                    @issuetype = issuetype
         
     | 
| 
       32 
     | 
    
         
            -
                    @message = message
         
     | 
| 
       33 
     | 
    
         
            -
                    @replacements = replacements
         
     | 
| 
       34 
     | 
    
         
            -
                    @rule = rule
         
     | 
| 
       35 
     | 
    
         
            -
                    @from_y = from_y
         
     | 
| 
       36 
     | 
    
         
            -
                    @to_y = to_y
         
     | 
| 
       37 
     | 
    
         
            -
                  end
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                  def str(references)
         
     | 
| 
       40 
     | 
    
         
            -
                    (red("[#{@issuetype}] #{@rule}\n") +
         
     | 
| 
       41 
     | 
    
         
            -
                     "  #{@message}\n  Context: #{@context}\n  Replacements: #{@replacements}\n  References: #{references * ', '}\n")
         
     | 
| 
       42 
     | 
    
         
            -
                  end
         
     | 
| 
       43 
     | 
    
         
            -
                end
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                def initialize
         
     | 
| 
       46 
     | 
    
         
            -
                  path = Dir.tmpdir
         
     | 
| 
       47 
     | 
    
         
            -
                  download path unless File.exist? "#{path}/#{VERSION}/languagetool-commandline.jar"
         
     | 
| 
       48 
     | 
    
         
            -
                  @path = path
         
     | 
| 
       49 
     | 
    
         
            -
                  @p = nil
         
     | 
| 
       50 
     | 
    
         
            -
                  @reference_line = 0
         
     | 
| 
       51 
     | 
    
         
            -
                  @errors = []
         
     | 
| 
       52 
     | 
    
         
            -
                  @unknown_words = []
         
     | 
| 
       53 
     | 
    
         
            -
                  use_user_glossary "#{path}/#{VERSION}" if File.exist? '.glossary'
         
     | 
| 
       54 
     | 
    
         
            -
                end
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                def use_user_glossary(path)
         
     | 
| 
       57 
     | 
    
         
            -
                  resource_path = "#{path}/org/languagetool/resource/en"
         
     | 
| 
       58 
     | 
    
         
            -
                  system "cp #{resource_path}/added.txt #{resource_path}/added.copy && cp .glossary #{resource_path}/added.txt"
         
     | 
| 
       59 
     | 
    
         
            -
                  at_exit do
         
     | 
| 
       60 
     | 
    
         
            -
                    system "cp #{resource_path}/added.copy #{resource_path}/added.txt"
         
     | 
| 
       61 
     | 
    
         
            -
                  end
         
     | 
| 
       62 
     | 
    
         
            -
                end
         
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
                def download(path)
         
     | 
| 
       65 
     | 
    
         
            -
                  system "wget --quiet #{URL} -O /var/tmp/languagetool.zip"
         
     | 
| 
       66 
     | 
    
         
            -
                  FileUtils.mkdir_p path
         
     | 
| 
       67 
     | 
    
         
            -
                  system "unzip -qq -u /var/tmp/languagetool.zip -d #{path}"
         
     | 
| 
       68 
     | 
    
         
            -
                end
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
                def start!
         
     | 
| 
       71 
     | 
    
         
            -
                  @errors = []
         
     | 
| 
       72 
     | 
    
         
            -
                  @unknown_words = []
         
     | 
| 
       73 
     | 
    
         
            -
                  @reference_line = 0
         
     | 
| 
       74 
     | 
    
         
            -
                  Dir.chdir("#{@path}/#{VERSION}/") do
         
     | 
| 
       75 
     | 
    
         
            -
                    @p = IO.popen('java -jar languagetool-commandline.jar --list-unknown --api --language en-US -', 'r+')
         
     | 
| 
       76 
     | 
    
         
            -
                  end
         
     | 
| 
       77 
     | 
    
         
            -
                end
         
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
                def tag(sentences)
         
     | 
| 
       80 
     | 
    
         
            -
                  output = ''
         
     | 
| 
       81 
     | 
    
         
            -
                  Dir.chdir("#{@path}/#{VERSION}/") do
         
     | 
| 
       82 
     | 
    
         
            -
                    p = IO.popen('java -jar languagetool-commandline.jar --taggeronly --api --language en-US -', 'r+')
         
     | 
| 
       83 
     | 
    
         
            -
                    sentences.each { |sentence| p.write sentence }
         
     | 
| 
       84 
     | 
    
         
            -
                    p.close_write
         
     | 
| 
       85 
     | 
    
         
            -
                    line = p.readline
         
     | 
| 
       86 
     | 
    
         
            -
                    loop do
         
     | 
| 
       87 
     | 
    
         
            -
                      break if line == "<!--\n"
         
     | 
| 
       88 
     | 
    
         
            -
                      output << line
         
     | 
| 
       89 
     | 
    
         
            -
                      line = p.readline
         
     | 
| 
       90 
     | 
    
         
            -
                    end
         
     | 
| 
       91 
     | 
    
         
            -
                    p.close
         
     | 
| 
       92 
     | 
    
         
            -
                  end
         
     | 
| 
       93 
     | 
    
         
            -
                  output.gsub!(' ', "\n")
         
     | 
| 
       94 
     | 
    
         
            -
                  output.gsub!(']', "]\n")
         
     | 
| 
       95 
     | 
    
         
            -
                  output.gsub!("\n\n", "\n")
         
     | 
| 
       96 
     | 
    
         
            -
                  output
         
     | 
| 
       97 
     | 
    
         
            -
                end
         
     | 
| 
       98 
     | 
    
         
            -
             
     | 
| 
       99 
     | 
    
         
            -
                def check_paragraph(paragraph)
         
     | 
| 
       100 
     | 
    
         
            -
                  start_line = @reference_line
         
     | 
| 
       101 
     | 
    
         
            -
                  send paragraph
         
     | 
| 
       102 
     | 
    
         
            -
                  end_line = @reference_line
         
     | 
| 
       103 
     | 
    
         
            -
                  send "\n\n"
         
     | 
| 
       104 
     | 
    
         
            -
                  Range.new(start_line, end_line)
         
     | 
| 
       105 
     | 
    
         
            -
                end
         
     | 
| 
       106 
     | 
    
         
            -
             
     | 
| 
       107 
     | 
    
         
            -
                def send(sentence)
         
     | 
| 
       108 
     | 
    
         
            -
                  @reference_line += sentence.count "\n"
         
     | 
| 
       109 
     | 
    
         
            -
                  @p.write sentence
         
     | 
| 
       110 
     | 
    
         
            -
                end
         
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
                def parse_errors(result)
         
     | 
| 
       113 
     | 
    
         
            -
                  doc = REXML::Document.new result
         
     | 
| 
       114 
     | 
    
         
            -
                  errors = []
         
     | 
| 
       115 
     | 
    
         
            -
                  doc.elements.each '//error' do |error|
         
     | 
| 
       116 
     | 
    
         
            -
                    errors.push Error.new(
         
     | 
| 
       117 
     | 
    
         
            -
                      error.attributes['category'],
         
     | 
| 
       118 
     | 
    
         
            -
                      error.attributes['context'].strip,
         
     | 
| 
       119 
     | 
    
         
            -
                      error.attributes['locqualityissuetype'],
         
     | 
| 
       120 
     | 
    
         
            -
                      error.attributes['msg'],
         
     | 
| 
       121 
     | 
    
         
            -
                      error.attributes['replacements'],
         
     | 
| 
       122 
     | 
    
         
            -
                      error.attributes['ruleId'],
         
     | 
| 
       123 
     | 
    
         
            -
                      error.attributes['fromy'].to_i,
         
     | 
| 
       124 
     | 
    
         
            -
                      error.attributes['toy'].to_i)
         
     | 
| 
       125 
     | 
    
         
            -
                  end
         
     | 
| 
       126 
     | 
    
         
            -
                  errors
         
     | 
| 
       127 
     | 
    
         
            -
                end
         
     | 
| 
       128 
     | 
    
         
            -
             
     | 
| 
       129 
     | 
    
         
            -
                def parse_unknown_words(result)
         
     | 
| 
       130 
     | 
    
         
            -
                  doc = REXML::Document.new result
         
     | 
| 
       131 
     | 
    
         
            -
                  errors = []
         
     | 
| 
       132 
     | 
    
         
            -
                  doc.elements.each '//unknown_words/word' do |error|
         
     | 
| 
       133 
     | 
    
         
            -
                    errors.push error.text
         
     | 
| 
       134 
     | 
    
         
            -
                  end
         
     | 
| 
       135 
     | 
    
         
            -
                  errors
         
     | 
| 
       136 
     | 
    
         
            -
                end
         
     | 
| 
       137 
     | 
    
         
            -
             
     | 
| 
       138 
     | 
    
         
            -
                def stop!
         
     | 
| 
       139 
     | 
    
         
            -
                  @p.close_write
         
     | 
| 
       140 
     | 
    
         
            -
                  errors = ''
         
     | 
| 
       141 
     | 
    
         
            -
                  line = @p.readline
         
     | 
| 
       142 
     | 
    
         
            -
                  loop do
         
     | 
| 
       143 
     | 
    
         
            -
                    break if line == "<!--\n"
         
     | 
| 
       144 
     | 
    
         
            -
                    errors << line
         
     | 
| 
       145 
     | 
    
         
            -
                    line = @p.readline
         
     | 
| 
       146 
     | 
    
         
            -
                  end
         
     | 
| 
       147 
     | 
    
         
            -
                  @errors = parse_errors errors
         
     | 
| 
       148 
     | 
    
         
            -
                  @unknown_words = parse_unknown_words errors
         
     | 
| 
       149 
     | 
    
         
            -
                  @p.close
         
     | 
| 
       150 
     | 
    
         
            -
                end
         
     | 
| 
       151 
     | 
    
         
            -
              end
         
     | 
| 
       152 
     | 
    
         
            -
             
     | 
| 
       153 
     | 
    
         
            -
              def initialize(no_cache = false)
         
     | 
| 
      
 19 
     | 
    
         
            +
              def initialize(no_cache = false, ngram = false)
         
     | 
| 
       154 
20 
     | 
    
         
             
                path = "~/.gherkin_language/#{LanguageToolProcess::VERSION}/accepted_paragraphs.yml"
         
     | 
| 
       155 
21 
     | 
    
         
             
                @settings_path = File.expand_path path
         
     | 
| 
       156 
22 
     | 
    
         
             
                @accepted_paragraphs = {}
         
     | 
| 
         @@ -162,6 +28,7 @@ class GherkinLanguage 
     | 
|
| 
       162 
28 
     | 
    
         
             
                @references = {}
         
     | 
| 
       163 
29 
     | 
    
         
             
                @line_to_reference = {}
         
     | 
| 
       164 
30 
     | 
    
         
             
                @exceptions = []
         
     | 
| 
      
 31 
     | 
    
         
            +
                @ngram = ngram
         
     | 
| 
       165 
32 
     | 
    
         
             
              end
         
     | 
| 
       166 
33 
     | 
    
         | 
| 
       167 
34 
     | 
    
         
             
              def ignore(exception)
         
     | 
| 
         @@ -219,7 +86,7 @@ class GherkinLanguage 
     | 
|
| 
       219 
86 
     | 
    
         | 
| 
       220 
87 
     | 
    
         
             
              def report
         
     | 
| 
       221 
88 
     | 
    
         
             
                return 0 if @references.keys.empty?
         
     | 
| 
       222 
     | 
    
         
            -
                language = LanguageToolProcess.new
         
     | 
| 
      
 89 
     | 
    
         
            +
                language = LanguageToolProcess.new @ngram
         
     | 
| 
       223 
90 
     | 
    
         
             
                language.start!
         
     | 
| 
       224 
91 
     | 
    
         | 
| 
       225 
92 
     | 
    
         
             
                @references.keys.each do |sentence|
         
     | 
| 
         @@ -294,43 +161,47 @@ class GherkinLanguage 
     | 
|
| 
       294 
161 
     | 
    
         
             
                background = []
         
     | 
| 
       295 
162 
     | 
    
         
             
                input.each do |features|
         
     | 
| 
       296 
163 
     | 
    
         
             
                  next unless features.key? 'elements'
         
     | 
| 
       297 
     | 
    
         
            -
                   
     | 
| 
       298 
     | 
    
         
            -
                  elements.each do |scenario|
         
     | 
| 
      
 164 
     | 
    
         
            +
                  features['elements'].each do |scenario|
         
     | 
| 
       299 
165 
     | 
    
         
             
                    next unless scenario.key? 'steps'
         
     | 
| 
       300 
166 
     | 
    
         
             
                    terms = background.dup
         
     | 
| 
       301 
167 
     | 
    
         
             
                    if scenario['type'] == 'background'
         
     | 
| 
       302 
     | 
    
         
            -
                      scenario['steps'] 
     | 
| 
       303 
     | 
    
         
            -
                        new_terms = [step['keyword'], step['name']].join
         
     | 
| 
       304 
     | 
    
         
            -
                        new_terms = uncapitalize(new_terms) unless terms.empty?
         
     | 
| 
       305 
     | 
    
         
            -
                        background.push new_terms
         
     | 
| 
       306 
     | 
    
         
            -
                      end
         
     | 
| 
      
 168 
     | 
    
         
            +
                      background.push extract_terms_from_scenario(scenario['steps'], terms)
         
     | 
| 
       307 
169 
     | 
    
         
             
                      next
         
     | 
| 
       308 
170 
     | 
    
         
             
                    end
         
     | 
| 
       309 
171 
     | 
    
         | 
| 
       310 
     | 
    
         
            -
                    scenario['steps'] 
     | 
| 
       311 
     | 
    
         
            -
             
     | 
| 
       312 
     | 
    
         
            -
                      keyword = 'and ' unless background.empty? || keyword != 'Given '
         
     | 
| 
       313 
     | 
    
         
            -
                      new_terms = [keyword, step['name']].join
         
     | 
| 
       314 
     | 
    
         
            -
                      new_terms = uncapitalize(new_terms) unless terms.empty?
         
     | 
| 
       315 
     | 
    
         
            -
                      terms.push new_terms
         
     | 
| 
       316 
     | 
    
         
            -
                    end
         
     | 
| 
       317 
     | 
    
         
            -
                    sentence = terms.join ' '
         
     | 
| 
      
 172 
     | 
    
         
            +
                    terms.push extract_terms_from_scenario(scenario['steps'], background)
         
     | 
| 
      
 173 
     | 
    
         
            +
                    sentence = terms.join(' ').strip
         
     | 
| 
       318 
174 
     | 
    
         
             
                    if scenario.key? 'examples'
         
     | 
| 
       319 
     | 
    
         
            -
                       
     | 
| 
       320 
     | 
    
         
            -
                      scenario['examples'].each do |example|
         
     | 
| 
       321 
     | 
    
         
            -
                        sentences.push example['name'] unless example['name'].empty?
         
     | 
| 
       322 
     | 
    
         
            -
                        sentences.push example['description'] unless example['description'].empty?
         
     | 
| 
       323 
     | 
    
         
            -
                        prototypes = prototypes.map { |prototype| expand_outlines(prototype, example) }.flatten
         
     | 
| 
       324 
     | 
    
         
            -
                      end
         
     | 
| 
       325 
     | 
    
         
            -
                      sentences += prototypes
         
     | 
| 
      
 175 
     | 
    
         
            +
                      sentences += extract_examples(scenario['examples'], sentence)
         
     | 
| 
       326 
176 
     | 
    
         
             
                    else
         
     | 
| 
       327 
     | 
    
         
            -
                      sentences.push sentence 
     | 
| 
      
 177 
     | 
    
         
            +
                      sentences.push sentence
         
     | 
| 
       328 
178 
     | 
    
         
             
                    end
         
     | 
| 
       329 
179 
     | 
    
         
             
                  end
         
     | 
| 
       330 
180 
     | 
    
         
             
                end
         
     | 
| 
       331 
181 
     | 
    
         
             
                sentences
         
     | 
| 
       332 
182 
     | 
    
         
             
              end
         
     | 
| 
       333 
183 
     | 
    
         | 
| 
      
 184 
     | 
    
         
            +
              def extract_terms_from_scenario(steps, background)
         
     | 
| 
      
 185 
     | 
    
         
            +
                steps.map do |step|
         
     | 
| 
      
 186 
     | 
    
         
            +
                  keyword = step['keyword']
         
     | 
| 
      
 187 
     | 
    
         
            +
                  keyword = 'and ' unless background.empty? || keyword != 'Given '
         
     | 
| 
      
 188 
     | 
    
         
            +
                  terms = [keyword, step['name']].join
         
     | 
| 
      
 189 
     | 
    
         
            +
                  terms = uncapitalize(terms) unless background.empty?
         
     | 
| 
      
 190 
     | 
    
         
            +
                  background = terms
         
     | 
| 
      
 191 
     | 
    
         
            +
                  terms
         
     | 
| 
      
 192 
     | 
    
         
            +
                end.flatten
         
     | 
| 
      
 193 
     | 
    
         
            +
              end
         
     | 
| 
      
 194 
     | 
    
         
            +
             
     | 
| 
      
 195 
     | 
    
         
            +
              def extract_examples(examples, prototype)
         
     | 
| 
      
 196 
     | 
    
         
            +
                examples.map do |example|
         
     | 
| 
      
 197 
     | 
    
         
            +
                  sentences = []
         
     | 
| 
      
 198 
     | 
    
         
            +
                  sentences.push example['name'] unless example['name'].empty?
         
     | 
| 
      
 199 
     | 
    
         
            +
                  sentences.push example['description'] unless example['description'].empty?
         
     | 
| 
      
 200 
     | 
    
         
            +
                  sentences += expand_outlines(prototype, example)
         
     | 
| 
      
 201 
     | 
    
         
            +
                  sentences
         
     | 
| 
      
 202 
     | 
    
         
            +
                end.flatten
         
     | 
| 
      
 203 
     | 
    
         
            +
              end
         
     | 
| 
      
 204 
     | 
    
         
            +
             
     | 
| 
       334 
205 
     | 
    
         
             
              def uncapitalize(term)
         
     | 
| 
       335 
206 
     | 
    
         
             
                term[0, 1].downcase + term[1..-1]
         
     | 
| 
       336 
207 
     | 
    
         
             
              end
         
     | 
| 
         @@ -0,0 +1,34 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'gherkin/formatter/json_formatter'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'gherkin/parser/parser'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'rexml/document'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'stringio'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'multi_json'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'term/ansicolor'
         
     | 
| 
      
 8 
     | 
    
         
            +
            include Term::ANSIColor
         
     | 
| 
      
 9 
     | 
    
         
            +
            require 'tmpdir'
         
     | 
| 
      
 10 
     | 
    
         
            +
            require 'fileutils'
         
     | 
| 
      
 11 
     | 
    
         
            +
            require 'yaml'
         
     | 
| 
      
 12 
     | 
    
         
            +
            require 'set'
         
     | 
| 
      
 13 
     | 
    
         
            +
            require 'digest'
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            # This value entity class represents a language error
         
     | 
| 
      
 16 
     | 
    
         
            +
            class Error
         
     | 
| 
      
 17 
     | 
    
         
            +
              attr_accessor :category, :context, :issuetype, :message, :replacements, :rule, :from_y, :to_y
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
              def initialize(category, context, issuetype, message, replacements, rule, from_y, to_y)
         
     | 
| 
      
 20 
     | 
    
         
            +
                @category = category
         
     | 
| 
      
 21 
     | 
    
         
            +
                @context = context
         
     | 
| 
      
 22 
     | 
    
         
            +
                @issuetype = issuetype
         
     | 
| 
      
 23 
     | 
    
         
            +
                @message = message
         
     | 
| 
      
 24 
     | 
    
         
            +
                @replacements = replacements
         
     | 
| 
      
 25 
     | 
    
         
            +
                @rule = rule
         
     | 
| 
      
 26 
     | 
    
         
            +
                @from_y = from_y
         
     | 
| 
      
 27 
     | 
    
         
            +
                @to_y = to_y
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              def str(references)
         
     | 
| 
      
 31 
     | 
    
         
            +
                (red("[#{@issuetype}] #{@rule}\n") +
         
     | 
| 
      
 32 
     | 
    
         
            +
                 "  #{@message}\n  Context: #{@context}\n  Replacements: #{@replacements}\n  References: #{references * ', '}\n")
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,142 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'gherkin/formatter/json_formatter'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'gherkin/parser/parser'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'rexml/document'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'stringio'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'multi_json'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'term/ansicolor'
         
     | 
| 
      
 8 
     | 
    
         
            +
            include Term::ANSIColor
         
     | 
| 
      
 9 
     | 
    
         
            +
            require 'tmpdir'
         
     | 
| 
      
 10 
     | 
    
         
            +
            require 'fileutils'
         
     | 
| 
      
 11 
     | 
    
         
            +
            require 'yaml'
         
     | 
| 
      
 12 
     | 
    
         
            +
            require 'set'
         
     | 
| 
      
 13 
     | 
    
         
            +
            require 'digest'
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            # This service class provides access to language tool process.
         
     | 
| 
      
 16 
     | 
    
         
            +
            class LanguageToolProcess
         
     | 
| 
      
 17 
     | 
    
         
            +
              attr_accessor :errors, :unknown_words
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
              VERSION = 'LanguageTool-3.1'
         
     | 
| 
      
 20 
     | 
    
         
            +
              URL = "https://www.languagetool.org/download/#{VERSION}.zip"
         
     | 
| 
      
 21 
     | 
    
         
            +
              NGRAM_VERSION = 'ngrams-en-20150817'
         
     | 
| 
      
 22 
     | 
    
         
            +
              NGRAM_URL = "https://languagetool.org/download/ngram-data/#{NGRAM_VERSION}.zip"
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              def initialize(ngrams = false)
         
     | 
| 
      
 25 
     | 
    
         
            +
                path = Dir.tmpdir
         
     | 
| 
      
 26 
     | 
    
         
            +
                download(path, URL) unless File.exist? "#{path}/#{VERSION}/languagetool-commandline.jar"
         
     | 
| 
      
 27 
     | 
    
         
            +
                if ngrams
         
     | 
| 
      
 28 
     | 
    
         
            +
                  @ngrams_path = "#{path}/#{NGRAM_VERSION}"
         
     | 
| 
      
 29 
     | 
    
         
            +
                  download("#{@ngrams_path}/en", NGRAM_URL) unless File.exist? @ngrams_path
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
                @path = path
         
     | 
| 
      
 32 
     | 
    
         
            +
                @p = nil
         
     | 
| 
      
 33 
     | 
    
         
            +
                @reference_line = 0
         
     | 
| 
      
 34 
     | 
    
         
            +
                @errors = []
         
     | 
| 
      
 35 
     | 
    
         
            +
                @unknown_words = []
         
     | 
| 
      
 36 
     | 
    
         
            +
                @ngrams = ngrams
         
     | 
| 
      
 37 
     | 
    
         
            +
                use_user_glossary "#{path}/#{VERSION}" if File.exist? '.glossary'
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
              def use_user_glossary(path)
         
     | 
| 
      
 41 
     | 
    
         
            +
                resource_path = "#{path}/org/languagetool/resource/en"
         
     | 
| 
      
 42 
     | 
    
         
            +
                system "cp #{resource_path}/added.txt #{resource_path}/added.copy && cp .glossary #{resource_path}/added.txt"
         
     | 
| 
      
 43 
     | 
    
         
            +
                at_exit do
         
     | 
| 
      
 44 
     | 
    
         
            +
                  system "cp #{resource_path}/added.copy #{resource_path}/added.txt"
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
              def download(path, url)
         
     | 
| 
      
 49 
     | 
    
         
            +
                system "wget --quiet #{url} -O /var/tmp/languagetool.zip"
         
     | 
| 
      
 50 
     | 
    
         
            +
                FileUtils.mkdir_p path
         
     | 
| 
      
 51 
     | 
    
         
            +
                system "unzip -qq -u /var/tmp/languagetool.zip -d #{path}"
         
     | 
| 
      
 52 
     | 
    
         
            +
                system 'rm /var/tmp/languagetool.zip'
         
     | 
| 
      
 53 
     | 
    
         
            +
              end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
              def start!
         
     | 
| 
      
 56 
     | 
    
         
            +
                @errors = []
         
     | 
| 
      
 57 
     | 
    
         
            +
                @unknown_words = []
         
     | 
| 
      
 58 
     | 
    
         
            +
                @reference_line = 0
         
     | 
| 
      
 59 
     | 
    
         
            +
                Dir.chdir("#{@path}/#{VERSION}/") do
         
     | 
| 
      
 60 
     | 
    
         
            +
                  command = 'java -jar languagetool-commandline.jar --list-unknown --api --language en-US'
         
     | 
| 
      
 61 
     | 
    
         
            +
                  command += " --languagemodel #{@ngrams_path}" if @ngrams
         
     | 
| 
      
 62 
     | 
    
         
            +
                  @p = IO.popen("#{command} -", 'r+')
         
     | 
| 
      
 63 
     | 
    
         
            +
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
              end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
              def tag(sentences)
         
     | 
| 
      
 67 
     | 
    
         
            +
                output = ''
         
     | 
| 
      
 68 
     | 
    
         
            +
                Dir.chdir("#{@path}/#{VERSION}/") do
         
     | 
| 
      
 69 
     | 
    
         
            +
                  p = IO.popen('java -jar languagetool-commandline.jar --taggeronly --api --language en-US -', 'r+')
         
     | 
| 
      
 70 
     | 
    
         
            +
                  sentences.each { |sentence| p.write sentence }
         
     | 
| 
      
 71 
     | 
    
         
            +
                  p.close_write
         
     | 
| 
      
 72 
     | 
    
         
            +
                  line = p.readline
         
     | 
| 
      
 73 
     | 
    
         
            +
                  loop do
         
     | 
| 
      
 74 
     | 
    
         
            +
                    break if line == "<!--\n"
         
     | 
| 
      
 75 
     | 
    
         
            +
                    output << line
         
     | 
| 
      
 76 
     | 
    
         
            +
                    line = p.readline
         
     | 
| 
      
 77 
     | 
    
         
            +
                  end
         
     | 
| 
      
 78 
     | 
    
         
            +
                  p.close
         
     | 
| 
      
 79 
     | 
    
         
            +
                end
         
     | 
| 
      
 80 
     | 
    
         
            +
                output.gsub!(' ', "\n")
         
     | 
| 
      
 81 
     | 
    
         
            +
                output.gsub!(']', "]\n")
         
     | 
| 
      
 82 
     | 
    
         
            +
                output.gsub!("\n\n", "\n")
         
     | 
| 
      
 83 
     | 
    
         
            +
                output
         
     | 
| 
      
 84 
     | 
    
         
            +
              end
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
              def check_paragraph(paragraph)
         
     | 
| 
      
 87 
     | 
    
         
            +
                start_line = @reference_line
         
     | 
| 
      
 88 
     | 
    
         
            +
                send paragraph
         
     | 
| 
      
 89 
     | 
    
         
            +
                end_line = @reference_line
         
     | 
| 
      
 90 
     | 
    
         
            +
                send "\n\n"
         
     | 
| 
      
 91 
     | 
    
         
            +
                Range.new(start_line, end_line)
         
     | 
| 
      
 92 
     | 
    
         
            +
              end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
              def send(sentence)
         
     | 
| 
      
 95 
     | 
    
         
            +
                @reference_line += sentence.count "\n"
         
     | 
| 
      
 96 
     | 
    
         
            +
                @p.write sentence
         
     | 
| 
      
 97 
     | 
    
         
            +
              end
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
              def parse_errors(result)
         
     | 
| 
      
 100 
     | 
    
         
            +
                doc = REXML::Document.new result
         
     | 
| 
      
 101 
     | 
    
         
            +
                errors = []
         
     | 
| 
      
 102 
     | 
    
         
            +
                doc.elements.each '//error' do |error|
         
     | 
| 
      
 103 
     | 
    
         
            +
                  errors.push decode_error error
         
     | 
| 
      
 104 
     | 
    
         
            +
                end
         
     | 
| 
      
 105 
     | 
    
         
            +
                errors
         
     | 
| 
      
 106 
     | 
    
         
            +
              end
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
              def decode_error(error)
         
     | 
| 
      
 109 
     | 
    
         
            +
                Error.new(
         
     | 
| 
      
 110 
     | 
    
         
            +
                  error.attributes['category'],
         
     | 
| 
      
 111 
     | 
    
         
            +
                  error.attributes['context'].strip,
         
     | 
| 
      
 112 
     | 
    
         
            +
                  error.attributes['locqualityissuetype'],
         
     | 
| 
      
 113 
     | 
    
         
            +
                  error.attributes['msg'],
         
     | 
| 
      
 114 
     | 
    
         
            +
                  error.attributes['replacements'],
         
     | 
| 
      
 115 
     | 
    
         
            +
                  error.attributes['ruleId'],
         
     | 
| 
      
 116 
     | 
    
         
            +
                  error.attributes['fromy'].to_i,
         
     | 
| 
      
 117 
     | 
    
         
            +
                  error.attributes['toy'].to_i)
         
     | 
| 
      
 118 
     | 
    
         
            +
              end
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
      
 120 
     | 
    
         
            +
              def parse_unknown_words(result)
         
     | 
| 
      
 121 
     | 
    
         
            +
                doc = REXML::Document.new result
         
     | 
| 
      
 122 
     | 
    
         
            +
                errors = []
         
     | 
| 
      
 123 
     | 
    
         
            +
                doc.elements.each '//unknown_words/word' do |error|
         
     | 
| 
      
 124 
     | 
    
         
            +
                  errors.push error.text
         
     | 
| 
      
 125 
     | 
    
         
            +
                end
         
     | 
| 
      
 126 
     | 
    
         
            +
                errors
         
     | 
| 
      
 127 
     | 
    
         
            +
              end
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
              def stop!
         
     | 
| 
      
 130 
     | 
    
         
            +
                @p.close_write
         
     | 
| 
      
 131 
     | 
    
         
            +
                errors = ''
         
     | 
| 
      
 132 
     | 
    
         
            +
                line = @p.readline
         
     | 
| 
      
 133 
     | 
    
         
            +
                loop do
         
     | 
| 
      
 134 
     | 
    
         
            +
                  break if line == "<!--\n"
         
     | 
| 
      
 135 
     | 
    
         
            +
                  errors << line
         
     | 
| 
      
 136 
     | 
    
         
            +
                  line = @p.readline
         
     | 
| 
      
 137 
     | 
    
         
            +
                end
         
     | 
| 
      
 138 
     | 
    
         
            +
                @errors = parse_errors errors
         
     | 
| 
      
 139 
     | 
    
         
            +
                @unknown_words = parse_unknown_words errors
         
     | 
| 
      
 140 
     | 
    
         
            +
                @p.close
         
     | 
| 
      
 141 
     | 
    
         
            +
              end
         
     | 
| 
      
 142 
     | 
    
         
            +
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: gherkin_language
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.0.8
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Stefan Rohe
         
     | 
| 
         @@ -67,6 +67,7 @@ files: 
     | 
|
| 
       67 
67 
     | 
    
         
             
            - README.md
         
     | 
| 
       68 
68 
     | 
    
         
             
            - Rakefile
         
     | 
| 
       69 
69 
     | 
    
         
             
            - bin/gherkin_language
         
     | 
| 
      
 70 
     | 
    
         
            +
            - features/confused_words.feature
         
     | 
| 
       70 
71 
     | 
    
         
             
            - features/correct.feature
         
     | 
| 
       71 
72 
     | 
    
         
             
            - features/exception.feature
         
     | 
| 
       72 
73 
     | 
    
         
             
            - features/glossary.feature
         
     | 
| 
         @@ -76,6 +77,8 @@ files: 
     | 
|
| 
       76 
77 
     | 
    
         
             
            - features/tag.feature
         
     | 
| 
       77 
78 
     | 
    
         
             
            - gherkin_language.gemspec
         
     | 
| 
       78 
79 
     | 
    
         
             
            - lib/gherkin_language.rb
         
     | 
| 
      
 80 
     | 
    
         
            +
            - lib/gherkin_language/error.rb
         
     | 
| 
      
 81 
     | 
    
         
            +
            - lib/gherkin_language/language_tool_process.rb
         
     | 
| 
       79 
82 
     | 
    
         
             
            - test/test_gherkin_language.rb
         
     | 
| 
       80 
83 
     | 
    
         
             
            - test/test_gherkin_language_tool.rb
         
     | 
| 
       81 
84 
     | 
    
         
             
            homepage: http://github.com/funkwerk/gherkin_language/
         
     |