findr 0.0.3 → 0.0.4
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/Gemfile +2 -0
- data/Gemfile.lock +16 -0
- data/README.md +3 -0
- data/Rakefile +5 -0
- data/findr.gemspec +8 -7
- data/lib/findr/cli.rb +34 -33
- data/lib/findr/encoder.rb +57 -0
- data/lib/findr/version.rb +1 -1
- metadata +43 -44
- data/findr-0.0.1.gem +0 -0
- data/findr-0.0.2.gem +0 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
data/README.md
ADDED
data/Rakefile
ADDED
data/findr.gemspec
CHANGED
@@ -6,33 +6,34 @@ require "findr/version"
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "findr"
|
8
8
|
s.version = Findr::VERSION.dup
|
9
|
-
s.date = "
|
9
|
+
s.date = "2014-11-20"
|
10
10
|
s.summary = "A ruby find and replace tool for batch editing text files."
|
11
11
|
s.email = "Markus@ITstrauss.eu"
|
12
12
|
s.homepage = "https://github.com/mstrauss/findr"
|
13
13
|
s.authors = ['Markus Strauss']
|
14
|
-
|
14
|
+
|
15
15
|
s.description = <<-EOF
|
16
16
|
A ruby find and replace tool for batch editing text files.
|
17
17
|
EOF
|
18
|
-
|
18
|
+
|
19
19
|
dependencies = [
|
20
|
+
[:test, 'rake']
|
20
21
|
# Examples:
|
21
22
|
# [:runtime, "rack", "~> 1.1"],
|
22
23
|
# [:development, "rspec", "~> 2.1"],
|
23
24
|
]
|
24
|
-
|
25
|
+
|
25
26
|
s.files = Dir['**/*']
|
26
27
|
s.test_files = Dir['test/**/*'] + Dir['spec/**/*']
|
27
28
|
s.executables = Dir['bin/*'].map { |f| File.basename(f) }
|
28
29
|
s.require_paths = ["lib"]
|
29
|
-
|
30
|
-
|
30
|
+
|
31
|
+
|
31
32
|
## Make sure you can build the gem on older versions of RubyGems too:
|
32
33
|
s.rubygems_version = "1.8.11"
|
33
34
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
34
35
|
s.specification_version = 3 if s.respond_to? :specification_version
|
35
|
-
|
36
|
+
|
36
37
|
dependencies.each do |type, name, version|
|
37
38
|
if s.respond_to?("add_#{type}_dependency")
|
38
39
|
s.send("add_#{type}_dependency", name, version)
|
data/lib/findr/cli.rb
CHANGED
@@ -3,47 +3,45 @@ require 'pathname'
|
|
3
3
|
require 'tempfile'
|
4
4
|
require 'optparse'
|
5
5
|
require 'yaml'
|
6
|
-
|
7
|
-
# this is deprecated on 1.9, but still works fine
|
8
|
-
require 'iconv'
|
6
|
+
require 'pp'
|
9
7
|
|
10
8
|
require 'findr/version'
|
11
|
-
|
9
|
+
require 'findr/encoder'
|
12
10
|
|
13
11
|
module Findr
|
14
|
-
|
12
|
+
|
15
13
|
class CLI
|
16
|
-
|
14
|
+
|
17
15
|
CONFIGFILE = '.findr-config'
|
18
|
-
|
16
|
+
|
19
17
|
def colorize(text, color_code)
|
20
18
|
"\e[#{color_code}m#{text}\e[0m"
|
21
19
|
end
|
22
|
-
|
20
|
+
|
23
21
|
def red(text); colorize(text, 31); end
|
24
22
|
def green(text); colorize(text, 32); end
|
25
23
|
def yellow(text); colorize(text, 33); end
|
26
24
|
def blue(text); colorize(text, 34); end
|
27
|
-
|
25
|
+
|
28
26
|
def banner
|
29
27
|
red( "FINDR VERSION #{Findr::VERSION}. THIS PROGRAM COMES WITH NO WARRANTY WHATSOEVER. MAKE BACKUPS!") + $/ +
|
30
28
|
"Usage: #{Pathname($0).basename} [options] <search regex> [<replacement string>]"
|
31
29
|
end
|
32
|
-
|
30
|
+
|
33
31
|
def show_usage
|
34
32
|
puts(@option_parser.help)
|
35
33
|
exit
|
36
34
|
end
|
37
|
-
|
35
|
+
|
38
36
|
def execute(stdout, arguments=[])
|
39
37
|
# unless arguments[0]
|
40
38
|
# end
|
41
|
-
|
39
|
+
|
42
40
|
# default options
|
43
41
|
options = {}
|
44
42
|
options[:glob] = '*'
|
45
43
|
options[:coding] = 'utf-8'
|
46
|
-
|
44
|
+
|
47
45
|
# options from file, if present
|
48
46
|
if File.exists?( CONFIGFILE )
|
49
47
|
file_options = YAML.load_file(CONFIGFILE)
|
@@ -51,7 +49,7 @@ module Findr
|
|
51
49
|
options.merge!( file_options )
|
52
50
|
stdout.puts green "Using #{CONFIGFILE}."
|
53
51
|
end
|
54
|
-
|
52
|
+
|
55
53
|
# parse command line
|
56
54
|
@option_parser = OptionParser.new do |opts|
|
57
55
|
opts.on('-g', '--glob FILE SEARCH GLOB', 'e.g. "*.{rb,erb}"') do |glob|
|
@@ -66,10 +64,14 @@ module Findr
|
|
66
64
|
opts.on('-s', '--save', "saves your options to #{CONFIGFILE} for future use") do
|
67
65
|
options[:save] = true
|
68
66
|
end
|
67
|
+
opts.on('-C', '--codings-list', "list available encodings") do
|
68
|
+
pp Encoder.list
|
69
|
+
exit
|
70
|
+
end
|
69
71
|
end
|
70
72
|
@option_parser.banner = self.banner
|
71
73
|
@option_parser.parse!( arguments )
|
72
|
-
|
74
|
+
|
73
75
|
# optionally save the configuration to file
|
74
76
|
if options[:save]
|
75
77
|
options.delete(:save)
|
@@ -78,7 +80,7 @@ module Findr
|
|
78
80
|
stdout.puts green "Saved options to file #{CONFIGFILE}."
|
79
81
|
exit
|
80
82
|
end
|
81
|
-
|
83
|
+
|
82
84
|
show_usage if arguments.size == 0
|
83
85
|
arguments.clone.each do |arg|
|
84
86
|
if !options[:find]
|
@@ -91,21 +93,20 @@ module Findr
|
|
91
93
|
show_usage
|
92
94
|
end
|
93
95
|
end
|
94
|
-
|
96
|
+
|
95
97
|
show_usage if arguments.size != 0
|
96
98
|
stdout.puts green "File inclusion glob: " + options[:glob]
|
97
99
|
stdout.puts green "Searching for regex " + options[:find].to_s
|
98
|
-
|
100
|
+
|
99
101
|
# some statistics
|
100
102
|
stats = {}
|
101
103
|
stats[:total_hits] = stats[:local_hits] = stats[:hit_files] = stats[:total_files] = 0
|
102
|
-
|
104
|
+
|
103
105
|
replacement_done = false
|
104
106
|
tempfile = nil
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
107
|
+
|
108
|
+
coder = Encoder.new( options[:coding] )
|
109
|
+
|
109
110
|
Pathname.glob("**/#{options[:glob]}").each do |current_file|
|
110
111
|
next unless current_file.file?
|
111
112
|
stats[:total_files] += 1
|
@@ -115,9 +116,9 @@ module Findr
|
|
115
116
|
tempfile = Tempfile.new( 'current_file.basename' ) if options[:replace] && options[:force]
|
116
117
|
current_file.each_line do |l|
|
117
118
|
begin
|
118
|
-
l =
|
119
|
-
rescue
|
120
|
-
stdout.puts "Skipping file #{current_file} because of error on line #{linenumber}: #{$!.class} #{$!.message}"
|
119
|
+
l = coder.decode(l)
|
120
|
+
rescue Encoder::Error
|
121
|
+
stdout.puts "Skipping file #{current_file} because of error on line #{linenumber}: #{$!.original.class} #{$!.original.message}"
|
121
122
|
tempfile.unlink if tempfile
|
122
123
|
break
|
123
124
|
end
|
@@ -125,7 +126,7 @@ module Findr
|
|
125
126
|
if l=~ options[:find]
|
126
127
|
stats[:local_hits] += 1
|
127
128
|
if firstmatch
|
128
|
-
stdout.puts red("#{current_file.cleanpath}:")
|
129
|
+
stdout.puts red("#{current_file.cleanpath}:")
|
129
130
|
end
|
130
131
|
stdout.write( yellow( "%6d:" % [linenumber, l] ) )
|
131
132
|
stdout.puts l
|
@@ -133,12 +134,12 @@ module Findr
|
|
133
134
|
if options[:replace]
|
134
135
|
stdout.write( blue( "%6d:" % [linenumber, l] ) )
|
135
136
|
l_repl = l.gsub( options[:find], options[:replace] )
|
136
|
-
tempfile.puts
|
137
|
+
tempfile.puts coder.encode(l_repl) if tempfile
|
137
138
|
stdout.puts blue l_repl
|
138
139
|
replacement_done = true
|
139
140
|
end
|
140
141
|
elsif tempfile
|
141
|
-
tempfile.puts
|
142
|
+
tempfile.puts coder.encode(l)
|
142
143
|
end
|
143
144
|
end
|
144
145
|
if tempfile
|
@@ -146,18 +147,18 @@ module Findr
|
|
146
147
|
FileUtils.cp( tempfile.path, current_file ) if stats[:local_hits] > 0
|
147
148
|
tempfile.unlink
|
148
149
|
end
|
149
|
-
|
150
|
+
|
150
151
|
if stats[:local_hits] > 0
|
151
152
|
stats[:total_hits] += stats[:local_hits]
|
152
153
|
stats[:hit_files] += 1
|
153
154
|
end
|
154
|
-
|
155
|
+
|
155
156
|
end
|
156
|
-
|
157
|
+
|
157
158
|
# some statistics
|
158
159
|
stdout.puts green( "#{stats[:total_hits]} occurences (lines) in #{stats[:hit_files]} of #{stats[:total_files]} files found." )
|
159
160
|
end
|
160
|
-
|
161
|
+
|
161
162
|
end
|
162
163
|
|
163
164
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
FIRST_RUBY_WITHOUT_ICONV = '1.9'
|
2
|
+
require 'iconv' if RUBY_VERSION < FIRST_RUBY_WITHOUT_ICONV
|
3
|
+
|
4
|
+
module Findr
|
5
|
+
|
6
|
+
# Class for wrapping original exceptions, which could be from Iconv (Ruby 1.8)
|
7
|
+
# or String (Ruby >=1.9).
|
8
|
+
# ()
|
9
|
+
class Error < ::StandardError
|
10
|
+
attr_reader :original
|
11
|
+
def initialize(msg, original=$!)
|
12
|
+
super(msg)
|
13
|
+
@original = original;
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Wrapper class for String#encode (Ruby >=1.9) and Iconv#iconv (Ruby 1.8).
|
18
|
+
class Encoder
|
19
|
+
|
20
|
+
class Error < Findr::Error; end
|
21
|
+
|
22
|
+
class <<self
|
23
|
+
def list
|
24
|
+
return Iconv.list if RUBY_VERSION < FIRST_RUBY_WITHOUT_ICONV
|
25
|
+
return Encoding.list.map(&:to_s)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def initialize( other_coding )
|
30
|
+
if RUBY_VERSION < FIRST_RUBY_WITHOUT_ICONV
|
31
|
+
@coding_to_utf8 = Iconv.new('UTF-8', other_coding)
|
32
|
+
@utf8_to_coding = Iconv.new(other_coding, 'UTF-8')
|
33
|
+
else
|
34
|
+
@other_coding = Encoding.find(other_coding)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Encodes given +string+ from +@other_coding+ to utf8.
|
39
|
+
def decode( string )
|
40
|
+
return @coding_to_utf8.iconv(string) if RUBY_VERSION < FIRST_RUBY_WITHOUT_ICONV
|
41
|
+
string.force_encoding(@other_coding)
|
42
|
+
fail Error.new("Encoding '#{@other_coding}' is invalid.") unless string.valid_encoding?
|
43
|
+
return string.encode('UTF-8')
|
44
|
+
rescue
|
45
|
+
raise Error, "Error when decoding from '#{@other_coding}' into 'UTF-8'."
|
46
|
+
end
|
47
|
+
|
48
|
+
# Encodes given utf8 +string+ into +@other_coding+.
|
49
|
+
def encode( string )
|
50
|
+
return @utf8_to_coding.iconv(string) if RUBY_VERSION < FIRST_RUBY_WITHOUT_ICONV
|
51
|
+
return string.encode(@other_coding)
|
52
|
+
rescue
|
53
|
+
raise Error, "Error when encoding from 'UTF-8' into '#{@other_coding}'."
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
data/lib/findr/version.rb
CHANGED
metadata
CHANGED
@@ -1,74 +1,73 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: findr
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 3
|
10
|
-
version: 0.0.3
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Markus Strauss
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
12
|
+
date: 2014-11-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: ! 'A ruby find and replace tool for batch editing text files.
|
17
31
|
|
18
|
-
|
19
|
-
dependencies: []
|
20
|
-
|
21
|
-
description: |
|
22
|
-
A ruby find and replace tool for batch editing text files.
|
23
|
-
|
32
|
+
'
|
24
33
|
email: Markus@ITstrauss.eu
|
25
|
-
executables:
|
34
|
+
executables:
|
26
35
|
- findr
|
27
36
|
extensions: []
|
28
|
-
|
29
37
|
extra_rdoc_files: []
|
30
|
-
|
31
|
-
files:
|
38
|
+
files:
|
32
39
|
- bin/findr
|
33
|
-
- findr-0.0.1.gem
|
34
|
-
- findr-0.0.2.gem
|
35
40
|
- findr.gemspec
|
41
|
+
- Gemfile
|
42
|
+
- Gemfile.lock
|
36
43
|
- lib/findr/cli.rb
|
44
|
+
- lib/findr/encoder.rb
|
37
45
|
- lib/findr/version.rb
|
38
46
|
- lib/findr.rb
|
47
|
+
- Rakefile
|
48
|
+
- README.md
|
39
49
|
homepage: https://github.com/mstrauss/findr
|
40
50
|
licenses: []
|
41
|
-
|
42
51
|
post_install_message:
|
43
52
|
rdoc_options: []
|
44
|
-
|
45
|
-
require_paths:
|
53
|
+
require_paths:
|
46
54
|
- lib
|
47
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
56
|
none: false
|
49
|
-
requirements:
|
50
|
-
- -
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
|
53
|
-
|
54
|
-
- 0
|
55
|
-
version: "0"
|
56
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
62
|
none: false
|
58
|
-
requirements:
|
59
|
-
- -
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
|
62
|
-
segments:
|
63
|
-
- 0
|
64
|
-
version: "0"
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
65
67
|
requirements: []
|
66
|
-
|
67
68
|
rubyforge_project:
|
68
|
-
rubygems_version: 1.8.
|
69
|
+
rubygems_version: 1.8.23.2
|
69
70
|
signing_key:
|
70
71
|
specification_version: 3
|
71
72
|
summary: A ruby find and replace tool for batch editing text files.
|
72
73
|
test_files: []
|
73
|
-
|
74
|
-
has_rdoc:
|
data/findr-0.0.1.gem
DELETED
Binary file
|
data/findr-0.0.2.gem
DELETED
Binary file
|