pointme 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +9 -1
- data/README.md +13 -1
- data/lib/pointme/cli.rb +53 -53
- data/lib/pointme/look.rb +85 -85
- data/lib/pointme/version.rb +8 -8
- data/lib/pointme.rb +4 -4
- metadata +1 -1
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -37,11 +37,23 @@ Pointme can handle several language comments like:
|
|
37
37
|
+ ; TODO: content
|
38
38
|
+ <!-- TODO: content -->
|
39
39
|
|
40
|
+
## Supported MIME types
|
41
|
+
|
42
|
+
+ text/plain
|
43
|
+
+ text/x-ruby
|
44
|
+
+ text/x-python
|
45
|
+
+ text/x-c
|
46
|
+
+ text/x-c++
|
47
|
+
+ text/x-shellscript
|
48
|
+
+ text/x-java
|
49
|
+
+ text/x-php
|
50
|
+
+ text/html
|
51
|
+
|
40
52
|
## Dependencies
|
41
53
|
|
42
54
|
+ ruby (working just great on 1.9.2, haven't tried it on other versions yet)
|
43
55
|
+ rubygems (the newest the better [for sure works under 1.8.5])
|
44
|
-
+ a UNIX
|
56
|
+
+ a UNIX tools called `cat` and `file` (but you have them, right?)
|
45
57
|
|
46
58
|
## Beware, beware! A bug!
|
47
59
|
|
data/lib/pointme/cli.rb
CHANGED
@@ -1,36 +1,36 @@
|
|
1
1
|
require "trollop"
|
2
2
|
|
3
3
|
module Pointme
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
4
|
+
|
5
|
+
# Command Line Interface class
|
6
|
+
#
|
7
|
+
# === Usage
|
8
|
+
#
|
9
|
+
# module Pointme
|
10
|
+
# Cli.new.run!
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# or
|
14
|
+
#
|
15
|
+
# Pointme::Cli.new.run!
|
16
|
+
#
|
17
|
+
# === Exit statuses
|
18
|
+
#
|
19
|
+
# - *0* Everything went just fine :)
|
20
|
+
# - *1* User said ^C :]
|
21
|
+
# - *2* User wanted to look for UnknownToken
|
22
|
+
#
|
23
|
+
class Cli
|
24
|
+
|
25
|
+
# run! the Cli!
|
26
|
+
def run!
|
27
|
+
|
28
|
+
# Nice, cool 'n' AWESOME --options parsing with Trollop[http://trollop.rubyforge.org/]!
|
29
|
+
#
|
30
|
+
# @return [Hash] array full of options
|
31
|
+
$opts = Trollop::options do
|
32
|
+
version "pointme version #{Version::STRING}"
|
33
|
+
banner <<-EOB
|
34
34
|
usage: pointme <token> [options]
|
35
35
|
|
36
36
|
tokens are:
|
@@ -40,30 +40,30 @@ tokens are:
|
|
40
40
|
options are:
|
41
41
|
EOB
|
42
42
|
# TODO: Looking in directories with no recursion.
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
43
|
+
# opt :no_recurse, "don't look in directories recursively"
|
44
|
+
opt :in, "specify where to look for", :default => Dir.pwd
|
45
|
+
opt :version, "show version and exit"
|
46
|
+
opt :help, "show help and exit"
|
47
|
+
end
|
48
|
+
|
49
|
+
# Let's see what to look for
|
50
|
+
token = ARGV.shift.downcase
|
51
51
|
unless token == "todos" || token == "fixmes"
|
52
52
|
raise Look::UnknownToken, "Unknown token: '#{token}'"
|
53
53
|
end
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
54
|
+
# Let's see where to look for
|
55
|
+
where = $opts[:in] || Dir.pwd
|
56
|
+
|
57
|
+
begin
|
58
|
+
Look.for_the token, where
|
59
|
+
exit 0
|
60
|
+
rescue Interrupt
|
61
|
+
puts "\n\n!# interrupted"
|
62
|
+
exit 1
|
63
|
+
rescue Look::UnknownToken => e
|
64
|
+
puts e.message
|
65
|
+
exit 2
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
69
|
end
|
data/lib/pointme/look.rb
CHANGED
@@ -1,91 +1,91 @@
|
|
1
1
|
require "find"
|
2
2
|
|
3
3
|
module Pointme
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
4
|
+
module Look
|
5
|
+
|
6
|
+
# Kinda self explanatory
|
7
|
+
class UnknownToken < RuntimeError; end
|
8
|
+
|
9
|
+
# @files holds all the specified files that Look should search in.
|
10
|
+
# @lines keeps all the found TODO, FIXME and so-on lines.
|
11
|
+
attr_accessor :files, :lines
|
12
|
+
|
13
|
+
def self.get_file_list
|
14
|
+
@where.split(":").each do |e|
|
15
15
|
if e == '.' then e = Dir.pwd end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
else
|
25
|
-
ext = File.extname(path)[1..-1]
|
26
|
-
# TODO: Make it look in files with proper MIME type not extension.
|
27
|
-
# Don't look into files with that extensions
|
28
|
-
unless (ext == "class" ||
|
29
|
-
ext == "jar"
|
30
|
-
ext == "rar"
|
31
|
-
ext == "bz"
|
32
|
-
ext == "bz2"
|
33
|
-
ext == "gz"
|
34
|
-
ext == "tgz"
|
35
|
-
ext == "zip")
|
36
|
-
@files << path
|
16
|
+
@dirs << e unless @dirs.include? e
|
17
|
+
Find.find(e) do |path|
|
18
|
+
if File.directory? path
|
19
|
+
if File.basename(path)[0] == ?.
|
20
|
+
Find.prune # don't look any further into this directory.
|
21
|
+
else
|
22
|
+
next
|
37
23
|
end
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
24
|
+
else
|
25
|
+
mime = `file --mime -b #{path}`.chomp!.split(";")[0]
|
26
|
+
# Get into files only with that MIME types.
|
27
|
+
if (mime == "text/plain" ||
|
28
|
+
mime == "text/x-ruby" ||
|
29
|
+
mime == "text/x-python" ||
|
30
|
+
mime == "text/x-c" ||
|
31
|
+
mime == "text/x-c++" ||
|
32
|
+
mime == "text/x-shellscript" ||
|
33
|
+
mime == "text/x-java" ||
|
34
|
+
mime == "text/x-php" ||
|
35
|
+
mime == "text/html")
|
36
|
+
@files << path
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.search_for_tokens
|
44
|
+
@files.each do |file|
|
45
|
+
@lines[file] = []
|
46
|
+
`cat -n #{file}`.split("\n").each do |line|
|
47
|
+
if /\s*(?<n>[0-9]+)\s+(.*)?(#|\/\/|;|<!--)\s(?<token>TODO|FIXME):?\s(?<content>.*)(-->)?/ =~ line
|
48
|
+
@lines[file] << [n, token, content] if @token == token
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
if @lines[file].empty?
|
53
|
+
@lines.delete file
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.print_output
|
59
|
+
if @lines.empty?
|
60
|
+
puts "[pointme] there are no #{@token}s in a specified path/s"
|
61
|
+
else
|
62
|
+
@lines.each do |e|
|
63
|
+
name = nil
|
64
|
+
if @dirs.size == 1
|
65
|
+
name = e[0].sub @where, ""
|
66
|
+
else
|
67
|
+
name = e[0]
|
68
|
+
end
|
69
|
+
puts "\e[1;34m" + name + ":\e[0;0m"
|
70
|
+
e[1].each do |i|
|
71
|
+
@count += 1
|
72
|
+
puts " at \e[1;32m#{i[0]}\e[0;0m: #{i[1]} -> #{i[2]}"
|
73
|
+
end
|
74
|
+
puts
|
75
|
+
end
|
76
|
+
puts "\n \e[1;33mtotal:\e[0;0m #{@count}\n\n"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.for_the token, where
|
81
|
+
@files = []
|
82
|
+
@lines = {}
|
83
|
+
@token = token.upcase[0..-2]
|
84
|
+
@where = where
|
85
|
+
@count = 0
|
86
|
+
@dirs = []
|
87
|
+
|
88
|
+
get_file_list and search_for_tokens and print_output
|
89
|
+
end
|
90
|
+
end
|
91
91
|
end
|
data/lib/pointme/version.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
module Pointme
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
2
|
+
module Version
|
3
|
+
MAJOR = 1
|
4
|
+
MINOR = 0
|
5
|
+
PATCH = 1
|
6
|
+
BUILD = nil
|
7
|
+
|
8
|
+
STRING = [MAJOR, MINOR, PATCH, BUILD]. compact.join "."
|
9
|
+
end
|
10
10
|
end
|
data/lib/pointme.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Pointme
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
ROOT = File.expand_path(File.dirname(__FILE__))
|
3
|
+
|
4
|
+
autoload :Look, "#{ROOT}/pointme/look"
|
5
|
+
autoload :Version, "#{ROOT}/pointme/version"
|
6
6
|
end
|