my_scripts 0.0.7 → 0.0.9
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/README.rdoc +68 -8
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/bin/{gitcp → citi} +1 -1
- data/bin/dummy +5 -0
- data/bin/gitto +5 -0
- data/bin/recode.rb +59 -0
- data/lib/my_scripts/citi.rb +56 -0
- data/lib/my_scripts/cli.rb +20 -5
- data/lib/my_scripts/dummy.rb +17 -0
- data/lib/my_scripts/extensions.rb +32 -0
- data/lib/my_scripts/{gitcp.rb → gitto.rb} +7 -3
- data/lib/my_scripts/jew.rb +3 -0
- data/lib/my_scripts/mybones.rb +3 -0
- data/lib/my_scripts/rabbit.rb +1 -0
- data/lib/my_scripts/script.rb +6 -1
- data/lib/my_scripts.rb +3 -0
- data/my_scripts.gemspec +14 -7
- data/spec/my_scripts/extensions_spec.rb +21 -2
- data/spec/my_scripts_spec.rb +82 -0
- metadata +17 -7
data/README.rdoc
CHANGED
@@ -7,25 +7,85 @@
|
|
7
7
|
A collection of simple scripts/commands used to save time and avoid memorizing/
|
8
8
|
retyping chains of boilerplate console commands and their arguments. Packaged
|
9
9
|
as a gem to make it easily available everywhere without the need to set up
|
10
|
-
paths, environments and all such nonsense...
|
10
|
+
paths, environments and all such nonsense... It is also not OS-specific, so
|
11
|
+
(in theory) scripts should work on Mac, *nix and Windows.
|
11
12
|
|
12
13
|
== FEATURES/PROBLEMS:
|
13
14
|
|
14
|
-
|
15
|
+
OK, I confess: I wanted to write scripts but had neither time nor desire to learn
|
16
|
+
all the esoterics of bash, cmd/powershell and mac scripting. So, I set out to do
|
17
|
+
all my scripting in Ruby. I also wanted my scripts to be easily testable, that's
|
18
|
+
why I created a simple scripting framework instead of stuffing each script in a
|
19
|
+
separate executable Ruby file as most people do.
|
20
|
+
|
21
|
+
These scripts are very much targeted to my own specific needs, but if you find them
|
22
|
+
useful or need additional features, I'll be happy to generalize. You can also use this
|
23
|
+
gem as a basis for writing your own simple scripts that are easy to test and maintain.
|
24
|
+
|
25
|
+
Ah, yes - this gem will work only with Ruby 1.9 and later. I use advanced string encoding
|
26
|
+
features in my scripts, so 1.8 is not an option for me, and providing backward compatibility
|
27
|
+
looks like too much pain. Ruby 1.9 is the way of the future, so let's move forward!
|
28
|
+
|
29
|
+
== INSTALL:
|
30
|
+
|
31
|
+
$ sudo gem install my_scripts
|
15
32
|
|
16
33
|
== SYNOPSIS:
|
34
|
+
=== Creating your own scripts
|
35
|
+
|
36
|
+
Put your source file inside lib/my_scripts. It will be auto-loaded. Use MyScripts
|
37
|
+
module as a top level namespace. Subclass Script and redefine run method to do all
|
38
|
+
actual work:
|
39
|
+
|
40
|
+
#-------- lib/my_shiny_script.rb----------
|
41
|
+
module MyScript
|
42
|
+
class MyShinyScript < Script
|
43
|
+
def run
|
44
|
+
# here you do all actual work for your script
|
45
|
+
# you have following instance vars at your disposal:
|
46
|
+
# @name - your script name,
|
47
|
+
# @argv - your ARGV Array of command line arguments,
|
48
|
+
# @cli - CLI runner (holds references to stdin and stdout)
|
49
|
+
...
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
#-------
|
54
|
+
|
55
|
+
Put your executable into bin directory, with something like this:
|
56
|
+
|
57
|
+
#-------- bin/my_shiny_script----------
|
58
|
+
#!/usr/bin/env ruby
|
59
|
+
require File.dirname(__FILE__) + '/../lib/my_scripts'
|
60
|
+
MyScripts::CLI.run :my_shiny_script, ARGV
|
61
|
+
#-------
|
62
|
+
|
63
|
+
Run 'rake install' from project directory, and enjoy greatness of your new script!
|
64
|
+
|
65
|
+
OK, so you're not advanced enough to follow even these simple instructions. No problemo.
|
66
|
+
I have dummy script skeleton in lib/dummy.rb that is ready for your use. Just put your
|
67
|
+
script code inside run method (if you use ARGV, change it to @argv). Done! You can immediately
|
68
|
+
run your script anywhere in the system using the following command:
|
69
|
+
|
70
|
+
$ dummy Whatever arguments your code expects and processes
|
71
|
+
|
72
|
+
=== Using existing scripts
|
73
|
+
|
74
|
+
$ jew project_name Summary or description goes here
|
75
|
+
|
76
|
+
This script uses Jeweler to create new project skeleton, local git repo and
|
77
|
+
initiate remote repo on github. No need to enclose your description in quotes.
|
78
|
+
|
79
|
+
$ gitto [BUMP] Commit message goes here
|
17
80
|
|
18
81
|
Save the result of all your project-related work with one command. It adds all
|
19
82
|
new files to git VCS, commits all changes with a timestamped message, opionally
|
20
83
|
bumps up version and pushes to remote VCS repository(-ies). If first arg is a
|
21
84
|
number, it is treated as bump directive: 1 - bump:patch, 10 - bump:minor,
|
22
|
-
100 - bump:major. Otherwise all arguments are treated as part of commit message
|
23
|
-
|
24
|
-
$ gitcp [BUMP] Commit message goes here
|
85
|
+
100 - bump:major. Otherwise all arguments are treated as part of commit message.
|
86
|
+
Use inside project dir, preferably at top level.
|
25
87
|
|
26
|
-
|
27
|
-
|
28
|
-
$ sudo gem install my_scripts
|
88
|
+
...
|
29
89
|
|
30
90
|
== LICENSE:
|
31
91
|
|
data/Rakefile
CHANGED
@@ -5,8 +5,8 @@ begin
|
|
5
5
|
require 'jeweler'
|
6
6
|
Jeweler::Tasks.new do |gem|
|
7
7
|
gem.name = "my_scripts"
|
8
|
-
gem.summary = "
|
9
|
-
gem.description = "
|
8
|
+
gem.summary = "Simple framework for writing command-line scripts"
|
9
|
+
gem.description = "Simple framework for writing command-line scripts and collection of my own scripts (mostly dev-related)"
|
10
10
|
gem.email = "arvitallian@gmail.com"
|
11
11
|
gem.homepage = "http://github.com/arvicco/my_scripts"
|
12
12
|
gem.authors = ["arvicco"]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.9
|
data/bin/{gitcp → citi}
RENAMED
data/bin/dummy
ADDED
data/bin/gitto
ADDED
data/bin/recode.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
INFILE_NAME = 'ACCT_101.QIF'
|
3
|
+
OUTFILE_NAME = 'TEST.QIF'
|
4
|
+
INFILE_ENCODING = 'CP1251:UTF-8' # Encoding pair of log file ('File external:Ruby internal')
|
5
|
+
OUTFILE_ENCODING = 'CP1252:UTF-8' # Encoding pair of log file ('File external:Ruby internal')
|
6
|
+
#STDOUT_ENCODING = 'CP866:UTF-8' # Encoding pair of stdout ('Stdout external:Ruby internal')
|
7
|
+
REPLACES = {
|
8
|
+
/Pokupka Masterkard .*(Detskiy Mir).*/ => "Detski Mir\nLChildcare",
|
9
|
+
/Pokupka Masterkard .*(Medicina).*/ => "AO Medicina\nLMedical:Medicine",
|
10
|
+
/Pokupka Masterkard .*(Pharmacy).*/ => "\\1\nLMedical:Medicine",
|
11
|
+
/Pokupka Masterkard .*(Alye Parusa).*/ => "\\1\nLGroceries",
|
12
|
+
/Pokupka Masterkard .*(Perekrestok).*/ => "\\1\nLGroceries",
|
13
|
+
/Pokupka Masterkard .*(Ile De Beaute).*/ => "\\1\nLPersonal Care",
|
14
|
+
/Pokupka Masterkard .*(Beeline).*/ => "\\1\nLCommunications:Telephone",
|
15
|
+
/Pokupka Masterkard (.+) (Moscow Ru.+|Moskva Ru.+)/ => "\\1\nM\\2\nLHousehold",
|
16
|
+
/Vkhodyashchij Platezh(.+Bank Moskvy)/ => "Incoming transfer\nM\\1\nL[BM New Prestige]",
|
17
|
+
/Oplata Dolg Kr Karta(.+)/ => "Transfer to Credit card\nM\\1\nL[Citi MC]",
|
18
|
+
/Snyatie Nalichnykh(.+)/ => "Cash withdrawal\nM\\1\nL[Cash RUB]",
|
19
|
+
/Vznos Nalichnykh(.+)/ => "Cash deposit\nM\\1\nL[Cash RUB]",
|
20
|
+
/Kom Za Obsluzhivanie/ => "Citibank\nMService fee\nLFinance:Bank Charge",
|
21
|
+
'Universam '=> '',
|
22
|
+
'Supermarket '=> ''
|
23
|
+
}
|
24
|
+
|
25
|
+
class String
|
26
|
+
TRANSLIT_RUSSIAN = 'АБВГДЕЁЗИЙКЛМНОПРСТУФЪЫЬЭабвгдеёзийклмнопрстуфъыьэ'
|
27
|
+
TRANSLIT_LATIN = "ABVGDEEZIJKLMNOPRSTUF\"Y'Eabvgdeezijklmnoprstuf\"y'e"
|
28
|
+
TRANSLIT_DOUBLES = {'Ж'=>'ZH', 'Х'=>'KH', 'Ц'=>'TS', 'Ч'=>'CH', 'Ш'=>'SH', 'Щ'=>'SHCH', 'Ю'=>'YU', 'Я'=>'YA',
|
29
|
+
'ж'=>'zh', 'х'=>'kh', 'ц'=>'ts', 'ч'=>'ch', 'ш'=>'sh', 'щ'=>'shch', 'ю'=>'yu', 'я'=>'ya'}
|
30
|
+
|
31
|
+
def translit!
|
32
|
+
TRANSLIT_DOUBLES.each {|key, value| self.gsub!(key, value)}
|
33
|
+
self.tr!(TRANSLIT_RUSSIAN, TRANSLIT_LATIN)
|
34
|
+
self
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
#$stdout.set_encoding(STDOUT_ENCODING, :undef=>:replace)
|
39
|
+
File.open(OUTFILE_NAME, 'w:'+ (OUTFILE_ENCODING), :undef => :replace) do |outfile|
|
40
|
+
File.open(INFILE_NAME, 'r:'+ (INFILE_ENCODING), :undef => :replace).each_line do |line|
|
41
|
+
puts line, '-----------'
|
42
|
+
case line.chars.first
|
43
|
+
when 'D' # Date field - convert to MM/DD/YYYY format expected by Quicken
|
44
|
+
line.gsub! /(\d+)\/(\d+)\/(\d+)/, '\2/\1/\3'
|
45
|
+
when 'P' # Payee field
|
46
|
+
# Convert payee from Russian to translit
|
47
|
+
line.translit!
|
48
|
+
# Capitalize each word and remove extra whitespaces (leaves first char intact)
|
49
|
+
line[1..-1] = line[1..-1].scan(/\w+/).map{|word| word.capitalize}.join(' ')
|
50
|
+
# Preprocess Payee field making pre-defined replacements
|
51
|
+
REPLACES.each {|key, value| line.gsub!(key, value)}
|
52
|
+
when 'M' # Memo field - drop if empty
|
53
|
+
line.clear if line.rstrip == 'M'
|
54
|
+
end
|
55
|
+
|
56
|
+
outfile.puts line unless line.empty?
|
57
|
+
puts line, '-----------'
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module MyScripts
|
2
|
+
# This script converts given QIF file (with downloaded citibank statement)
|
3
|
+
# into Quicken 2008 compatible format, and outputs it into new file for
|
4
|
+
# import into Quicken
|
5
|
+
#
|
6
|
+
class Citi < Script
|
7
|
+
INFILE_ENCODING = 'CP1251:UTF-8' # Encoding pair of input file ('File external:Ruby internal')
|
8
|
+
OUTFILE_ENCODING = 'CP1252:UTF-8' # Encoding pair of output file ('File external:Ruby internal')
|
9
|
+
|
10
|
+
REPLACES = {
|
11
|
+
/Pokupka Masterkard .*(Detskiy Mir).*/ => "Detski Mir\nLChildcare",
|
12
|
+
/Pokupka Masterkard .*(Medicina).*/ => "AO Medicina\nLMedical:Medicine",
|
13
|
+
/Pokupka Masterkard .*(Pharmacy).*/ => "\\1\nLMedical:Medicine",
|
14
|
+
/Pokupka Masterkard .*(Alye Parusa).*/ => "\\1\nLGroceries",
|
15
|
+
/Pokupka Masterkard .*(Perekrestok).*/ => "\\1\nLGroceries",
|
16
|
+
/Pokupka Masterkard .*(Ile De Beaute).*/ => "\\1\nLPersonal Care",
|
17
|
+
/Pokupka Masterkard .*(Beeline).*/ => "\\1\nLCommunications:Telephone",
|
18
|
+
/Pokupka Masterkard (.+) (Moscow Ru.+|Moskva Ru.+)/ => "\\1\nM\\2\nLHousehold",
|
19
|
+
/Vkhodyashchij Platezh(.+Bank Moskvy)/ => "Incoming transfer\nM\\1\nL[BM New Prestige]",
|
20
|
+
/Oplata Dolg Kr Karta(.+)/ => "Transfer to Credit card\nM\\1\nL[Citi MC]",
|
21
|
+
/Snyatie Nalichnykh(.+)/ => "Cash withdrawal\nM\\1\nL[Cash RUB]",
|
22
|
+
/Vznos Nalichnykh(.+)/ => "Cash deposit\nM\\1\nL[Cash RUB]",
|
23
|
+
/Kom Za Obsluzhivanie/ => "Citibank\nMService fee\nLFinance:Bank Charge",
|
24
|
+
'Universam '=> '',
|
25
|
+
'Supermarket '=> ''
|
26
|
+
}
|
27
|
+
|
28
|
+
def run
|
29
|
+
usage "in_file.qif [out_file.qif]" if @argv.empty?
|
30
|
+
|
31
|
+
in_file = @argv.first
|
32
|
+
|
33
|
+
# If 2nd Arg is given, it is out_file name, otherwise derive from in_file name
|
34
|
+
out_file = @argv[1] ? @argv[1] : in_file.sub(/\.qif|$/, '_out.qif')
|
35
|
+
|
36
|
+
# All the other args lumped into message, or default message
|
37
|
+
message = @argv.empty? ? 'Commit' : @argv.join(' ')
|
38
|
+
# Timestamp added to message
|
39
|
+
message += " #{Time.now.to_s[0..-6]}"
|
40
|
+
|
41
|
+
puts "Committing (versionup =#{bump}) with message: #{message}"
|
42
|
+
|
43
|
+
system %Q[git add --all]
|
44
|
+
case bump
|
45
|
+
when 1..9
|
46
|
+
system %Q[rake version:bump:patch]
|
47
|
+
when 10..99
|
48
|
+
system %Q[rake version:bump:minor]
|
49
|
+
when 10..99
|
50
|
+
system %Q[rake version:bump:major]
|
51
|
+
end
|
52
|
+
system %Q[git commit -a -m "#{message}" --author arvicco]
|
53
|
+
system %Q[git push]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/my_scripts/cli.rb
CHANGED
@@ -1,24 +1,39 @@
|
|
1
1
|
module MyScripts
|
2
|
+
# This class encapsulates Command Line Interface for running scripts. It can be instantiated
|
3
|
+
# with stubbed stdin and stdout if you want to run tests on your scripts
|
2
4
|
class CLI
|
5
|
+
class ScriptNameError < NameError # :nodoc:
|
6
|
+
def initialize(message=nil)
|
7
|
+
message ? super(message) : super
|
8
|
+
end
|
9
|
+
end
|
3
10
|
|
4
11
|
attr_accessor :stdout, :stdin
|
5
12
|
|
13
|
+
# Instantiates new CLI(command line interface) and runs script with given name (token)
|
14
|
+
# and argv inside new CLI instance
|
6
15
|
def self.run( script_name, argv )
|
7
16
|
new.run script_name, argv
|
8
17
|
end
|
9
18
|
|
19
|
+
# Creates new command line interface
|
10
20
|
def initialize( stdin=$stdin, stdout=$stdout )
|
11
21
|
@stdin = stdin
|
12
22
|
@stdout = stdout
|
13
23
|
end
|
14
24
|
|
25
|
+
# Runs a script with given name (token) and argv inside this CLI instance
|
15
26
|
def run( script_name, argv )
|
16
|
-
script =
|
27
|
+
script = script_class_name(script_name).to_class
|
28
|
+
raise ScriptNameError.new("Script #{script_class_name(script_name)} not found") unless script
|
29
|
+
|
17
30
|
script.new(script_name, argv, self).run
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def script_class_name(script_name)
|
36
|
+
"MyScripts::#{script_name.to_s.camel_case}"
|
22
37
|
end
|
23
38
|
end
|
24
39
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module MyScripts
|
2
|
+
# Dummy script skeleton that is ready for your usage. Just put your script code
|
3
|
+
# inside run method (if you use ARGV, change it to @argv). Done!
|
4
|
+
# You can immediately run your script anywhere using following command:
|
5
|
+
# $ dummy Whatever arguments your code expects and processes
|
6
|
+
#
|
7
|
+
class Dummy < Script
|
8
|
+
def run
|
9
|
+
# here you do all actual work for your script
|
10
|
+
# you have following instance vars at your disposal:
|
11
|
+
# @name - your script name,
|
12
|
+
# @argv - your ARGV,
|
13
|
+
# @cli - CLI runner (holds references to stdin and stdout)
|
14
|
+
#...
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,4 +1,18 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
1
3
|
class String
|
4
|
+
TRANSLIT_CYRILLIC = 'АБВГДЕЁЗИЙКЛМНОПРСТУФЪЫЬЭабвгдеёзийклмнопрстуфъыьэ'
|
5
|
+
TRANSLIT_LATIN = "ABVGDEEZIJKLMNOPRSTUF\"Y'Eabvgdeezijklmnoprstuf\"y'e"
|
6
|
+
TRANSLIT_DOUBLES = {'Ж'=>'ZH', 'Х'=>'KH', 'Ц'=>'TS', 'Ч'=>'CH', 'Ш'=>'SH', 'Щ'=>'SHCH', 'Ю'=>'YU', 'Я'=>'YA',
|
7
|
+
'ж'=>'zh', 'х'=>'kh', 'ц'=>'ts', 'ч'=>'ch', 'ш'=>'sh', 'щ'=>'shch', 'ю'=>'yu', 'я'=>'ya'}
|
8
|
+
|
9
|
+
# Performs basic transliteration from Cyrillic to Latin characters and standard character combinations
|
10
|
+
def translit!
|
11
|
+
TRANSLIT_DOUBLES.each {|key, value| self.gsub!(key, value)}
|
12
|
+
self.tr!(TRANSLIT_CYRILLIC, TRANSLIT_LATIN)
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
2
16
|
# Turns string into appropriate class constant, returns nil if class not found
|
3
17
|
def to_class
|
4
18
|
klass = self.split("::").inject(Kernel) do |namespace, const|
|
@@ -8,4 +22,22 @@ class String
|
|
8
22
|
rescue NameError
|
9
23
|
nil
|
10
24
|
end
|
25
|
+
|
26
|
+
# Turns string into snake_case
|
27
|
+
def snake_case
|
28
|
+
gsub(/([a-z])([A-Z0-9])/, '\1_\2' ).downcase
|
29
|
+
end
|
30
|
+
|
31
|
+
# Turns string into CamelCase
|
32
|
+
def camel_case
|
33
|
+
if self.include? '_'
|
34
|
+
self.split('_').map{|e| e.capitalize}.join
|
35
|
+
else
|
36
|
+
unless self =~ (/^[A-Z]/)
|
37
|
+
self.capitalize
|
38
|
+
else
|
39
|
+
self
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
11
43
|
end
|
@@ -1,7 +1,11 @@
|
|
1
1
|
module MyScripts
|
2
|
-
|
2
|
+
# This script wraps up all work done on project in current directory,
|
3
|
+
# adds all new(unversioned) files to git, commits all work done so far,
|
4
|
+
# optionally bumps project version and pushes changes to remote repo
|
5
|
+
#
|
6
|
+
class Gitto < Script
|
3
7
|
def run
|
4
|
-
usage "[bump] Commit message goes here" if @argv.empty?
|
8
|
+
usage "[bump: 1 - patch, 10 - minor, 100 - major] Commit message goes here" if @argv.empty?
|
5
9
|
|
6
10
|
# If first Arg is a number, it indicates version bump
|
7
11
|
bump = @argv[0].to_i > 0 ? @argv.shift.to_i : 0
|
@@ -14,7 +18,6 @@ module MyScripts
|
|
14
18
|
puts "Committing (versionup =#{bump}) with message: #{message}"
|
15
19
|
|
16
20
|
system %Q[git add --all]
|
17
|
-
system %Q[git commit -a -m "#{message}" --author arvicco]
|
18
21
|
case bump
|
19
22
|
when 1..9
|
20
23
|
system %Q[rake version:bump:patch]
|
@@ -23,6 +26,7 @@ module MyScripts
|
|
23
26
|
when 10..99
|
24
27
|
system %Q[rake version:bump:major]
|
25
28
|
end
|
29
|
+
system %Q[git commit -a -m "#{message}" --author arvicco]
|
26
30
|
system %Q[git push]
|
27
31
|
end
|
28
32
|
end
|
data/lib/my_scripts/jew.rb
CHANGED
data/lib/my_scripts/mybones.rb
CHANGED
data/lib/my_scripts/rabbit.rb
CHANGED
data/lib/my_scripts/script.rb
CHANGED
@@ -1,11 +1,16 @@
|
|
1
1
|
module MyScripts
|
2
|
-
|
2
|
+
# Base class for all scripts. Subclass it and override run method with actual
|
3
|
+
# work your script will be doing
|
4
|
+
class Script
|
3
5
|
def initialize( name, argv, cli )
|
4
6
|
@name = name
|
5
7
|
@argv = argv
|
6
8
|
@cli = cli
|
7
9
|
end
|
8
10
|
|
11
|
+
def run
|
12
|
+
end
|
13
|
+
|
9
14
|
def puts *args
|
10
15
|
@cli.stdout.puts *args
|
11
16
|
end
|
data/lib/my_scripts.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
# Top level namespace
|
1
2
|
module MyScripts
|
3
|
+
|
4
|
+
# Used to auto-require all the source files located in lib/my_scripts
|
2
5
|
def self.require_libs( filename, filemask )
|
3
6
|
file = ::File.expand_path(::File.join(::File.dirname(filename), filemask.gsub(/(?<!.rb)$/,'.rb')))
|
4
7
|
require file if File.exist?(file) && !File.directory?(file)
|
data/my_scripts.gemspec
CHANGED
@@ -5,14 +5,14 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{my_scripts}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.9"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["arvicco"]
|
12
|
-
s.date = %q{2010-
|
13
|
-
s.description = %q{
|
12
|
+
s.date = %q{2010-02-12}
|
13
|
+
s.description = %q{Simple framework for writing command-line scripts and collection of my own scripts (mostly dev-related)}
|
14
14
|
s.email = %q{arvitallian@gmail.com}
|
15
|
-
s.executables = ["
|
15
|
+
s.executables = ["citi", "dummy", "gitto", "jew", "mybones", "rabbit", "recode.rb"]
|
16
16
|
s.extra_rdoc_files = [
|
17
17
|
"LICENSE",
|
18
18
|
"README.rdoc"
|
@@ -24,23 +24,29 @@ Gem::Specification.new do |s|
|
|
24
24
|
"README.rdoc",
|
25
25
|
"Rakefile",
|
26
26
|
"VERSION",
|
27
|
-
"bin/
|
27
|
+
"bin/citi",
|
28
|
+
"bin/dummy",
|
29
|
+
"bin/gitto",
|
28
30
|
"bin/jew",
|
29
31
|
"bin/mybones",
|
30
32
|
"bin/rabbit",
|
33
|
+
"bin/recode.rb",
|
31
34
|
"features/my_scripts.feature",
|
32
35
|
"features/step_definitions/my_scripts_steps.rb",
|
33
36
|
"features/support/env.rb",
|
34
37
|
"lib/my_scripts.rb",
|
38
|
+
"lib/my_scripts/citi.rb",
|
35
39
|
"lib/my_scripts/cli.rb",
|
40
|
+
"lib/my_scripts/dummy.rb",
|
36
41
|
"lib/my_scripts/extensions.rb",
|
37
|
-
"lib/my_scripts/
|
42
|
+
"lib/my_scripts/gitto.rb",
|
38
43
|
"lib/my_scripts/jew.rb",
|
39
44
|
"lib/my_scripts/mybones.rb",
|
40
45
|
"lib/my_scripts/rabbit.rb",
|
41
46
|
"lib/my_scripts/script.rb",
|
42
47
|
"my_scripts.gemspec",
|
43
48
|
"spec/my_scripts/extensions_spec.rb",
|
49
|
+
"spec/my_scripts_spec.rb",
|
44
50
|
"spec/spec.opts",
|
45
51
|
"spec/spec_helper.rb"
|
46
52
|
]
|
@@ -48,9 +54,10 @@ Gem::Specification.new do |s|
|
|
48
54
|
s.rdoc_options = ["--charset=UTF-8"]
|
49
55
|
s.require_paths = ["lib"]
|
50
56
|
s.rubygems_version = %q{1.3.5}
|
51
|
-
s.summary = %q{
|
57
|
+
s.summary = %q{Simple framework for writing command-line scripts}
|
52
58
|
s.test_files = [
|
53
59
|
"spec/my_scripts/extensions_spec.rb",
|
60
|
+
"spec/my_scripts_spec.rb",
|
54
61
|
"spec/spec_helper.rb"
|
55
62
|
]
|
56
63
|
|
@@ -1,5 +1,4 @@
|
|
1
|
-
require File.expand_path(
|
2
|
-
File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
3
2
|
|
4
3
|
module MyScriptsTest
|
5
4
|
module A
|
@@ -10,6 +9,26 @@ module MyScriptsTest
|
|
10
9
|
end
|
11
10
|
|
12
11
|
describe String do
|
12
|
+
context '#snake_case' do
|
13
|
+
it 'transforms CamelCase strings' do
|
14
|
+
'GetCharWidth32'.snake_case.should == 'get_char_width_32'
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'leaves snake_case strings intact' do
|
18
|
+
'keybd_event'.snake_case.should == 'keybd_event'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context '#camel_case' do
|
23
|
+
it 'transforms underscore strings to CamelCase' do
|
24
|
+
'get_char_width_32'.camel_case.should == 'GetCharWidth32'
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'leaves CamelCase strings intact' do
|
28
|
+
'GetCharWidth32'.camel_case.should == 'GetCharWidth32'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
13
32
|
context '#to_class' do
|
14
33
|
it 'converts string into appropriate Class constant' do
|
15
34
|
"Fixnum".to_class.should == Fixnum
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
2
|
+
|
3
|
+
module MyScriptsTest
|
4
|
+
|
5
|
+
# creates new CLI object with mock stdin and stdout,
|
6
|
+
# stdin optionally preloaded with fake user input
|
7
|
+
def create_cli( opts={} )
|
8
|
+
@stdout = options[:stdout] || mock('stdout').as_null_object
|
9
|
+
@stdin = options[:stdin] || mock('stdin')
|
10
|
+
@stdin.stub(:gets).and_return(*options[:input]) if options[:input]
|
11
|
+
@cli = MyScripts::CLI.new @stdin, @stdout
|
12
|
+
end
|
13
|
+
|
14
|
+
# sets expectation for stdout to receive strictly ordered sequence of exact messages
|
15
|
+
def stdout_should_receive(*messages)
|
16
|
+
messages.each do |message|
|
17
|
+
@stdout.should_receive(:puts).with(message).once.ordered
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# sets expectation for stdout to receive message(s) containing all of the patterns (unordered)
|
22
|
+
def stdout_should_include(*patterns)
|
23
|
+
patterns.each do |pattern|
|
24
|
+
re = Regexp === pattern ? pattern : Regexp.new(Regexp.escape(pattern))
|
25
|
+
@stdout.should_receive(:puts).with(re).at_least(:once)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe 'Script Execution' do
|
30
|
+
|
31
|
+
context 'trying to execute undefined script' do
|
32
|
+
it 'fails' do
|
33
|
+
cli = create_cli
|
34
|
+
proc{cli.run( :undefined, [])}.should raise_error "Script MyScripts::Undefined not found"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'executing pre-defined scripts' do
|
39
|
+
MyScripts.module_eval "
|
40
|
+
# Stub script that just puts 'OK' to stdout
|
41
|
+
class Scriptest < Script
|
42
|
+
def run
|
43
|
+
puts 'OK'
|
44
|
+
1
|
45
|
+
end
|
46
|
+
end"
|
47
|
+
|
48
|
+
it 'executes pre-defined script without args' do
|
49
|
+
cli = create_cli
|
50
|
+
stdout_should_receive('OK')
|
51
|
+
cli.run( :scriptest, [])
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'executes pre-defined script with args' do
|
55
|
+
cli = create_cli
|
56
|
+
stdout_should_receive('OK')
|
57
|
+
cli.run( :scriptest, [1, 2, 3, :four, 'five'])
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'returns return value of Script#run() when running pre-defined script' do
|
61
|
+
cli = create_cli
|
62
|
+
cli.run( :scriptest, []).should == 1
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'executing scripts with snake_case names' do
|
67
|
+
MyScripts.module_eval "
|
68
|
+
# Stub script that just puts 'OK' to stdout
|
69
|
+
class SnakeScript < Script
|
70
|
+
def run
|
71
|
+
puts 'OK'
|
72
|
+
end
|
73
|
+
end"
|
74
|
+
|
75
|
+
it 'executes scripts with snake_case name' do
|
76
|
+
cli = create_cli
|
77
|
+
stdout_should_receive('OK')
|
78
|
+
cli.run( :snake_script, [])
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: my_scripts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- arvicco
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-
|
12
|
+
date: 2010-02-12 00:00:00 +03:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -32,13 +32,16 @@ dependencies:
|
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: "0"
|
34
34
|
version:
|
35
|
-
description:
|
35
|
+
description: Simple framework for writing command-line scripts and collection of my own scripts (mostly dev-related)
|
36
36
|
email: arvitallian@gmail.com
|
37
37
|
executables:
|
38
|
-
-
|
38
|
+
- citi
|
39
|
+
- dummy
|
40
|
+
- gitto
|
39
41
|
- jew
|
40
42
|
- mybones
|
41
43
|
- rabbit
|
44
|
+
- recode.rb
|
42
45
|
extensions: []
|
43
46
|
|
44
47
|
extra_rdoc_files:
|
@@ -51,23 +54,29 @@ files:
|
|
51
54
|
- README.rdoc
|
52
55
|
- Rakefile
|
53
56
|
- VERSION
|
54
|
-
- bin/
|
57
|
+
- bin/citi
|
58
|
+
- bin/dummy
|
59
|
+
- bin/gitto
|
55
60
|
- bin/jew
|
56
61
|
- bin/mybones
|
57
62
|
- bin/rabbit
|
63
|
+
- bin/recode.rb
|
58
64
|
- features/my_scripts.feature
|
59
65
|
- features/step_definitions/my_scripts_steps.rb
|
60
66
|
- features/support/env.rb
|
61
67
|
- lib/my_scripts.rb
|
68
|
+
- lib/my_scripts/citi.rb
|
62
69
|
- lib/my_scripts/cli.rb
|
70
|
+
- lib/my_scripts/dummy.rb
|
63
71
|
- lib/my_scripts/extensions.rb
|
64
|
-
- lib/my_scripts/
|
72
|
+
- lib/my_scripts/gitto.rb
|
65
73
|
- lib/my_scripts/jew.rb
|
66
74
|
- lib/my_scripts/mybones.rb
|
67
75
|
- lib/my_scripts/rabbit.rb
|
68
76
|
- lib/my_scripts/script.rb
|
69
77
|
- my_scripts.gemspec
|
70
78
|
- spec/my_scripts/extensions_spec.rb
|
79
|
+
- spec/my_scripts_spec.rb
|
71
80
|
- spec/spec.opts
|
72
81
|
- spec/spec_helper.rb
|
73
82
|
has_rdoc: true
|
@@ -97,7 +106,8 @@ rubyforge_project:
|
|
97
106
|
rubygems_version: 1.3.5
|
98
107
|
signing_key:
|
99
108
|
specification_version: 3
|
100
|
-
summary:
|
109
|
+
summary: Simple framework for writing command-line scripts
|
101
110
|
test_files:
|
102
111
|
- spec/my_scripts/extensions_spec.rb
|
112
|
+
- spec/my_scripts_spec.rb
|
103
113
|
- spec/spec_helper.rb
|