ackr 0.1.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rake'
6
+ gem 'rspec'
@@ -0,0 +1,28 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ackr (0.2)
5
+ rainbow (>= 1.1.4)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ diff-lcs (1.2.4)
11
+ rainbow (1.1.4)
12
+ rake (10.0.4)
13
+ rspec (2.13.0)
14
+ rspec-core (~> 2.13.0)
15
+ rspec-expectations (~> 2.13.0)
16
+ rspec-mocks (~> 2.13.0)
17
+ rspec-core (2.13.1)
18
+ rspec-expectations (2.13.0)
19
+ diff-lcs (>= 1.1.3, < 2.0)
20
+ rspec-mocks (2.13.1)
21
+
22
+ PLATFORMS
23
+ ruby
24
+
25
+ DEPENDENCIES
26
+ ackr!
27
+ rake
28
+ rspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 lkdjiin
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,14 +1,33 @@
1
- Ackr
1
+ Ackr [![Build Status](https://travis-ci.org/lkdjiin/ackr.png)](https://travis-ci.org/lkdjiin/ackr)
2
2
  ================
3
3
 
4
- Ackr is a very light grep/ack/rak replacement for lazy developers.
4
+ Ackr is a very small subset of grep/ack/rak, for **lazy developers**.
5
5
 
6
6
  Description
7
7
  -----------
8
8
 
9
- TODO. Work in progress.
9
+ Grep is a great tool. A very powerful tool. But most of the time, it is
10
+ too powerful for my needs. I can never remember its syntax nor its options.
10
11
 
11
- Run on linux. Maybe run on mac os. I guess it doesn't run on windows.
12
+ Ack is great and powerful too. But here again it has so many options.
13
+
14
+ As a developer I have really simple needs. As a lazy developer I want the
15
+ most possible simple tool.
16
+
17
+ Here comes ackr:
18
+
19
+ * Ackr look for a search term into all text files, into all subfolders,
20
+ from the working directory
21
+ * A search term is either **a string** (in this case Ackr is *case insensitive*)
22
+ or **a regexp**
23
+ * Ackr has **no options**
24
+ * Ackr doesn't look into hidden folders/files
25
+ * Search term is displayed in bold font
26
+
27
+ It runs on linux. It maybe runs on mac os. I guess it won't run on windows.
28
+
29
+ And one more thing: ackr **is not a replacement to grep/ack**. If you
30
+ need grep power, just use grep!
12
31
 
13
32
  Install
14
33
  -------------------------
@@ -18,14 +37,48 @@ Install
18
37
  Usage
19
38
  --------------------------
20
39
 
21
- TODO. Work in progress.
40
+ To look for a string (case insensitive):
41
+
42
+ $ ackr fixme
43
+ lib/ackr/search.rb
44
+ 8| # FIXME Separate behaviours: search / print
45
+
46
+ README.markdown
47
+ 21| $ackr fixme
48
+
49
+ Using a regexp (same search as above):
50
+
51
+ $ ackr /fixme/i
52
+
53
+ More to come
54
+ --------------------------
55
+
56
+ Next version may include
22
57
 
58
+ * fuzzy search
59
+ * configuration
23
60
 
24
61
  Dependencies
25
62
  --------------------------
26
63
 
27
64
  * ruby >= 1.9.2
28
65
 
66
+ ## Contributing
67
+
68
+ 1. Fork it
69
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
70
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
71
+ 4. Push to the branch (`git push origin my-new-feature`)
72
+ 5. Create new Pull Request
73
+
74
+ ### There is many other ways to contibute to ackr
75
+
76
+ 1. Reports any bug
77
+ 2. Give me ideas
78
+ 3. Correct my poor english syntax
79
+ 4. Blog about ackr
80
+ 5. Tell ackr to your friends or colleagues
81
+
29
82
  License
30
83
  --------------------------
31
84
 
data/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
+ require 'rake/dsl_definition'
3
4
  require 'rake'
4
5
  require 'rspec/core/rake_task'
5
6
 
data/TODO CHANGED
@@ -1,27 +1,29 @@
1
- Écrire le readme
2
- travis-ci
3
1
 
4
- ---------------------------
2
+ [ok]supprimer les espaces/tab avant
3
+ [ok]$ ackr /tel \d{10}/i
4
+ [ok]terme de la regex en gras dans le terminal
5
+ [ok]Bug invalid byte sequence
5
6
 
6
- [ok]Dans tout les fichiers texte.
7
- [ok]case insensitive
8
- [ok]nom du fichier en couleur
9
- [ok]terme de la recherche en gras
10
- [ok]ne pas chercher dans les dossiers/fichiers cachés
11
- supprimer les espaces/tab avant/après
12
- 1|.le point signale que un (ou des) espaces ont été supprimés
13
- une ligne sur le terminal fait 80 char max
7
+ Exclure dossier temp/ tmp/ et d'autres
14
8
 
15
9
  ---------------------------
10
+ fichier de config
16
11
 
17
- $ ackr /tel \d{10}/i
12
+ ---------------------------
13
+ Site web
18
14
 
15
+ ---------------------------
16
+ Écrire à rainbow owner pour lui dire que j'utilise son truc
17
+ dans ce projet.
19
18
 
20
19
  ---------------------------
21
- fichier de config
20
+ Améliorer les perfs
22
21
 
23
22
  ---------------------------
24
23
  fuzzy search:
25
24
  $ ackf abc
26
25
  path/to/file
27
26
  00001| a123 b 2 568 c
27
+
28
+ ---------------------------
29
+ une ligne sur le terminal fait 80 char max
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.2
data/bin/ackr CHANGED
@@ -7,7 +7,9 @@ $ACKR_PATH = File.expand_path(File.dirname(__FILE__)) + '/..'
7
7
  require 'ackr'
8
8
 
9
9
  if ARGV[0].nil?
10
- puts "usage:
10
+ puts "ackr version " + File.read('VERSION').strip
11
+ puts "
12
+ usage:
11
13
 
12
14
  ackr search_string
13
15
 
@@ -1,10 +1,15 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
+ require 'ackr/extensions/string'
3
4
  require 'ackr/search'
4
5
  require 'ackr/colorizer'
5
6
  require 'ackr/finder'
7
+ require 'ackr/formatter'
6
8
 
7
9
  module Ackr
10
+
11
+ EXCLUDE_DIRS = %w(blib CVS _darcs RCS SCCS pkg tmp temp log)
12
+
8
13
  # Method taken from: https://github.com/djberg96/ptools
9
14
  # --
10
15
  #
@@ -23,9 +23,11 @@ module Ackr
23
23
  #
24
24
  # Returns the String line highlighted.
25
25
  def self.for_line string, search
26
- reg = Regexp.new(search, Regexp::IGNORECASE)
27
- string.gsub(reg) do |exp|
28
- exp.bright
26
+ search = Regexp.new(search, Regexp::IGNORECASE) if search.is_a?(String)
27
+ begin
28
+ string.gsub(search) {|exp| exp.bright }
29
+ rescue Exception => ex
30
+ puts "Error ".background(:red) + ex.message
29
31
  end
30
32
  end
31
33
  end
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ class String
4
+
5
+ # Public: Transform itself in a Regexp.
6
+ #
7
+ # Returns a Regexp if successful, nil otherwise.
8
+ # ---
9
+ # Credit to Josh Cheek: http://www.ruby-forum.com/topic/193809
10
+ #
11
+ # Note: there is also a gem:
12
+ # https://github.com/seamusabshere/to_regexp
13
+ # Could be useful if I later want to parse things like
14
+ # $ ackr %r{regexp}
15
+ # or if bugs are discovered in the following code.
16
+ def to_regexp
17
+ return nil unless self.strip.match(/\A\/(.*)\/(.*)\Z/mx)
18
+ regexp , flags = $1 , $2
19
+ return nil if !regexp || flags =~ /[^xim]/m
20
+
21
+ x = /x/.match(flags) && Regexp::EXTENDED
22
+ i = /i/.match(flags) && Regexp::IGNORECASE
23
+ m = /m/.match(flags) && Regexp::MULTILINE
24
+
25
+ Regexp.new regexp , [x,i,m].inject(0){|a,f| f ? a+f : a }
26
+ end
27
+ end
@@ -16,6 +16,10 @@ module Ackr
16
16
  def self.all_files
17
17
  Dir.glob('**/*').each do |file|
18
18
  next if (File.directory?(file) || Ackr::binary?(file))
19
+ next if EXCLUDE_DIRS.any? do |dir|
20
+ file.start_with?(dir + File::Separator) ||
21
+ file.include?(File::Separator + dir + File::Separator)
22
+ end
19
23
  yield(file)
20
24
  end
21
25
  end
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Ackr
4
+
5
+ # Format strings to be displayed on terminal.
6
+ class Formatter
7
+
8
+ # Public:
9
+ #
10
+ # search_term - The String or Regexp to look for.
11
+ def initialize search_term
12
+ @search_term = search_term
13
+ end
14
+
15
+ # Public: format a line with matched term(s).
16
+ #
17
+ # line - The String line to be displayed.
18
+ # num - The Integer number of the line (in base 1).
19
+ #
20
+ # Returns a formatted String.
21
+ def line line, num
22
+ begin
23
+ line.strip!
24
+ rescue Exception => ex
25
+ puts "Error ".background(:red) + ex.message
26
+ end
27
+ "#{'%4i' % num}| #{Colorizer::for_line(line, @search_term)}"
28
+ end
29
+ end
30
+ end
31
+
@@ -11,8 +11,17 @@ module Ackr
11
11
  # Public:
12
12
  #
13
13
  # search_term - The String to look for.
14
+ # This param could be a 'real' string or a String
15
+ # representing a regexp. If the string looks like
16
+ # a regexp, it will be treated like a regexp.
17
+ #
18
+ # Examples:
19
+ # Search.new("abc")
20
+ # Search.new("/abc/i")
14
21
  def initialize search_term
15
- @search_term = search_term.downcase
22
+ @search_term = search_term.to_regexp
23
+ @search_term = search_term.downcase if @search_term.nil?
24
+ @format = Formatter.new @search_term
16
25
  end
17
26
 
18
27
  # Public: Launch the search.
@@ -37,12 +46,22 @@ module Ackr
37
46
  def search_into_file
38
47
  result = []
39
48
  File.readlines(@file).each_with_index do |line, idx|
40
- if line.downcase.include?(@search_term)
41
- result << "#{'%4i' % (idx + 1)}| #{Colorizer::for_line(line, @search_term)}"
42
- end
49
+ found = search_into_line(line)
50
+ result << @format.line(line, idx + 1) if found
43
51
  end
44
52
  result
45
53
  end
46
54
 
55
+ def search_into_line line
56
+ begin
57
+ if @search_term.is_a?(String)
58
+ line.downcase.include?(@search_term)
59
+ else
60
+ @search_term =~ line
61
+ end
62
+ rescue #Exception => ex
63
+ end
64
+ end
65
+
47
66
  end
48
67
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ackr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: '0.2'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-23 00:00:00.000000000 Z
12
+ date: 2013-04-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rainbow
@@ -27,7 +27,7 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: 1.1.4
30
- description: Ackr is a very light grep/ack/rak replacement for lazy developers.
30
+ description: Ackr is a very small subset of grep/ack/rak, for lazy developers
31
31
  email: xavier.nayrac@gmail.com
32
32
  executables:
33
33
  - ackr
@@ -37,12 +37,17 @@ files:
37
37
  - lib/ackr.rb
38
38
  - lib/ackr/finder.rb
39
39
  - lib/ackr/search.rb
40
+ - lib/ackr/formatter.rb
41
+ - lib/ackr/extensions/string.rb
40
42
  - lib/ackr/colorizer.rb
41
43
  - bin/ackr
44
+ - LICENSE.txt
42
45
  - VERSION
43
46
  - README.markdown
47
+ - Gemfile
44
48
  - Rakefile
45
49
  - TODO
50
+ - Gemfile.lock
46
51
  homepage: https://github.com/lkdjiin/ackr
47
52
  licenses:
48
53
  - MIT
@@ -67,5 +72,5 @@ rubyforge_project:
67
72
  rubygems_version: 1.8.25
68
73
  signing_key:
69
74
  specification_version: 3
70
- summary: Ackr is a very light grep/ack/rak replacement for lazy developers.
75
+ summary: Ackr is a very small subset of grep/ack/rak, for lazy developers
71
76
  test_files: []