docspec 0.0.2 → 0.0.3
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/README.md +63 -23
- data/bin/docspec +5 -5
- data/lib/docspec/document.rb +8 -6
- data/lib/docspec/example.rb +4 -0
- data/lib/docspec/testable.rb +57 -0
- data/lib/docspec/version.rb +1 -1
- data/lib/docspec.rb +1 -1
- metadata +2 -2
- data/lib/docspec/tester.rb +0 -45
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: ad249396cfc15361e8f19e3932b5c75ab565b5042ce3431204daf0a39d4f0a14
         | 
| 4 | 
            +
              data.tar.gz: a0772e8fd3692466756215f0786709fae4c0772248d1715a0503810a7e0af719
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 4985a1fcb629b102bd560fc4a33bb24d18b0ef91368619cfbcc1f053ac2ac3fffa15426e81f1826de87bebeb5233ad4d416551f8eaad9c52f2513cd273d0b04f
         | 
| 7 | 
            +
              data.tar.gz: cae6a31e132105853a6015d53d39a3d0ad13bbd99b94fd03e10bedada81e635d7409a2495940d98d9447ff51e9f8249de719e5bd8dfa1aec8a1c4af8dd2a52cc
         | 
    
        data/README.md
    CHANGED
    
    | @@ -20,40 +20,49 @@ Installation | |
| 20 20 | 
             
            Usage
         | 
| 21 21 | 
             
            --------------------------------------------------
         | 
| 22 22 |  | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 23 | 
            +
            Docspec expects one or more Markdown files with embedded code snippets to 
         | 
| 24 | 
            +
            test.
         | 
| 25 25 |  | 
| 26 | 
            +
            Code snippets should be enclosed in a `ruby` or `shell` code fence:
         | 
| 26 27 |  | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 28 | 
            +
                ```ruby
         | 
| 29 | 
            +
                code_to_test = 'here'
         | 
| 30 | 
            +
                #=> expected output
         | 
| 31 | 
            +
                ```
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            This document itself serves as the test suite for this gem, so you can take a
         | 
| 34 | 
            +
            look at its source.
         | 
| 29 35 |  | 
| 30 | 
            -
            - Anything outside of a code fence is ignored.
         | 
| 31 | 
            -
            - Both `ruby` and `shell` code blocks are supported.
         | 
| 32 | 
            -
            - Inside a code block, any piece of code that we care about should print
         | 
| 33 | 
            -
              something.
         | 
| 34 | 
            -
            - Inside a code block, anything starting with `#=>` should define the 
         | 
| 35 | 
            -
              expected output.
         | 
| 36 | 
            -
            - If a piece of code raises an error, the captured output will be the 
         | 
| 37 | 
            -
              `#inspect` string of that exception.
         | 
| 38 | 
            -
            - If the first line of a code block includes the string `[:ignore_failure]`, 
         | 
| 39 | 
            -
              the example will not be considered an error if it fails.
         | 
| 40 36 |  | 
| 37 | 
            +
            ### Testing with the `docspec` command line
         | 
| 41 38 |  | 
| 42 | 
            -
             | 
| 39 | 
            +
            Test the examples in `./README.md`:
         | 
| 43 40 |  | 
| 44 41 | 
             
                $ docspec
         | 
| 45 42 |  | 
| 46 | 
            -
             | 
| 43 | 
            +
            Test a different file:
         | 
| 47 44 |  | 
| 48 45 | 
             
                $ docspec TESTS.md
         | 
| 49 46 |  | 
| 50 47 |  | 
| 48 | 
            +
            ### Testing from Ruby code
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            ```ruby
         | 
| 51 | 
            +
            # Running from Ruby code
         | 
| 52 | 
            +
            document = Docspec::Document.from_file 'sample.md'
         | 
| 53 | 
            +
            document.test
         | 
| 54 | 
            +
            #=> pass : Sample Test
         | 
| 55 | 
            +
             | 
| 56 | 
            +
            puts document.success?
         | 
| 57 | 
            +
            #=> true
         | 
| 58 | 
            +
            ```
         | 
| 59 | 
            +
             | 
| 60 | 
            +
             | 
| 51 61 | 
             
            Examples
         | 
| 52 62 | 
             
            --------------------------------------------------
         | 
| 53 63 |  | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
            ### Ruby
         | 
| 64 | 
            +
            Code examples that you want to test, should output something to stdout. 
         | 
| 65 | 
            +
            Specify the expected output by prefixing it with `#=>`:
         | 
| 57 66 |  | 
| 58 67 | 
             
            ```ruby
         | 
| 59 68 | 
             
            # The first line is an optional label
         | 
| @@ -61,12 +70,17 @@ puts 'hello world'.upcase | |
| 61 70 | 
             
            #=> HELLO WORLD
         | 
| 62 71 | 
             
            ```
         | 
| 63 72 |  | 
| 73 | 
            +
            If an example raises an exception, the captured output will be the `#inspect`
         | 
| 74 | 
            +
            string of that exception:
         | 
| 75 | 
            +
             | 
| 64 76 | 
             
            ```ruby
         | 
| 65 77 | 
             
            # Exceptions are captured
         | 
| 66 78 | 
             
            raise ArgumentError, "Testing error raising"
         | 
| 67 79 | 
             
            #=> #<ArgumentError: Testing error raising>
         | 
| 68 80 | 
             
            ```
         | 
| 69 81 |  | 
| 82 | 
            +
            Your code and expected output can contain multiple lines of code:
         | 
| 83 | 
            +
             | 
| 70 84 | 
             
            ```ruby
         | 
| 71 85 | 
             
            # Multiple lines of code
         | 
| 72 86 | 
             
            string = "hello"
         | 
| @@ -78,6 +92,8 @@ end | |
| 78 92 | 
             
            #=> hello
         | 
| 79 93 | 
             
            ```
         | 
| 80 94 |  | 
| 95 | 
            +
            and you can alternate between code and expected output:
         | 
| 96 | 
            +
             | 
| 81 97 | 
             
            ```ruby
         | 
| 82 98 | 
             
            # Interleaving code and output 
         | 
| 83 99 | 
             
            puts 2 + 3
         | 
| @@ -87,6 +103,13 @@ puts 2 - 3 | |
| 87 103 | 
             
            #=> -1
         | 
| 88 104 | 
             
            ```
         | 
| 89 105 |  | 
| 106 | 
            +
            The first line of the example may contain specially formatted flags. Flags 
         | 
| 107 | 
            +
            are always formatted like this: `[:flag_name]`. 
         | 
| 108 | 
            +
             | 
| 109 | 
            +
            The `[:ignore_failure]` flag allows the example to fail. It will show the 
         | 
| 110 | 
            +
            failure in the output, but will not elevate the exit status to a failure 
         | 
| 111 | 
            +
            state:
         | 
| 112 | 
            +
             | 
| 90 113 | 
             
            ```ruby
         | 
| 91 114 | 
             
            # This example may fail [:ignore_failure]
         | 
| 92 115 | 
             
            # Due to the :ignore_failure flag, it will show the failure diff, but will
         | 
| @@ -95,26 +118,43 @@ puts 'hello world'.upcase | |
| 95 118 | 
             
            #=> hello world
         | 
| 96 119 | 
             
            ```
         | 
| 97 120 |  | 
| 121 | 
            +
            Another available flag, is the `[:skip]` flag, which will omit the example
         | 
| 122 | 
            +
            from the test run:
         | 
| 123 | 
            +
             | 
| 98 124 | 
             
            ```ruby
         | 
| 99 | 
            -
            #  | 
| 100 | 
            -
             | 
| 125 | 
            +
            # [:skip]
         | 
| 126 | 
            +
            this will not be executed
         | 
| 127 | 
            +
            ```
         | 
| 128 | 
            +
             | 
| 129 | 
            +
            Sometimes it is useful to build the example over several different code 
         | 
| 130 | 
            +
            blocks. To help achieve this, docspec will treat any example that does not 
         | 
| 131 | 
            +
            output anything as a code that needs to be executed before all subsequent 
         | 
| 132 | 
            +
            examples:
         | 
| 133 | 
            +
             | 
| 134 | 
            +
            ```ruby
         | 
| 135 | 
            +
            # Define a function for later use
         | 
| 101 136 | 
             
            def create_caption(text)
         | 
| 102 137 | 
             
              [text.upcase, ("=" * text.length)].join "\n"
         | 
| 103 138 | 
             
            end
         | 
| 104 139 | 
             
            ```
         | 
| 105 140 |  | 
| 141 | 
            +
            All the examples below this line, will have the above function available:
         | 
| 142 | 
            +
             | 
| 106 143 | 
             
            ```ruby
         | 
| 107 | 
            -
            #  | 
| 144 | 
            +
            # Use a previously defined function
         | 
| 108 145 | 
             
            puts create_caption "tada!"
         | 
| 109 146 | 
             
            #=> TADA!
         | 
| 110 147 | 
             
            #=> =====
         | 
| 111 148 | 
             
            ```
         | 
| 112 149 |  | 
| 113 150 |  | 
| 114 | 
            -
             | 
| 151 | 
            +
            Finally, examples marked with a `shell` code fence will be executed by the
         | 
| 152 | 
            +
            shell, and not by ruby:
         | 
| 115 153 |  | 
| 116 154 | 
             
            ```shell
         | 
| 117 155 | 
             
            # Shell commands
         | 
| 118 156 | 
             
            echo hello world
         | 
| 119 157 | 
             
            #=> hello world
         | 
| 120 158 | 
             
            ```
         | 
| 159 | 
            +
             | 
| 160 | 
            +
             | 
    
        data/bin/docspec
    CHANGED
    
    | @@ -8,16 +8,16 @@ include Colsole | |
| 8 8 |  | 
| 9 9 | 
             
            document = ARGV[0] || 'README.md'
         | 
| 10 10 | 
             
            abort "File not found #{document}" unless File.exist? document
         | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 11 | 
            +
            document = Docspec::Document.from_file document
         | 
| 12 | 
            +
            document.test
         | 
| 13 13 |  | 
| 14 14 | 
             
            say ''
         | 
| 15 15 |  | 
| 16 | 
            -
            if success
         | 
| 17 | 
            -
              say "!txtgrn!#{ | 
| 16 | 
            +
            if document.success?
         | 
| 17 | 
            +
              say "!txtgrn!#{document.total_examples} tests, #{document.failed_examples} failed\n"
         | 
| 18 18 | 
             
              exit 0
         | 
| 19 19 | 
             
            else
         | 
| 20 | 
            -
              say "!txtred!#{ | 
| 20 | 
            +
              say "!txtred!#{document.total_examples} tests, #{document.failed_examples} failed\n"
         | 
| 21 21 | 
             
              exit 1
         | 
| 22 22 | 
             
            end
         | 
| 23 23 |  | 
    
        data/lib/docspec/document.rb
    CHANGED
    
    | @@ -1,13 +1,14 @@ | |
| 1 1 | 
             
            module Docspec
         | 
| 2 2 | 
             
              class Document
         | 
| 3 | 
            -
                 | 
| 3 | 
            +
                include Testable
         | 
| 4 | 
            +
                attr_reader :filename, :markdown
         | 
| 4 5 |  | 
| 5 | 
            -
                def  | 
| 6 | 
            -
                   | 
| 6 | 
            +
                def self.from_file(filename)
         | 
| 7 | 
            +
                  new File.read(filename)
         | 
| 7 8 | 
             
                end
         | 
| 8 9 |  | 
| 9 | 
            -
                def markdown
         | 
| 10 | 
            -
                  @markdown  | 
| 10 | 
            +
                def initialize(markdown)
         | 
| 11 | 
            +
                  @markdown = markdown
         | 
| 11 12 | 
             
                end
         | 
| 12 13 |  | 
| 13 14 | 
             
                def examples
         | 
| @@ -19,7 +20,8 @@ module Docspec | |
| 19 20 | 
             
                def examples!
         | 
| 20 21 | 
             
                  result = []
         | 
| 21 22 | 
             
                  markdown.scan(/```(ruby|shell)\s*\n(.*?)```/m) do |type, code|
         | 
| 22 | 
            -
                     | 
| 23 | 
            +
                    example = Example.new(code, type)
         | 
| 24 | 
            +
                    result << example unless example.skip?
         | 
| 23 25 | 
             
                  end
         | 
| 24 26 | 
             
                  result
         | 
| 25 27 | 
             
                end
         | 
    
        data/lib/docspec/example.rb
    CHANGED
    
    
| @@ -0,0 +1,57 @@ | |
| 1 | 
            +
            require 'colsole'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Docspec
         | 
| 4 | 
            +
              module Testable
         | 
| 5 | 
            +
                include Colsole
         | 
| 6 | 
            +
                attr_reader :failed_examples, :total_examples
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def before_codes
         | 
| 9 | 
            +
                  @before_codes ||= []
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def success?
         | 
| 13 | 
            +
                  failed_examples == 0
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def each_example
         | 
| 17 | 
            +
                  reset_counters
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  examples.each do |example|
         | 
