notes 0.0.3 → 0.1.0.pre
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.
- data/CHANGELOG.rdoc +14 -0
 - data/LICENSE +6 -7
 - data/README.md +105 -0
 - data/bin/notes +60 -45
 - data/lib/notes.rb +23 -95
 - data/lib/notes/scanner.rb +52 -0
 - data/lib/notes/version.rb +4 -0
 - metadata +14 -25
 - data/README.rdoc +0 -90
 - data/test/data/sample.c +0 -58
 - data/test/notes_test.rb +0 -63
 
    
        data/CHANGELOG.rdoc
    CHANGED
    
    | 
         @@ -1,3 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            == 0.1.0-pre1
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Complete refactoring of Notes: LESS IS MORE!
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            * Defaults tags are now TODO, FIXME, and XXX.
         
     | 
| 
      
 6 
     | 
    
         
            +
            * Drop the Rak gem.
         
     | 
| 
      
 7 
     | 
    
         
            +
            * Yield on each note instead of returning the whole result set.
         
     | 
| 
      
 8 
     | 
    
         
            +
            * Grep style result display.
         
     | 
| 
      
 9 
     | 
    
         
            +
            * Notes now provides #scan or #scan_file methods, and a Scanner class.
         
     | 
| 
      
 10 
     | 
    
         
            +
            * An object (which respond to #read or #to_s) can extend Notes to add a #notes method.
         
     | 
| 
      
 11 
     | 
    
         
            +
            * Use the Paint gem for coloring.
         
     | 
| 
      
 12 
     | 
    
         
            +
            * Add an option not to colorize output.
         
     | 
| 
      
 13 
     | 
    
         
            +
            * Use minitest for test cases.
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
       1 
15 
     | 
    
         
             
            == 0.0.3
         
     | 
| 
       2 
16 
     | 
    
         | 
| 
       3 
17 
     | 
    
         
             
            Force rak version to 1.0
         
     | 
    
        data/LICENSE
    CHANGED
    
    | 
         @@ -1,7 +1,6 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
      
 1 
     | 
    
         
            +
            ----------------------------------------------------------------------------
         
     | 
| 
      
 2 
     | 
    
         
            +
            "THE BEER-WARE LICENSE" (Revision 42):
         
     | 
| 
      
 3 
     | 
    
         
            +
            <vivien@didelot.org> wrote this code. As long as you retain this notice you
         
     | 
| 
      
 4 
     | 
    
         
            +
            can do whatever you want with this stuff. If we meet some day, and you think
         
     | 
| 
      
 5 
     | 
    
         
            +
            this stuff is worth it, you can buy me a beer in return Vivien Didelot
         
     | 
| 
      
 6 
     | 
    
         
            +
            ----------------------------------------------------------------------------
         
     | 
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,105 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Notes
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            grep tags in source files
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            This gem provides a command line tool and a Ruby library to find tags in
         
     | 
| 
      
 6 
     | 
    
         
            +
            source code. Defaults tags are *TODO*, *FIXME*, and *XXX*.
         
     | 
| 
      
 7 
     | 
    
         
            +
            Custom tags can be found as well.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            It's kind of a generic version of the `rake notes` command,
         
     | 
| 
      
 10 
     | 
    
         
            +
            which is only available in Ruby on Rails applications.
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            ## Command line tool
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            Usage:
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                $ notes [options] [file...]
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            With no argument, `notes` will search recursively in the current
         
     | 
| 
      
 19 
     | 
    
         
            +
            directory. For details, see `notes --help`.
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            Examples:
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                $ notes
         
     | 
| 
      
 24 
     | 
    
         
            +
                $ notes foo.h src/
         
     | 
| 
      
 25 
     | 
    
         
            +
                $ notes --tag @@@
         
     | 
| 
      
 26 
     | 
    
         
            +
                $ notes --no-{todo,fixme,xxx} --tag FOO
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            ### Convention over configuration
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            Notes won't filter. `find`, `xargs` are here for you:
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                $ find . -name '*.rb' | xargs notes
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
            No custom output. It uses a grep-style display, which makes it easy to
         
     | 
| 
      
 35 
     | 
    
         
            +
            fit your needs. Try:
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                $ notes | cut -d: -f3,4-
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
            Or get the list of tagged files in the current directory with:
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                $ notes | cut -d: -f1 | sort -u
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            ## Installation
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
            Notes is available on [Rubygems.org](http://rubygems.org/gems/notes) and
         
     | 
| 
      
 46 
     | 
    
         
            +
            can be installed with:
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                $ [sudo] gem install notes
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
            ## The Notes library
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
            Module functions:
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                require 'notes'
         
     | 
| 
      
 55 
     | 
    
         
            +
                
         
     | 
| 
      
 56 
     | 
    
         
            +
                Notes.scan_file("foo.c") do |note|
         
     | 
| 
      
 57 
     | 
    
         
            +
                  puts "#{note.tag} found at line #{note.line}!"
         
     | 
| 
      
 58 
     | 
    
         
            +
                end
         
     | 
| 
      
 59 
     | 
    
         
            +
                
         
     | 
| 
      
 60 
     | 
    
         
            +
                Notes.scan("...\nXXX: an urgent note!") do |note|
         
     | 
| 
      
 61 
     | 
    
         
            +
                  putes note.text
         
     | 
| 
      
 62 
     | 
    
         
            +
                end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
            Extending the Notes module:
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                require 'notes'
         
     | 
| 
      
 67 
     | 
    
         
            +
                
         
     | 
| 
      
 68 
     | 
    
         
            +
                file = File.new("foo.c")
         
     | 
| 
      
 69 
     | 
    
         
            +
                file.extend Notes
         
     | 
| 
      
 70 
     | 
    
         
            +
                file.notes { |note| puts note.text }
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
            Using the Notes scanner:
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                require 'notes'
         
     | 
| 
      
 75 
     | 
    
         
            +
                
         
     | 
| 
      
 76 
     | 
    
         
            +
                scan = Notes::Scanner.new
         
     | 
| 
      
 77 
     | 
    
         
            +
                scan.tags = Notes::TAGS + "FOO"
         
     | 
| 
      
 78 
     | 
    
         
            +
                scan.on_note do |note|
         
     | 
| 
      
 79 
     | 
    
         
            +
                  puts "found!"
         
     | 
| 
      
 80 
     | 
    
         
            +
                end
         
     | 
| 
      
 81 
     | 
    
         
            +
                scan.scan_file("foo.c")
         
     | 
| 
      
 82 
     | 
    
         
            +
                scan.scan_file("bar.c")
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
            Create your own scanner:
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                require 'notes'
         
     | 
| 
      
 87 
     | 
    
         
            +
                
         
     | 
| 
      
 88 
     | 
    
         
            +
                class Foo < Notes::Scanner
         
     | 
| 
      
 89 
     | 
    
         
            +
                  attr_reader :notes
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                  def initialize tags = nil
         
     | 
| 
      
 92 
     | 
    
         
            +
                    super(tags)
         
     | 
| 
      
 93 
     | 
    
         
            +
                    @notes = []
         
     | 
| 
      
 94 
     | 
    
         
            +
                  end
         
     | 
| 
      
 95 
     | 
    
         
            +
                
         
     | 
| 
      
 96 
     | 
    
         
            +
                  # Called if no action block set. So override it.
         
     | 
| 
      
 97 
     | 
    
         
            +
                  def tag note
         
     | 
| 
      
 98 
     | 
    
         
            +
                    @notes << note
         
     | 
| 
      
 99 
     | 
    
         
            +
                  end
         
     | 
| 
      
 100 
     | 
    
         
            +
                end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
            License
         
     | 
| 
      
 103 
     | 
    
         
            +
            -------
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
            That's free for sure! See the LICENSE file.
         
     | 
    
        data/bin/notes
    CHANGED
    
    | 
         @@ -1,65 +1,80 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #!/usr/bin/env ruby
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            #  
     | 
| 
      
 3 
     | 
    
         
            +
            # ----------------------------------------------------------------------------
         
     | 
| 
       4 
4 
     | 
    
         
             
            # "THE BEER-WARE LICENSE" (Revision 42):
         
     | 
| 
       5 
     | 
    
         
            -
            # <vivien 
     | 
| 
       6 
     | 
    
         
            -
            #  
     | 
| 
       7 
     | 
    
         
            -
            #  
     | 
| 
       8 
     | 
    
         
            -
            #  
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
            # Command line tool to grep annotations from source files.
         
     | 
| 
       11 
     | 
    
         
            -
            # Author:: Vivien 'v0n' Didelot <vivien.didelot@gmail.com>
         
     | 
| 
      
 5 
     | 
    
         
            +
            # <vivien@didelot.org> wrote this file. As long as you retain this notice you
         
     | 
| 
      
 6 
     | 
    
         
            +
            # can do whatever you want with this stuff. If we meet some day, and you think
         
     | 
| 
      
 7 
     | 
    
         
            +
            # this stuff is worth it, you can buy me a beer in return Vivien Didelot
         
     | 
| 
      
 8 
     | 
    
         
            +
            # ----------------------------------------------------------------------------
         
     | 
| 
       12 
9 
     | 
    
         | 
| 
       13 
10 
     | 
    
         
             
            require 'notes'
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
            require 'rainbow'
         
     | 
| 
       16 
11 
     | 
    
         
             
            require 'optparse'
         
     | 
| 
      
 12 
     | 
    
         
            +
            require 'paint'
         
     | 
| 
      
 13 
     | 
    
         
            +
            require 'find'
         
     | 
| 
       17 
14 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
      
 15 
     | 
    
         
            +
            # grep-style display
         
     | 
| 
      
 16 
     | 
    
         
            +
            def pretty_print(note, colors)
         
     | 
| 
      
 17 
     | 
    
         
            +
              col = Paint[':', :cyan]
         
     | 
| 
      
 18 
     | 
    
         
            +
              format = Paint['%s', :magenta] + col
         
     | 
| 
      
 19 
     | 
    
         
            +
              format << Paint['%s', :green] + col
         
     | 
| 
      
 20 
     | 
    
         
            +
              format << Paint['%s', colors[note.tag] || colors[:custom], :bold] + col
         
     | 
| 
      
 21 
     | 
    
         
            +
              format << "%s\n"
         
     | 
| 
      
 22 
     | 
    
         
            +
              printf(format,
         
     | 
| 
      
 23 
     | 
    
         
            +
                     note.source,
         
     | 
| 
      
 24 
     | 
    
         
            +
                     note.line,
         
     | 
| 
      
 25 
     | 
    
         
            +
                     note.tag,
         
     | 
| 
      
 26 
     | 
    
         
            +
                     note.text.rstrip)
         
     | 
| 
       30 
27 
     | 
    
         
             
            end
         
     | 
| 
       31 
28 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
            tags =  
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
      
 29 
     | 
    
         
            +
            tags = Notes::TAGS.dup
         
     | 
| 
      
 30 
     | 
    
         
            +
            colors = {
         
     | 
| 
      
 31 
     | 
    
         
            +
              "TODO"  => 'green',
         
     | 
| 
      
 32 
     | 
    
         
            +
              "FIXME" => 'yellow',
         
     | 
| 
      
 33 
     | 
    
         
            +
              "XXX"   => 'red',
         
     | 
| 
      
 34 
     | 
    
         
            +
              :custom => 'cyan'
         
     | 
| 
      
 35 
     | 
    
         
            +
            }
         
     | 
| 
       35 
36 
     | 
    
         | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
              o.banner = "Usage: #{File.basename $0} [options] [file...]\n"
         
     | 
| 
       38 
     | 
    
         
            -
              o.banner << "Search recursively for annotations in source code.\n"
         
     | 
| 
       39 
     | 
    
         
            -
              o.banner << "By default, #{File.basename $0} will search for all annotations in current directory.\n"
         
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
              o.on_head("Available options:")
         
     | 
| 
       42 
     | 
    
         
            -
              o.on("-a", "--all",                "Search TODO, FIXME and OPTIMIZE annotations") { tags << AnnotationExtractor::TAGS }
         
     | 
| 
       43 
     | 
    
         
            -
              o.on("-t", "--todo",               "Search TODO annotations")                     { tags << "TODO" }
         
     | 
| 
       44 
     | 
    
         
            -
              o.on("-f", "--fixme",              "Search FIXME annotations")                    { tags << "FIXME" }
         
     | 
| 
       45 
     | 
    
         
            -
              o.on("-z", "--optimize",           "Search OPTIMIZE annotations")                 { tags << "OPTIMIZE" }
         
     | 
| 
       46 
     | 
    
         
            -
              o.on("-c", "--custom=TAG", String, "Search TAG annotations")                      { |v| tags << v }
         
     | 
| 
       47 
     | 
    
         
            -
              o.on("-o", "--out=FILE",   String, "Save output in FILE")                         { |v| file = v }
         
     | 
| 
       48 
     | 
    
         
            -
              o.on("-v", "--version",            "Print notes version")                         { puts "notes: version #{AnnotationExtractor::VERSION}" ; exit }
         
     | 
| 
      
 37 
     | 
    
         
            +
            usage = 'Usage: notes [OPTION]... [FILE]...'
         
     | 
| 
       49 
38 
     | 
    
         | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
      
 39 
     | 
    
         
            +
            ARGV.options do |o|
         
     | 
| 
      
 40 
     | 
    
         
            +
              o.version = Notes::VERSION
         
     | 
| 
      
 41 
     | 
    
         
            +
              o.banner = usage
         
     | 
| 
      
 42 
     | 
    
         
            +
              o.on(      '--no-todo',  'Do not search TODO tags')  { tags -= ['TODO'] }
         
     | 
| 
      
 43 
     | 
    
         
            +
              o.on(      '--no-fixme', 'Do not search FIXME tags') { tags -= ['FIXME'] }
         
     | 
| 
      
 44 
     | 
    
         
            +
              o.on(      '--no-xxx',   'Do not search XXX tags')   { tags -= ['XXX'] }
         
     | 
| 
      
 45 
     | 
    
         
            +
              o.on('-t', '--tag=TAG',  'Search TAG tags')          { |tag| tags |= [tag] }
         
     | 
| 
      
 46 
     | 
    
         
            +
              o.on(      '--no-color', 'Do not colorize ouput')    { Paint.mode = 0 }
         
     | 
| 
       51 
47 
     | 
    
         
             
            end
         
     | 
| 
       52 
48 
     | 
    
         | 
| 
       53 
49 
     | 
    
         
             
            begin
         
     | 
| 
       54 
50 
     | 
    
         
             
              ARGV.options.parse!
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
               
     | 
| 
      
 51 
     | 
    
         
            +
            rescue => e
         
     | 
| 
      
 52 
     | 
    
         
            +
              STDERR.puts "notes: #{e.message}"
         
     | 
| 
      
 53 
     | 
    
         
            +
              STDERR.puts usage
         
     | 
| 
      
 54 
     | 
    
         
            +
              STDERR.puts "Try `notes --help' for more information."
         
     | 
| 
      
 55 
     | 
    
         
            +
              exit 1
         
     | 
| 
      
 56 
     | 
    
         
            +
            end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            scanner = Notes::Scanner.new
         
     | 
| 
      
 59 
     | 
    
         
            +
            scanner.look_for tags
         
     | 
| 
      
 60 
     | 
    
         
            +
            scanner.on_note do |note|
         
     | 
| 
      
 61 
     | 
    
         
            +
              pretty_print(note, colors)
         
     | 
| 
      
 62 
     | 
    
         
            +
            end
         
     | 
| 
       57 
63 
     | 
    
         | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
      
 64 
     | 
    
         
            +
            paths = ARGV.dup
         
     | 
| 
      
 65 
     | 
    
         
            +
            paths.empty? and paths << Dir.pwd
         
     | 
| 
       59 
66 
     | 
    
         | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
      
 67 
     | 
    
         
            +
            Find.find(*paths) do |path|
         
     | 
| 
      
 68 
     | 
    
         
            +
              unless paths.include? path
         
     | 
| 
      
 69 
     | 
    
         
            +
                Find.prune if File.basename(path).start_with? '.'
         
     | 
| 
      
 70 
     | 
    
         
            +
              end
         
     | 
| 
      
 71 
     | 
    
         
            +
              next if File.directory? path
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
              begin
         
     | 
| 
      
 74 
     | 
    
         
            +
                scanner.scan_file(path)
         
     | 
| 
      
 75 
     | 
    
         
            +
              rescue => e
         
     | 
| 
      
 76 
     | 
    
         
            +
                STDERR.puts "notes: #{path}: #{e.message}"
         
     | 
| 
      
 77 
     | 
    
         
            +
              end
         
     | 
| 
       63 
78 
     | 
    
         
             
            end
         
     | 
| 
       64 
79 
     | 
    
         | 
| 
       65 
80 
     | 
    
         
             
            exit
         
     | 
    
        data/lib/notes.rb
    CHANGED
    
    | 
         @@ -5,108 +5,36 @@ 
     | 
|
| 
       5 
5 
     | 
    
         
             
            # think this stuff is worth it, you can buy me a beer in return. Vivien Didelot
         
     | 
| 
       6 
6 
     | 
    
         
             
            # ------------------------------------------------------------------------------
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
            require ' 
     | 
| 
       10 
     | 
    
         
            -
            require 'rak'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require 'notes/version'
         
     | 
| 
      
 9 
     | 
    
         
            +
            require 'notes/scanner'
         
     | 
| 
       11 
10 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
              VERSION = "0.0.3"
         
     | 
| 
      
 11 
     | 
    
         
            +
            module Notes
         
     | 
| 
       14 
12 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
              #  
     | 
| 
       16 
     | 
    
         
            -
               
     | 
| 
       17 
     | 
    
         
            -
                attr_accessor :file, :line, :tag, :text
         
     | 
| 
      
 13 
     | 
    
         
            +
              # Default tags to grep in source code.
         
     | 
| 
      
 14 
     | 
    
         
            +
              TAGS = %w[TODO FIXME XXX]
         
     | 
| 
       18 
15 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                def initialize(args)
         
     | 
| 
       21 
     | 
    
         
            -
                  @file = args[:file]
         
     | 
| 
       22 
     | 
    
         
            -
                  @line = args[:line]
         
     | 
| 
       23 
     | 
    
         
            -
                  @tag = args[:tag]
         
     | 
| 
       24 
     | 
    
         
            -
                  @text = args[:text]
         
     | 
| 
       25 
     | 
    
         
            -
                end
         
     | 
| 
       26 
     | 
    
         
            -
              end
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
              # Default tags list
         
     | 
| 
       29 
     | 
    
         
            -
              TAGS = ["TODO", "FIXME", "OPTIMIZE"]
         
     | 
| 
      
 16 
     | 
    
         
            +
              Note = Struct.new(:tag, :text, :line, :source)
         
     | 
| 
       30 
17 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
              #  
     | 
| 
       32 
     | 
    
         
            -
               
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
                 
     | 
| 
       36 
     | 
    
         
            -
                def tags=(tags)
         
     | 
| 
       37 
     | 
    
         
            -
                  @tags = tags.is_a?(Array) ? tags : [tags]
         
     | 
| 
       38 
     | 
    
         
            -
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
              # TODO doc
         
     | 
| 
      
 19 
     | 
    
         
            +
              def self.scan(source, tags = nil, &block)
         
     | 
| 
      
 20 
     | 
    
         
            +
                block.nil? and return enum_for(__method__, source, tags, &block)
         
     | 
| 
      
 21 
     | 
    
         
            +
                scanner = Scanner.new(tags, &block)
         
     | 
| 
      
 22 
     | 
    
         
            +
                scanner.scan(source)
         
     | 
| 
       39 
23 
     | 
    
         
             
              end
         
     | 
| 
       40 
24 
     | 
    
         | 
| 
       41 
     | 
    
         
            -
              #  
     | 
| 
       42 
     | 
    
         
            -
               
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
                @source = [].push(source).flatten
         
     | 
| 
       47 
     | 
    
         
            -
                @list = Array.new
         
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
                extract
         
     | 
| 
      
 25 
     | 
    
         
            +
              # TODO doc
         
     | 
| 
      
 26 
     | 
    
         
            +
              def self.scan_file(file, tags = nil, &block)
         
     | 
| 
      
 27 
     | 
    
         
            +
                block.nil? and return enum_for(__method__, file, tags, &block)
         
     | 
| 
      
 28 
     | 
    
         
            +
                scanner = Scanner.new(tags, &block)
         
     | 
| 
      
 29 
     | 
    
         
            +
                scanner.scan_file(file)
         
     | 
| 
       50 
30 
     | 
    
         
             
              end
         
     | 
| 
       51 
31 
     | 
    
         | 
| 
       52 
     | 
    
         
            -
              #  
     | 
| 
       53 
     | 
    
         
            -
              def  
     | 
| 
       54 
     | 
    
         
            -
                 
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
              def write(file)
         
     | 
| 
       59 
     | 
    
         
            -
                longest_tag = @list.max { |a, b| a.tag.size <=> b.tag.size }.tag.size
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
                File.open(file, 'w') do |f|
         
     | 
| 
       62 
     | 
    
         
            -
                  @list.each do |a|
         
     | 
| 
       63 
     | 
    
         
            -
                    f.write(sprintf(" * [%-#{longest_tag}s] %s (%s): %s\n",
         
     | 
| 
       64 
     | 
    
         
            -
                                    a.tag, a.file, a.line, a.text))
         
     | 
| 
       65 
     | 
    
         
            -
                  end
         
     | 
| 
       66 
     | 
    
         
            -
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
              # TODO doc
         
     | 
| 
      
 33 
     | 
    
         
            +
              def notes(tags = nil, &block)
         
     | 
| 
      
 34 
     | 
    
         
            +
                block.nil? and return enum_for(__method__, tags, &block)
         
     | 
| 
      
 35 
     | 
    
         
            +
                scanner = Scanner.new(tags, &block)
         
     | 
| 
      
 36 
     | 
    
         
            +
                source = (self.respond_to? :read) ? self.read : self.to_s
         
     | 
| 
      
 37 
     | 
    
         
            +
                scanner.scan(source)
         
     | 
| 
       67 
38 
     | 
    
         
             
              end
         
     | 
| 
       68 
39 
     | 
    
         | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
              # Extract annotations.
         
     | 
| 
       72 
     | 
    
         
            -
              def extract
         
     | 
| 
       73 
     | 
    
         
            -
                tags = self.class.tags.join("|")
         
     | 
| 
       74 
     | 
    
         
            -
                suffix = "\s?:?" # Allowed annotation suffix.
         
     | 
| 
       75 
     | 
    
         
            -
                source = @source.join(" ")
         
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
       77 
     | 
    
         
            -
                # Because of different rak versions,
         
     | 
| 
       78 
     | 
    
         
            -
                # rak system call outputs are not similar.
         
     | 
| 
       79 
     | 
    
         
            -
                if `rak --version` =~ /rak (\d\.\d)/
         
     | 
| 
       80 
     | 
    
         
            -
                  rak_version = $1
         
     | 
| 
       81 
     | 
    
         
            -
                else
         
     | 
| 
       82 
     | 
    
         
            -
                  raise "Can't get rak version"
         
     | 
| 
       83 
     | 
    
         
            -
                end
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
                # 0.9 is the current rak version from rubygems.
         
     | 
| 
       86 
     | 
    
         
            -
                # 1.1 is the current rak version from the github repo.
         
     | 
| 
       87 
     | 
    
         
            -
                if rak_version == "1.1"
         
     | 
| 
       88 
     | 
    
         
            -
                  #TODO /^(.+):(\d+):...?
         
     | 
| 
       89 
     | 
    
         
            -
                  regex = /^(.*):(\d*):.*(#{tags})#{suffix}(.*)$/
         
     | 
| 
       90 
     | 
    
         
            -
                else
         
     | 
| 
       91 
     | 
    
         
            -
                  regex = /^([^\s]+)\s+(\d+)\|.*(#{tags})#{suffix}(.*)$/
         
     | 
| 
       92 
     | 
    
         
            -
                end
         
     | 
| 
       93 
     | 
    
         
            -
                # TODO extract first matching annotation if there're many on a line.
         
     | 
| 
       94 
     | 
    
         
            -
                # e.g. "TODO: Rename $TODOLIST variable."
         
     | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
       96 
     | 
    
         
            -
                out = `rak '(#{tags})#{suffix}\s+' #{source}`.strip
         
     | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
       98 
     | 
    
         
            -
                @list = out.split("\n").map do |l|
         
     | 
| 
       99 
     | 
    
         
            -
                  if l =~ regex
         
     | 
| 
       100 
     | 
    
         
            -
                    Annotation.new({
         
     | 
| 
       101 
     | 
    
         
            -
                      :file => $1,
         
     | 
| 
       102 
     | 
    
         
            -
                      :line => $2.to_i,
         
     | 
| 
       103 
     | 
    
         
            -
                      :tag => $3,
         
     | 
| 
       104 
     | 
    
         
            -
                      :text => $4.strip
         
     | 
| 
       105 
     | 
    
         
            -
                    })
         
     | 
| 
       106 
     | 
    
         
            -
                  else
         
     | 
| 
       107 
     | 
    
         
            -
                    # Just for a debug purpose
         
     | 
| 
       108 
     | 
    
         
            -
                    raise "notes: does not match regexp => \"#{l}\""
         
     | 
| 
       109 
     | 
    
         
            -
                  end
         
     | 
| 
       110 
     | 
    
         
            -
                end
         
     | 
| 
       111 
     | 
    
         
            -
              end
         
     | 
| 
       112 
     | 
    
         
            -
            end
         
     | 
| 
      
 40 
     | 
    
         
            +
            end # Notes
         
     | 
| 
         @@ -0,0 +1,52 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Notes
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Scanner
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
                attr_accessor :tags, :action
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                # TODO doc
         
     | 
| 
      
 7 
     | 
    
         
            +
                def initialize tags = nil, &block
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @tags = tags || TAGS.dup
         
     | 
| 
      
 9 
     | 
    
         
            +
                  @action = block || proc { |note| tag(note) }
         
     | 
| 
      
 10 
     | 
    
         
            +
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                # TODO doc
         
     | 
| 
      
 13 
     | 
    
         
            +
                alias look_for tags=
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                # TODO doc
         
     | 
| 
      
 16 
     | 
    
         
            +
                def on_note &block
         
     | 
| 
      
 17 
     | 
    
         
            +
                  @action = block
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                # TODO doc
         
     | 
| 
      
 21 
     | 
    
         
            +
                def scan source
         
     | 
| 
      
 22 
     | 
    
         
            +
                  source.split("\n").each_with_index do |line, i|
         
     | 
| 
      
 23 
     | 
    
         
            +
                    if line =~ regexp
         
     | 
| 
      
 24 
     | 
    
         
            +
                      @action.call Note.new($1, line, i + 1)
         
     | 
| 
      
 25 
     | 
    
         
            +
                    end
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                # TODO doc
         
     | 
| 
      
 30 
     | 
    
         
            +
                def scan_file path
         
     | 
| 
      
 31 
     | 
    
         
            +
                  file = File.open(path, 'r')
         
     | 
| 
      
 32 
     | 
    
         
            +
                  file.each_with_index do |line, i|
         
     | 
| 
      
 33 
     | 
    
         
            +
                    if line =~ regexp
         
     | 
| 
      
 34 
     | 
    
         
            +
                      @action.call Note.new($1, line, i + 1, path)
         
     | 
| 
      
 35 
     | 
    
         
            +
                    end
         
     | 
| 
      
 36 
     | 
    
         
            +
                  end
         
     | 
| 
      
 37 
     | 
    
         
            +
                  file.close
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                # TODO doc
         
     | 
| 
      
 41 
     | 
    
         
            +
                def tag note
         
     | 
| 
      
 42 
     | 
    
         
            +
                  puts "#{note.type} on line #{note.line}: #{note.text.strip}"
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                private
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                def regexp
         
     | 
| 
      
 48 
     | 
    
         
            +
                  /\b(#{@tags.join('|')})\b/
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
              end # Scanner
         
     | 
| 
      
 52 
     | 
    
         
            +
            end # Notes
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,38 +1,27 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: notes
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.0. 
     | 
| 
       5 
     | 
    
         
            -
              prerelease: 
         
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.1.0.pre
         
     | 
| 
      
 5 
     | 
    
         
            +
              prerelease: 6
         
     | 
| 
       6 
6 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       7 
7 
     | 
    
         
             
            authors:
         
     | 
| 
       8 
8 
     | 
    
         
             
            - Vivien Didelot
         
     | 
| 
       9 
9 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date:  
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2012-02-09 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
       14 
14 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
     | 
    
         
            -
              name:  
     | 
| 
       16 
     | 
    
         
            -
              requirement: & 
     | 
| 
       17 
     | 
    
         
            -
                none: false
         
     | 
| 
       18 
     | 
    
         
            -
                requirements:
         
     | 
| 
       19 
     | 
    
         
            -
                - - =
         
     | 
| 
       20 
     | 
    
         
            -
                  - !ruby/object:Gem::Version
         
     | 
| 
       21 
     | 
    
         
            -
                    version: '1.0'
         
     | 
| 
       22 
     | 
    
         
            -
              type: :runtime
         
     | 
| 
       23 
     | 
    
         
            -
              prerelease: false
         
     | 
| 
       24 
     | 
    
         
            -
              version_requirements: *83676280
         
     | 
| 
       25 
     | 
    
         
            -
            - !ruby/object:Gem::Dependency
         
     | 
| 
       26 
     | 
    
         
            -
              name: rainbow
         
     | 
| 
       27 
     | 
    
         
            -
              requirement: &83675860 !ruby/object:Gem::Requirement
         
     | 
| 
      
 15 
     | 
    
         
            +
              name: paint
         
     | 
| 
      
 16 
     | 
    
         
            +
              requirement: &20331680 !ruby/object:Gem::Requirement
         
     | 
| 
       28 
17 
     | 
    
         
             
                none: false
         
     | 
| 
       29 
18 
     | 
    
         
             
                requirements:
         
     | 
| 
       30 
19 
     | 
    
         
             
                - - ! '>='
         
     | 
| 
       31 
20 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       32 
     | 
    
         
            -
                    version:  
     | 
| 
      
 21 
     | 
    
         
            +
                    version: 0.8.4
         
     | 
| 
       33 
22 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       34 
23 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       35 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 24 
     | 
    
         
            +
              version_requirements: *20331680
         
     | 
| 
       36 
25 
     | 
    
         
             
            description: 
         
     | 
| 
       37 
26 
     | 
    
         
             
            email: vivien.didelot@gmail.com
         
     | 
| 
       38 
27 
     | 
    
         
             
            executables:
         
     | 
| 
         @@ -41,9 +30,9 @@ extensions: [] 
     | 
|
| 
       41 
30 
     | 
    
         
             
            extra_rdoc_files: []
         
     | 
| 
       42 
31 
     | 
    
         
             
            files:
         
     | 
| 
       43 
32 
     | 
    
         
             
            - lib/notes.rb
         
     | 
| 
       44 
     | 
    
         
            -
            -  
     | 
| 
       45 
     | 
    
         
            -
            -  
     | 
| 
       46 
     | 
    
         
            -
            - README. 
     | 
| 
      
 33 
     | 
    
         
            +
            - lib/notes/scanner.rb
         
     | 
| 
      
 34 
     | 
    
         
            +
            - lib/notes/version.rb
         
     | 
| 
      
 35 
     | 
    
         
            +
            - README.md
         
     | 
| 
       47 
36 
     | 
    
         
             
            - CHANGELOG.rdoc
         
     | 
| 
       48 
37 
     | 
    
         
             
            - LICENSE
         
     | 
| 
       49 
38 
     | 
    
         
             
            - bin/notes
         
     | 
| 
         @@ -62,13 +51,13 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       62 
51 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       63 
52 
     | 
    
         
             
              none: false
         
     | 
| 
       64 
53 
     | 
    
         
             
              requirements:
         
     | 
| 
       65 
     | 
    
         
            -
              - - ! ' 
     | 
| 
      
 54 
     | 
    
         
            +
              - - ! '>'
         
     | 
| 
       66 
55 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       67 
     | 
    
         
            -
                  version:  
     | 
| 
      
 56 
     | 
    
         
            +
                  version: 1.3.1
         
     | 
| 
       68 
57 
     | 
    
         
             
            requirements: []
         
     | 
| 
       69 
58 
     | 
    
         
             
            rubyforge_project: 
         
     | 
| 
       70 
     | 
    
         
            -
            rubygems_version: 1.8. 
     | 
| 
      
 59 
     | 
    
         
            +
            rubygems_version: 1.8.15
         
     | 
| 
       71 
60 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       72 
61 
     | 
    
         
             
            specification_version: 3
         
     | 
| 
       73 
     | 
    
         
            -
            summary: A Ruby gem to grep  
     | 
| 
      
 62 
     | 
    
         
            +
            summary: A Ruby gem to grep tags in source files.
         
     | 
| 
       74 
63 
     | 
    
         
             
            test_files: []
         
     | 
    
        data/README.rdoc
    DELETED
    
    | 
         @@ -1,90 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            = Notes
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            == grep annotations in source files
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            This lib provides a Ruby library and command line tool to find annotations in source files such as:
         
     | 
| 
       6 
     | 
    
         
            -
            * TODO
         
     | 
| 
       7 
     | 
    
         
            -
            * FIXME
         
     | 
| 
       8 
     | 
    
         
            -
            * OPTIMIZE
         
     | 
| 
       9 
     | 
    
         
            -
            Custom tags can also be found.
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
            The purpose of this code is to get a generic version of the `rake notes' command (only used for Ruby on Rails applications).
         
     | 
| 
       12 
     | 
    
         
            -
            It will look for tags recursively in every given files (or in current directory by default).
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
            == Installation
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
            Notes is available on Rubygems.org[http://rubygems.org/gems/notes] and can be installed with:
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
              $ gem install notes
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
            This command needs Rubygems (rubygems package on Ubuntu).
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
            Note: it depends on rak version = 1.0 and rainbow version >= 1.1.
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
            == Usage
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
            === Command line tool
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
              notes [options] [file...]
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
            For details, see the help.
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
              $ ruby notes --help
         
     | 
| 
       33 
     | 
    
         
            -
              Usage: notes [options] [file...]
         
     | 
| 
       34 
     | 
    
         
            -
              Search recursively for annotations in source code.
         
     | 
| 
       35 
     | 
    
         
            -
              By default, notes will search for all annotations in current directory.
         
     | 
| 
       36 
     | 
    
         
            -
              Available options:
         
     | 
| 
       37 
     | 
    
         
            -
                  -a, --all                        Search TODO, FIXME and OPTIMIZE annotations
         
     | 
| 
       38 
     | 
    
         
            -
                  -t, --todo                       Search TODO annotations
         
     | 
| 
       39 
     | 
    
         
            -
                  -f, --fixme                      Search FIXME annotations
         
     | 
| 
       40 
     | 
    
         
            -
                  -z, --optimize                   Search OPTIMIZE annotations
         
     | 
| 
       41 
     | 
    
         
            -
                  -c, --custom=TAG                 Search TAG annotations
         
     | 
| 
       42 
     | 
    
         
            -
                  -o, --out=FILE                   Save output in FILE
         
     | 
| 
       43 
     | 
    
         
            -
                  -v, --version                    Print notes version
         
     | 
| 
       44 
     | 
    
         
            -
              Example: notes -ac IMPROVE test.c lib
         
     | 
| 
       45 
     | 
    
         
            -
              will search for TODO, FIXME, OPTIMIZE and IMPROVE annotations in test.c file and lib directory.
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
            Another example:
         
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
              $ notes test/data/sample.c
         
     | 
| 
       50 
     | 
    
         
            -
              ../test/data/sample.c:16: TODO: first thing to do
         
     | 
| 
       51 
     | 
    
         
            -
              ../test/data/sample.c:26: FIXME: first fixme thing
         
     | 
| 
       52 
     | 
    
         
            -
              ../test/data/sample.c:32: TODO: second todo thing!
         
     | 
| 
       53 
     | 
    
         
            -
              ../test/data/sample.c:42: OPTIMIZE: make it better
         
     | 
| 
       54 
     | 
    
         
            -
              ../test/data/sample.c:47: TODO: hello world
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
            If the terminal allows it, colors will be displayed for files and tags.
         
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
            Another again:
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
              $ notes -o TODO.txt test/data/sample.c
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
            will write all notes to a TODO.txt file. It will look like that:
         
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
               * [TODO    ] ../test/data/sample.c (16): first thing to do
         
     | 
| 
       65 
     | 
    
         
            -
               * [FIXME   ] ../test/data/sample.c (26): first fixme thing
         
     | 
| 
       66 
     | 
    
         
            -
               * [TODO    ] ../test/data/sample.c (32): second todo thing!
         
     | 
| 
       67 
     | 
    
         
            -
               * [OPTIMIZE] ../test/data/sample.c (42): make it better
         
     | 
| 
       68 
     | 
    
         
            -
               * [TODO    ] ../test/data/sample.c (47): hello world
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
            === Lib
         
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
            This code can be used as a Ruby lib. Let's see how it works in irb:
         
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
              $ irb
         
     | 
| 
       75 
     | 
    
         
            -
              >> require 'notes'
         
     | 
| 
       76 
     | 
    
         
            -
              >> AnnotationExtractor.tags << "FOO"                    # Add custom tag
         
     | 
| 
       77 
     | 
    
         
            -
              >> notes = AnnotationExtractor.new "test/data/sample.c" # Parse file
         
     | 
| 
       78 
     | 
    
         
            -
              >> notes.list                                           # Return the array of annotations
         
     | 
| 
       79 
     | 
    
         
            -
              >> notes.get "FIXME"                                    # Return the array of FIXME annotations only
         
     | 
| 
       80 
     | 
    
         
            -
              >> notes.write "TODO.rdoc"                              # Write all annotations in a file
         
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
            == License
         
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
     | 
    
         
            -
              ------------------------------------------------------------------------------
         
     | 
| 
       85 
     | 
    
         
            -
               "THE BEER-WARE LICENSE" (Revision 42):
         
     | 
| 
       86 
     | 
    
         
            -
               <vivien.didelot@gmail.com> wrote this gem. As long as you retain this notice
         
     | 
| 
       87 
     | 
    
         
            -
               you can do whatever you want with this stuff. If we meet some day, and you
         
     | 
| 
       88 
     | 
    
         
            -
               think this stuff is worth it, you can buy me a beer in return. Vivien Didelot
         
     | 
| 
       89 
     | 
    
         
            -
              ------------------------------------------------------------------------------
         
     | 
| 
       90 
     | 
    
         
            -
             
     | 
    
        data/test/data/sample.c
    DELETED
    
    | 
         @@ -1,58 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            /*
         
     | 
| 
       2 
     | 
    
         
            -
             * -----------------------------------------------------------------------------
         
     | 
| 
       3 
     | 
    
         
            -
             * "THE BEER-WARE LICENSE" (Revision 42):
         
     | 
| 
       4 
     | 
    
         
            -
             * <vivien.didelot@gmail.com> wrote this file. As long as you retain this notice
         
     | 
| 
       5 
     | 
    
         
            -
             * you can do whatever you want with this stuff. If we meet some day, and you
         
     | 
| 
       6 
     | 
    
         
            -
             * think this stuff is worth it, you can buy me a beer in return. Vivien Didelot
         
     | 
| 
       7 
     | 
    
         
            -
             * -----------------------------------------------------------------------------
         
     | 
| 
       8 
     | 
    
         
            -
             */
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
            /* UDP Server */
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
            #include <netinet/in.h>
         
     | 
| 
       13 
     | 
    
         
            -
            #include <stdio.h>
         
     | 
| 
       14 
     | 
    
         
            -
            #include <stdlib.h>
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
            //TODO first thing to do
         
     | 
| 
       17 
     | 
    
         
            -
            #define STEP sizeof(char)
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
            int main()
         
     | 
| 
       20 
     | 
    
         
            -
            {
         
     | 
| 
       21 
     | 
    
         
            -
                int sock;
         
     | 
| 
       22 
     | 
    
         
            -
                size_t size = STEP;
         
     | 
| 
       23 
     | 
    
         
            -
                size_t a_size = sizeof(struct sockaddr_in);
         
     | 
| 
       24 
     | 
    
         
            -
                void *buffer = malloc(STEP);
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                //FIXME: first fixme thing
         
     | 
| 
       27 
     | 
    
         
            -
                int port = 4242;
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                /* address server sock */
         
     | 
| 
       30 
     | 
    
         
            -
                struct sockaddr_in addr = {AF_INET, htons(port), {htonl(INADDR_ANY)}};
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
                //TODO : second todo thing!
         
     | 
| 
       33 
     | 
    
         
            -
                /* client sock */
         
     | 
| 
       34 
     | 
    
         
            -
                struct sockaddr_in client;
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                /* socket declaration */
         
     | 
| 
       37 
     | 
    
         
            -
                sock = socket(AF_INET, SOCK_DGRAM, 0);
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                /* bind socket to local */
         
     | 
| 
       40 
     | 
    
         
            -
                bind(sock, (struct sockaddr*) &addr, sizeof(struct sockaddr_in));
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                //OPTIMIZE make it better  
         
     | 
| 
       43 
     | 
    
         
            -
                while(1)
         
     | 
| 
       44 
     | 
    
         
            -
                {
         
     | 
| 
       45 
     | 
    
         
            -
                    //FOO a custom tag
         
     | 
| 
       46 
     | 
    
         
            -
                    //FOOBAR this should not be found if 'FOO' is asked. Same thing for:
         
     | 
| 
       47 
     | 
    
         
            -
                    //TODOLIST blah blah
         
     | 
| 
       48 
     | 
    
         
            -
                    //TODO_LIST etc.
         
     | 
| 
       49 
     | 
    
         
            -
                    while (recvfrom(sock, buffer, size, MSG_PEEK, NULL, NULL) == size)
         
     | 
| 
       50 
     | 
    
         
            -
                        buffer = realloc(buffer, size += STEP); //TODO hello world
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
                    recvfrom(sock, buffer, size, 0, (struct sockaddr*) &client, &a_size);
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
                    printf("Server receive: \"%s\"\n", (char*) buffer);
         
     | 
| 
       55 
     | 
    
         
            -
                }
         
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
                return 0;
         
     | 
| 
       58 
     | 
    
         
            -
            }
         
     | 
    
        data/test/notes_test.rb
    DELETED
    
    | 
         @@ -1,63 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            # ------------------------------------------------------------------------------
         
     | 
| 
       2 
     | 
    
         
            -
            # "THE BEER-WARE LICENSE" (Revision 42):
         
     | 
| 
       3 
     | 
    
         
            -
            # <vivien.didelot@gmail.com> wrote this file. As long as you retain this notice
         
     | 
| 
       4 
     | 
    
         
            -
            # you can do whatever you want with this stuff. If we meet some day, and you
         
     | 
| 
       5 
     | 
    
         
            -
            # think this stuff is worth it, you can buy me a beer in return. Vivien Didelot
         
     | 
| 
       6 
     | 
    
         
            -
            # ------------------------------------------------------------------------------
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
            require "test/unit"
         
     | 
| 
       9 
     | 
    
         
            -
            require "notes"
         
     | 
| 
       10 
     | 
    
         
            -
            require "tempfile"
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
            class NotesTest < Test::Unit::TestCase
         
     | 
| 
       13 
     | 
    
         
            -
              def setup
         
     | 
| 
       14 
     | 
    
         
            -
                @sample = "#{File.join "..", "test", "data", "sample.c"}"
         
     | 
| 
       15 
     | 
    
         
            -
              end
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
              def test_new
         
     | 
| 
       18 
     | 
    
         
            -
                notes = AnnotationExtractor.new(@sample)
         
     | 
| 
       19 
     | 
    
         
            -
                assert_equal 5, notes.list.size
         
     | 
| 
       20 
     | 
    
         
            -
                notes.list.each { |a| assert_kind_of AnnotationExtractor::Annotation, a }
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                AnnotationExtractor.tags << "FOO"
         
     | 
| 
       23 
     | 
    
         
            -
                notes = AnnotationExtractor.new(@sample)
         
     | 
| 
       24 
     | 
    
         
            -
                assert_equal 6, notes.list.size
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                # Test exact text
         
     | 
| 
       27 
     | 
    
         
            -
                assert_equal "first thing to do", notes.list[0].text
         
     | 
| 
       28 
     | 
    
         
            -
                assert_equal "first fixme thing", notes.list[1].text
         
     | 
| 
       29 
     | 
    
         
            -
                assert_equal "second todo thing!", notes.list[2].text
         
     | 
| 
       30 
     | 
    
         
            -
                assert_equal "make it better", notes.list[3].text
         
     | 
| 
       31 
     | 
    
         
            -
                assert_equal "a custom tag", notes.list[4].text
         
     | 
| 
       32 
     | 
    
         
            -
                assert_equal "hello world", notes.list[5].text
         
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
                AnnotationExtractor.tags = "OPTIMIZE"
         
     | 
| 
       35 
     | 
    
         
            -
                notes = AnnotationExtractor.new(@sample)
         
     | 
| 
       36 
     | 
    
         
            -
                assert_equal 1, notes.list.size
         
     | 
| 
       37 
     | 
    
         
            -
                assert_equal "make it better", notes.list.first.text
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                AnnotationExtractor.tags = "FOO"
         
     | 
| 
       40 
     | 
    
         
            -
                notes = AnnotationExtractor.new(@sample)
         
     | 
| 
       41 
     | 
    
         
            -
                assert_equal 1, notes.list.size
         
     | 
| 
       42 
     | 
    
         
            -
                assert_equal "a custom tag", notes.list.first.text
         
     | 
| 
       43 
     | 
    
         
            -
              end
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
              def test_get
         
     | 
| 
       46 
     | 
    
         
            -
                notes = AnnotationExtractor.new(@sample)
         
     | 
| 
       47 
     | 
    
         
            -
                assert_equal 3, notes.get("TODO").size
         
     | 
| 
       48 
     | 
    
         
            -
                assert_equal 1, notes.get("FIXME").size
         
     | 
| 
       49 
     | 
    
         
            -
                assert_equal 1, notes.get("OPTIMIZE").size
         
     | 
| 
       50 
     | 
    
         
            -
              end
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
              def test_write
         
     | 
| 
       53 
     | 
    
         
            -
                tempfile = Tempfile.new("notes").path
         
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
                AnnotationExtractor.tags = AnnotationExtractor::TAGS
         
     | 
| 
       56 
     | 
    
         
            -
                notes = AnnotationExtractor.new(@sample)
         
     | 
| 
       57 
     | 
    
         
            -
                notes.write tempfile
         
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
                assert_equal 5, File.readlines(tempfile).size
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
                File.delete tempfile
         
     | 
| 
       62 
     | 
    
         
            -
              end
         
     | 
| 
       63 
     | 
    
         
            -
            end
         
     |