kasoba 0.0.1
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/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.rdoc +23 -0
- data/Rakefile +2 -0
- data/bin/kasoba +45 -0
- data/kasoba.gemspec +21 -0
- data/lib/kasoba/version.rb +3 -0
- data/lib/kasoba.rb +116 -0
- metadata +76 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
= Kasoba
|
2
|
+
|
3
|
+
Kasoba is a tool meant to assist programmers with large-scale code refactors.
|
4
|
+
|
5
|
+
== Install
|
6
|
+
[sudo] gem install kasoba
|
7
|
+
|
8
|
+
== History
|
9
|
+
|
10
|
+
=== Version 0.01 beta - Current Version
|
11
|
+
|
12
|
+
Basic functions implemented.
|
13
|
+
|
14
|
+
== Usage
|
15
|
+
Suposse you are depecrating the use of <center> tag. You'll make progress by running:
|
16
|
+
kasoba -d app_folder/ --extensions php,html '<center>(.*?)</center>' '<div style="text-align:center">\1</div>'
|
17
|
+
|
18
|
+
Last two arguments are a regular expression and a substitution string. As you probably noticed already, kasoba supports match captures and you can include them in the substitution string.
|
19
|
+
At each match you'll be shown a colored diff, and asked if you want to accept the change.
|
20
|
+
|
21
|
+
== Copyright
|
22
|
+
|
23
|
+
Copyright (c) 2010-2011 Lacides Charris. See LICENSE for details.
|
data/Rakefile
ADDED
data/bin/kasoba
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
3
|
+
|
4
|
+
require 'optparse'
|
5
|
+
require 'kasoba'
|
6
|
+
options = {}
|
7
|
+
optparse = OptionParser.new do |opt|
|
8
|
+
opt.on_tail('-h', '--help', 'Show help') do
|
9
|
+
puts opt
|
10
|
+
exit
|
11
|
+
end
|
12
|
+
|
13
|
+
options[:dir] = "/"
|
14
|
+
opt.on('-d PATH', 'Path whose ancestor files are to be explored') do |path|
|
15
|
+
options[:dir] = path
|
16
|
+
end
|
17
|
+
|
18
|
+
options[:extensions] = nil
|
19
|
+
opt.on('--extensions x,y,z', Array, 'List of extensions to process') do |list|
|
20
|
+
options[:extensions] = list
|
21
|
+
end
|
22
|
+
|
23
|
+
options[:editor] = ENV['EDITOR']
|
24
|
+
opt.on('--editor EDITOR', 'Specify an editor. If omitted default to $EDITOR enviroment variable') do |editor|
|
25
|
+
options[:editor] = editor
|
26
|
+
end
|
27
|
+
|
28
|
+
options[:count] = false
|
29
|
+
opt.on('--count', 'Print out number of times places in the codebase match the query') do
|
30
|
+
options[:count] = true
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
end.parse!
|
35
|
+
begin
|
36
|
+
regex = ARGV[0]
|
37
|
+
replacement = ARGV[1]
|
38
|
+
p options[:editor]
|
39
|
+
kasoba = Kasoba.new(options,regex,replacement)
|
40
|
+
|
41
|
+
p kasoba.inspect
|
42
|
+
kasoba.run
|
43
|
+
rescue SystemExit, Interrupt
|
44
|
+
exit
|
45
|
+
end
|
data/kasoba.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "kasoba/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "kasoba"
|
7
|
+
s.version = Kasoba::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["kasoba"]
|
10
|
+
s.email = ["lacidescharris@hotmail.es", "guilleiguaran@gmail.com"]
|
11
|
+
s.homepage = "https://github.com/guilleiguaran/kasoba"
|
12
|
+
s.summary = %q{Interactive tool for large scale code refactors}
|
13
|
+
s.description = %q{Kasoba is a tool meant to assist programmers with large-scale code refactors.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "kasoba"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
end
|
data/lib/kasoba.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'highline/import'
|
3
|
+
require 'rainbow'
|
4
|
+
|
5
|
+
class Kasoba
|
6
|
+
attr_reader :files
|
7
|
+
def run
|
8
|
+
if @count == true
|
9
|
+
say("Counting ...")
|
10
|
+
p count
|
11
|
+
else
|
12
|
+
replace
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(options, regex, replacement)
|
17
|
+
@files = FileNavigator.new(options[:dir],options[:extensions])
|
18
|
+
@count = options[:count]
|
19
|
+
@editor = options[:editor]
|
20
|
+
@regex = regex
|
21
|
+
@replacement = replacement
|
22
|
+
end
|
23
|
+
|
24
|
+
def run
|
25
|
+
if @count == true
|
26
|
+
say("Counting ...")
|
27
|
+
p count
|
28
|
+
else
|
29
|
+
replace
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def count
|
34
|
+
num = 0
|
35
|
+
@files.each do |file|
|
36
|
+
file.each do |line|
|
37
|
+
cline = line.clone
|
38
|
+
while ((t = cline.partition(@regex)[2]) != "") or (cline.match(@regex)) do
|
39
|
+
cline = t
|
40
|
+
num = num +1
|
41
|
+
end
|
42
|
+
end
|
43
|
+
file.close
|
44
|
+
end
|
45
|
+
return num
|
46
|
+
end
|
47
|
+
|
48
|
+
def replace
|
49
|
+
@files.each do |file|
|
50
|
+
File.open(file.path + ".temp","w") do |tmpFile|
|
51
|
+
p file.path
|
52
|
+
fileContent = file.readlines.join
|
53
|
+
while (((t = fileContent.partition(Regexp.new(@regex)))[2] != "") or t.join.length > 0)
|
54
|
+
if(t[2] != "")
|
55
|
+
tmpFile << t[0]
|
56
|
+
fileContent = t[2]
|
57
|
+
oldline = t[0].split("\n").last.to_s + t[1]
|
58
|
+
puts "Oldline: " + oldline.color(:red)
|
59
|
+
localreplacement = @replacement.nil?? ask('Type substitution string') : @replacement
|
60
|
+
i = 1
|
61
|
+
t[1].match(@regex).captures.each do |capture|
|
62
|
+
localreplacement = localreplacement.gsub("\\#{i}" ,capture )
|
63
|
+
i = i + 1
|
64
|
+
end
|
65
|
+
newline = t[0].split("\n").last.to_s + localreplacement + t[2].split("\n").first.to_s
|
66
|
+
puts "Newline: " + newline.color(:green)
|
67
|
+
if agree("Agree? y/n".color(:blue))
|
68
|
+
tmpFile << localreplacement
|
69
|
+
else
|
70
|
+
tmpFile << t[1]
|
71
|
+
end
|
72
|
+
else
|
73
|
+
fileContent = t[2]
|
74
|
+
tmpFile << t.join
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
filePath = file.path
|
79
|
+
file.close
|
80
|
+
File.delete(filePath)
|
81
|
+
File.rename(filePath + ".temp", filePath)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
class FileNavigator
|
87
|
+
def initialize(root, extensions)
|
88
|
+
extensionsPattern = extensions.nil?? "{.*,}" : ".{" + extensions.join(',') + "}"
|
89
|
+
filePattern = File.join(root.nil?? "**" : File.join(root, "**") , "*#{extensionsPattern}")
|
90
|
+
@fileNames = Dir.glob(filePattern).select {|fileName| File.file?(fileName) }
|
91
|
+
end
|
92
|
+
def method_missing(name, *args)
|
93
|
+
@fileNames.send(name,*args)
|
94
|
+
end
|
95
|
+
def [](i)
|
96
|
+
File.new(@fileNames[i], 'r')
|
97
|
+
end
|
98
|
+
def each
|
99
|
+
return to_enum if !block_given?
|
100
|
+
@fileNames.each do |fileName|
|
101
|
+
yield(File.new(fileName,'r'))
|
102
|
+
end
|
103
|
+
end
|
104
|
+
def collect
|
105
|
+
return to_enum if !block_given?
|
106
|
+
@fileNames.collect do |fileName|
|
107
|
+
yield(File.new(fileName, 'r'))
|
108
|
+
end
|
109
|
+
end
|
110
|
+
def map
|
111
|
+
return to_enum if !block_given?
|
112
|
+
@fileNames.map do |fileName|
|
113
|
+
yield(File.new(fileName, 'r'))
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kasoba
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- kasoba
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-02-24 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: Kasoba is a tool meant to assist programmers with large-scale code refactors.
|
23
|
+
email:
|
24
|
+
- lacidescharris@hotmail.es
|
25
|
+
- guilleiguaran@gmail.com
|
26
|
+
executables:
|
27
|
+
- kasoba
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files: []
|
31
|
+
|
32
|
+
files:
|
33
|
+
- .gitignore
|
34
|
+
- Gemfile
|
35
|
+
- README.rdoc
|
36
|
+
- Rakefile
|
37
|
+
- bin/kasoba
|
38
|
+
- kasoba.gemspec
|
39
|
+
- lib/kasoba.rb
|
40
|
+
- lib/kasoba/version.rb
|
41
|
+
has_rdoc: true
|
42
|
+
homepage: https://github.com/guilleiguaran/kasoba
|
43
|
+
licenses: []
|
44
|
+
|
45
|
+
post_install_message:
|
46
|
+
rdoc_options: []
|
47
|
+
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
hash: 3
|
56
|
+
segments:
|
57
|
+
- 0
|
58
|
+
version: "0"
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
hash: 3
|
65
|
+
segments:
|
66
|
+
- 0
|
67
|
+
version: "0"
|
68
|
+
requirements: []
|
69
|
+
|
70
|
+
rubyforge_project: kasoba
|
71
|
+
rubygems_version: 1.5.2
|
72
|
+
signing_key:
|
73
|
+
specification_version: 3
|
74
|
+
summary: Interactive tool for large scale code refactors
|
75
|
+
test_files: []
|
76
|
+
|