notes-cli 1.0.5 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NDVlYWYwYTAwMGM0ZDVmMTlkMTYzOTFkZGM4NDk2NDRkYTgxMzIwMQ==
5
+ data.tar.gz: !binary |-
6
+ ZTY5ZGIxZjFhNDYxMzYxNmJlYTZjMWI2YWYxNDFkNjZkOTc3OGY1Yw==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MGQ4NTExODhiZmYwYTk1NjI5N2JmMzRmYTFjMGI1YzdmOWVhZTQwYTg1NDMz
10
+ ZjgyMTI4ZTgxN2U5MTY4NzNkOWMyODMwODkwYTM2NDkyYjcyZjYzZGU2YjUx
11
+ MTgxZTEzZjk4YzI0MTUzY2Y1NzcxOGQyMDgxMTBlMTgyYTUyYzY=
12
+ data.tar.gz: !binary |-
13
+ YTIwZjcwOGZjYTQyZTlhYjBkNGVlNmZlOTcwZDZhZDU3NmJhZjlhNmY5Y2Ri
14
+ MzQ5YzE0Y2U4ZmQ0YjU2YWEwYzQ1ZWUxYTUzNDU5NTQzOWY5YjYwNDA2ZWZm
15
+ ZjI2MzVkYzNlMWQ5MzQ5YWVkMGMzNWFjMDc5MjdjN2M2NWExZTk=
data/bin/notes CHANGED
@@ -6,7 +6,7 @@ if ARGV.any? { |arg| ["-h", "--help"].include?(arg) }
6
6
  puts %Q{\
7
7
  Recursively search source files for annotations. Default annotations are TODO, OPTIMIZE, and FIXME.
8
8
 
9
- Usage: notes [DIRECTORY=.] [-f FILES] [-e EXCLUDES]
9
+ Usage: notes [DIRECTORY=. | FILENAMES] [-f FLAGS] [-e EXCLUDES]
10
10
 
11
11
  Options:
12
12
  -f, --flags # List of custom annotations, ex: '-f broken refactor' (case insensitive)
@@ -16,10 +16,11 @@ Options:
16
16
  Examples:
17
17
  notes # Show default annotations for all files in current directory (default)
18
18
  notes app/ -f broken # Only examine files in the app/ directory and add the 'broken' flag
19
+ notes app/ -e logs/ # Show default annotations for files in app/ directory, excluding files in logs/
20
+ notes one.rb two.rb # Show default annotations for one.rb and two.rb
19
21
 
20
22
  }
21
23
  exit(0)
22
24
  end
23
25
 