| 20 | 
            +
                    if example.empty?
         | 
| 21 | 
            +
                      before_codes << example.code
         | 
| 22 | 
            +
                    else
         | 
| 23 | 
            +
                      @total_examples += 1
         | 
| 24 | 
            +
                      example.prepend before_codes
         | 
| 25 | 
            +
                      @failed_examples += 1 unless example.success? or example.ignore_failure?
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
                    
         | 
| 28 | 
            +
                    yield example
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                def test
         | 
| 33 | 
            +
                  each_example do |example|
         | 
| 34 | 
            +
                    if example.empty?
         | 
| 35 | 
            +
                      say "!txtpur!void :!txtrst! #{example.label}"          
         | 
| 36 | 
            +
                    elsif example.success?
         | 
| 37 | 
            +
                      say "!txtgrn!pass :!txtrst! #{example.label}"
         | 
| 38 | 
            +
                    else
         | 
| 39 | 
            +
                      say "!txtred!FAIL : #{example.label}"
         | 
| 40 | 
            +
                      say "---"
         | 
| 41 | 
            +
                      puts example.diff
         | 
| 42 | 
            +
                      say "---"
         | 
| 43 | 
            +
                    end
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              protected
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                def reset_counters
         | 
| 50 | 
            +
                  @before_codes = nil
         | 
| 51 | 
            +
                  @failed_examples = 0
         | 
| 52 | 
            +
                  @total_examples = 0
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
            end
         | 
| 57 | 
            +
             | 
    
        data/lib/docspec/version.rb
    CHANGED
    
    
    
        data/lib/docspec.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: docspec
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Danny Ben Shitrit
         | 
| @@ -65,7 +65,7 @@ files: | |
| 65 65 | 
             
            - lib/docspec/document.rb
         | 
| 66 66 | 
             
            - lib/docspec/example.rb
         | 
| 67 67 | 
             
            - lib/docspec/output_capturer.rb
         | 
| 68 | 
            -
            - lib/docspec/ | 
| 68 | 
            +
            - lib/docspec/testable.rb
         | 
| 69 69 | 
             
            - lib/docspec/version.rb
         | 
| 70 70 | 
             
            homepage: https://github.com/dannyben/docspec
         | 
| 71 71 | 
             
            licenses:
         | 
    
        data/lib/docspec/tester.rb
    DELETED
    
    | @@ -1,45 +0,0 @@ | |
| 1 | 
            -
            require 'colsole'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module Docspec
         | 
| 4 | 
            -
              class Tester
         | 
| 5 | 
            -
                include Colsole
         | 
| 6 | 
            -
                attr_reader :document, :errors, :total
         | 
| 7 | 
            -
             | 
| 8 | 
            -
                def initialize(document)
         | 
| 9 | 
            -
                  document = Document.new document unless document.is_a? Document
         | 
| 10 | 
            -
                  @document = document
         | 
| 11 | 
            -
                  @errors = 0
         | 
| 12 | 
            -
                  @total = 0
         | 
| 13 | 
            -
                end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                def before_codes
         | 
| 16 | 
            -
                  @before_codes ||= []
         | 
| 17 | 
            -
                end
         | 
| 18 | 
            -
             | 
| 19 | 
            -
                def execute
         | 
| 20 | 
            -
                  document.examples.each do |example|
         | 
| 21 | 
            -
                    if example.empty?
         | 
| 22 | 
            -
                      before_codes << example.code
         | 
| 23 | 
            -
                      next
         | 
| 24 | 
            -
                    end
         | 
| 25 | 
            -
             | 
| 26 | 
            -
                    @total += 1
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                    example.prepend before_codes
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                    if example.success?
         | 
| 31 | 
            -
                      say "!txtgrn!PASS: #{example.label}"
         | 
| 32 | 
            -
                    else
         | 
| 33 | 
            -
                      @errors += 1 unless example.ignore_failure?
         | 
| 34 | 
            -
                      say "!txtred!FAIL: #{example.label}"
         | 
| 35 | 
            -
                      say "---"
         | 
| 36 | 
            -
                      puts example.diff
         | 
| 37 | 
            -
                      say "---"
         | 
| 38 | 
            -
                    end
         | 
| 39 | 
            -
                  end
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                  errors == 0
         | 
| 42 | 
            -
                end
         | 
| 43 | 
            -
              end
         | 
| 44 | 
            -
            end
         | 
| 45 | 
            -
             |