24
- Notes.build_options(ARGV)
25
- Notes.find_all
26
+ Notes::CLI.new.find_all
data/lib/notes-cli.rb CHANGED
@@ -1,114 +1,2 @@
1
- class Notes
2
- attr_accessor :options
3
-
4
- class << self
5
-
6
- # Parse ARGV into a directory and list of argument groups
7
- # For example, given ['app/', -f', 'refactor', 'broken', '--exclude', 'tmp', 'log']:
8
- # => [ 'app/', ['-f', 'refactor', 'broken'], ['--exclude', 'tmp', 'log'] ]
9
- def parse_argv(args)
10
- result = []
11
- buf = []
12
- dir = args.first
13
-
14
- if args.empty? || dir.start_with?("-")
15
- # No dir was passed, use current dir
16
- result << Dir.pwd
17
- else
18
- # Dir was passed in
19
- dir = Dir.pwd if dir == '.'
20
- result << dir
21
- args = args.drop(1)
22
- end
23
-
24
- args.each do |arg|
25
- if arg.start_with?('-')
26
- result << buf unless buf.empty?
27
- buf = []
28
- end
29
- buf << arg
30
- end
31
-
32
- result << buf
33
- end
34
-
35
- # Append any command line arguments to a default set of arguments
36
- # arg_list is a directory and argument groups parsed from ARGV. For example:
37
- # [ "app/", ['-f', 'refactor', 'broken'], ['--exclude', 'tmp', 'log'] ]
38
- def build_options(argv)
39
- arg_list = Notes.parse_argv(argv)
40
- options = {
41
- :flags => %w(TODO FIXME OPTIMIZE),
42
- :exclude => []
43
- }
44
-
45
- options[:dir] = arg_list.shift
46
-
47
- arg_list.reject(&:empty?).each do |set|
48
- flag, *args = set
49
- args.map! { |arg| arg.delete("/") } # "log/" => "log"
50
-
51
- case flag
52
- when '-f', '--flags' then options[:flags].concat(args)
53
- when '-e', '--exclude' then options[:exclude].concat(args)
54
- else puts "Unknown argument: #{flag}"
55
- end
56
- end
57
-
58
- @options = options
59
- end
60
-
61
- # List of files to scan for notes as specified in the options
62
- def files
63
- pattern = File.join(@options[:dir], "**/*")
64
- Dir[pattern].reject do |f|
65
- File.directory?(f) || @options[:exclude].any? { |dir| File.dirname(f).include?(dir) }
66
- end
67
- end
68
-
69
- # Scan a file for annotations and output numbered lines for each
70
- def parse_file(filename)
71
- name = filename.gsub(Dir.pwd, '')
72
- counter = 1
73
- tasks = []
74
-
75
- begin
76
- File.read(filename).each_line do |line|
77
- if @options[:flags].any? { |flag| line =~ /#{flag}/i }
78
- tasks << {
79
- :line_num => counter,
80
- :line => line.strip
81
- }
82
- end
83
- counter += 1
84
- end
85
- rescue
86
- # Error occurred reading the file (ex. invalid byte sequence in UTF-8)
87
- # Move on quietly
88
- end
89
-
90
- if !tasks.empty?
91
- name.slice!(0) if name.start_with?("/")
92
- puts "#{name}:"
93
-
94
- tasks.each do |task|
95
- flag_regex = Regexp.new(@options[:flags].join('|'), true)
96
- color = 33 # yellow
97
- line = task[:line].gsub(flag_regex) do |flag|
98
- "\e[#{color};1m#{flag}\033[0m"
99
- end
100
- puts " ln #{task[:line_num]}: #{line}"
101
- end
102
-
103
- puts ""
104
- end
105
- end
106
-
107
- # Read and parse all files as specified in the options
108
- def find_all
109
- Notes.files.each { |f| Notes.parse_file(f) }
110
- end
111
-
112
- end
113
- end
114
-
1
+ require 'notes-cli/opts'
2
+ require 'notes-cli/cli'
@@ -0,0 +1,65 @@
1
+
2
+ module Notes
3
+ class CLI
4
+ attr_accessor :options
5
+
6
+ def initialize
7
+ @options = Opts.parse(ARGV)
8
+ end
9
+
10
+ # Print a formatted task, with highlighting
11
+ def print_task(task)
12
+ flag_regex = Regexp.new(@options[:flags].join('|'), true)
13
+ color = 33 # yellow
14
+ line = task[:line].gsub(flag_regex) do |flag|
15
+ "\e[#{color};1m#{flag}\033[0m"
16
+ end
17
+
18
+ puts " ln #{task[:line_num]}: #{line}"
19
+ end
20
+
21
+ # Scan a file for annotations and output numbered lines for each
22
+ def parse_file(filename)
23
+ name = filename.gsub(Dir.pwd, '')
24
+ counter = 1
25
+ tasks = []
26
+
27
+ begin
28
+ File.read(filename).each_line do |line|
29
+ if @options[:flags].any? { |flag| line =~ /#{flag}/i }
30
+ tasks << {
31
+ :line_num => counter,
32
+ :line => line.strip
33
+ }
34
+ end
35
+ counter += 1
36
+ end
37
+ rescue
38
+ # Error occurred reading the file (ex. invalid byte sequence in UTF-8)
39
+ # Move on quietly
40
+ end
41
+
42
+ if !tasks.empty?
43
+ name.slice!(0) if name.start_with?("/")
44
+ puts "#{name}:"
45
+ tasks.each { |t| print_task(t) }
46
+ puts ""
47
+ end
48
+ end
49
+
50
+ # Read and parse all files as specified in the options
51
+ def find_all
52
+ @options[:locations].each do |loc|
53
+ if File.directory?(loc)
54
+ Dir[ File.join(loc, "**/*") ].reject do |f|
55
+ File.directory?(f) || @options[:exclude].any? { |dir| File.dirname(f).include?(dir) }
56
+ end.each { |f| parse_file(f) }
57
+ else
58
+ parse_file(loc)
59
+ end
60
+ end
61
+ end
62
+
63
+ end
64
+ end
65
+
@@ -0,0 +1,61 @@
1
+ module Notes
2
+ module Opts
3
+
4
+ DEFAULT_OPTIONS = {
5
+ :flags => %w(TODO FIXME OPTIMIZE),
6
+ :exclude => [],
7
+ :files => [],
8
+ :directory => '',
9
+ }
10
+
11
+ FLAG_FLAGS = ['-f', '--flags']
12
+ EXCLUDE_FLAGS = ['-e', '--exclude']
13
+ ALL_FLAGS = FLAG_FLAGS + EXCLUDE_FLAGS
14
+
15
+ # Parse ARGV into a directory and list of argument groups
16
+ # For example, given ['app/', -f', 'refactor', 'broken', '--exclude', 'tmp', 'log']:
17
+ # => [ ['app/'], ['-f', 'refactor', 'broken'], ['--exclude', 'tmp', 'log'] ]
18
+ #
19
+ def self.arg_groups(args)
20
+ result = []
21
+ buf = []
22
+
23
+ # No dir was passed, use current dir
24
+ if args.empty? || args.first.start_with?('-')
25
+ result << [ Dir.pwd ]
26
+ end
27
+
28
+ args.each do |arg|
29
+ if ALL_FLAGS.include?(arg)
30
+ result << buf unless buf.empty?
31
+ buf = []
32
+ end
33
+ buf << arg
34
+ end
35
+
36
+ result << buf
37
+ end
38
+
39
+ # Append any command line arguments to a default set of arguments
40
+ def self.parse(args)
41
+ arg_list = arg_groups(args)
42
+ options = DEFAULT_OPTIONS
43
+
44
+ options[:locations] = arg_list.shift
45
+
46
+ arg_list.reject(&:empty?).each do |set|
47
+ flag, *args = set
48
+ args.map! { |arg| arg.delete("/") } # "log/" => "log"
49
+
50
+ case flag
51
+ when '-f', '--flags' then options[:flags].concat(args)
52
+ when '-e', '--exclude' then options[:exclude].concat(args)
53
+ else puts "Unknown argument: #{flag}"
54
+ end
55
+ end
56
+
57
+ options
58
+ end
59
+
60
+ end
61
+ end
@@ -1,3 +1,3 @@
1
- class Notes
2
- VERSION = "1.0.5"
1
+ module Notes
2
+ VERSION = "1.1.0"
3
3
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: notes-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
5
- prerelease:
4
+ version: 1.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Andrew Berls
@@ -10,7 +9,21 @@ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
11
  date: 2013-01-13 00:00:00.000000000 Z
13
- dependencies: []
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec-core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
14
27
  description:
15
28
  email: andrew.berls@gmail.com
16
29
  executables:
@@ -18,32 +31,33 @@ executables:
18
31
  extensions: []
19
32
  extra_rdoc_files: []
20
33
  files:
21
- - lib/notes-cli.rb
34
+ - lib/notes-cli/cli.rb
35
+ - lib/notes-cli/opts.rb
22
36
  - lib/notes-cli/version.rb
37
+ - lib/notes-cli.rb
23
38
  - bin/notes
24
39
  homepage: https://github.com/andrewberls/notes-cli
25
40
  licenses: []
41
+ metadata: {}
26
42
  post_install_message:
27
43
  rdoc_options: []
28
44
  require_paths:
29
45
  - lib
30
46
  required_ruby_version: !ruby/object:Gem::Requirement
31
- none: false
32
47
  requirements:
33
48
  - - ! '>='
34
49
  - !ruby/object:Gem::Version
35
50
  version: '0'
36
51
  required_rubygems_version: !ruby/object:Gem::Requirement
37
- none: false
38
52
  requirements:
39
53
  - - ! '>='
40
54
  - !ruby/object:Gem::Version
41
55
  version: '0'
42
56
  requirements: []
43
57
  rubyforge_project:
44
- rubygems_version: 1.8.17
58
+ rubygems_version: 2.0.3
45
59
  signing_key:
46
- specification_version: 3
60
+ specification_version: 4
47
61
  summary: A tool for managing source code annotations
48
62
  test_files: []
49
63
  has_rdoc: