bencview 0.0.2 → 1.0.0

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/bin/bencview_clean DELETED
@@ -1,58 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*-ruby-*-
3
-
4
- require 'bencode'
5
- require_relative '../lib/bencview/trestle.rb'
6
-
7
- include Bencview
8
-
9
- $conf = Hash.new
10
- u = Trestle.new($conf)
11
-
12
- $conf[:banner] = "Usage: #{File.basename($0)} [options] file [file ...]"
13
- $conf[:a] = 'http://tracker.openbittorrent.com/announce'
14
-
15
-
16
- # --[ main ]------------------------------------------------------------
17
-
18
- u.config_parse(['foobar']) {|src|
19
- o = u.cl_parse(src) # create an OptionParser object
20
- o.on('-a STR', 'An announce tracker URL') {|i|
21
- $conf[:a] = i
22
- }
23
- u.cl_parse(src, o) # run cl parser
24
- }
25
-
26
- # print our env
27
- if $conf[:verbose] >= 2
28
- puts 'Libs dir: ' + Trestle.gem_libdir
29
- pp $conf
30
- end
31
-
32
- Trestle.errx(1, $conf[:banner]) if ARGV.size == 0
33
-
34
- ec = 0
35
- ARGV.each {|i|
36
- begin
37
- t = BEncode.load_file i
38
- rescue
39
- STDERR.puts "#{File.basename i}: #{$!}"
40
- ec += 1
41
- next
42
- end
43
-
44
- t['comment'] = 'Leech without any rating!'
45
- t['announce'] = $conf[:a]
46
- t['announce-list'] = []
47
-
48
- out = "" if (out = File.dirname(i) + '/') == "./"
49
- out = out + File.basename(i, File.extname(i)) + '.CLEANED' + File.extname(i)
50
- u.veputs(1, out)
51
- begin
52
- open(out, 'w+') {|fp| fp.write(BEncode.dump(t)) }
53
- rescue
54
- STDERR.puts $!.to_s
55
- ec += 1
56
- end
57
- }
58
- exit ec
data/doc/LICENSE DELETED
@@ -1,22 +0,0 @@
1
- (The MIT License)
2
-
3
- Copyright (c) 2010 Alexander Gromnitsky.
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 NONINFRINGEMENT.
19
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/doc/NEWS.rdoc DELETED
@@ -1,11 +0,0 @@
1
- === 0.0.2
2
-
3
- Fri May 6 00:21:14 EEST 2011
4
-
5
- - Minor Rakefile update.
6
-
7
- === 0.0.1
8
-
9
- Fri, 31 Dec 2010 10:54:08 +0200
10
-
11
- - Created a first skeleton.
data/doc/README.rdoc DELETED
@@ -1,9 +0,0 @@
1
- bencview suite contains several utils to manage .torrent files.
2
-
3
- bencview:: Torrent file viewer.
4
-
5
- bencview_clean:: Cleans a list of announce trackers & replaces
6
- main announce tracker (to be able to cheat,
7
- for example, http://rutracker.org, ha-ha).
8
-
9
- Read about them in corresponding <tt>*.rdoc</tt> files.
data/doc/bencview.rdoc DELETED
@@ -1,59 +0,0 @@
1
- =Name
2
-
3
- bencview--torrent file viewer.
4
-
5
-
6
- ==Synopsis
7
-
8
- bencview [options] file [file ...]
9
-
10
-
11
- ==Description
12
-
13
- The bencview utility reads torrent files and prints their metadata to
14
- stdout.
15
-
16
- The options are as follows:
17
-
18
- -d:: Dump all as raw hash.
19
-
20
- --config-dirs:: List all possible locations for the
21
- configuration file. The first found wins.
22
-
23
- --config NAME:: The name of the configuration file. If
24
- it contains <tt>/</tt> in it, the list from
25
- <tt>--config-dirs</tt> is ignored.
26
-
27
- -V:: Show version and exit.
28
-
29
- -v:: Be more verbose. You can supply it several
30
- times, viz. <tt>-vv</tt> dumps even more
31
- debug info.
32
-
33
- ==Configuration
34
-
35
- bencview looks for its configuration at 3 places at start up.
36
-
37
- 1. At <tt>BENCVIEW_CONF</tt> env variable.
38
- (Its format is exactly similar to CL options.)
39
-
40
- 2. At the configuration file. Its default name is
41
- <tt>bencview.yaml</tt> and it can be stored in several
42
- system directories which are observable by <tt>--config--dirs</tt> CL
43
- option.
44
-
45
- 3. At command line.
46
-
47
- Higher number levels overrides the values from lower number levels.
48
-
49
- The configuration file must be in YAML format. Look into <tt>`gem env
50
- gemdir`/gems/bencview-x.y.z/etc/</tt> directory for samples.
51
-
52
-
53
- ==Examples
54
-
55
- % bencview foo.torrent bar.torrent
56
-
57
- ==See Also
58
-
59
- {bencview_clean}[link:doc/bencview_clean_rdoc.html]
@@ -1,75 +0,0 @@
1
- =Name
2
-
3
- bencview_clean--cleans a list of announce trackers & replaces main
4
- announce tracker.
5
-
6
-
7
- ==Synopsis
8
-
9
- bencview [options] file [file ...]
10
-
11
-
12
- ==Description
13
-
14
- The bencview_clean utility reads a torrent file and creates a 'cleaner'
15
- copy of it (with <tt>.CLEANED.torrent</tt> extension) to give you an
16
- ability to download staff from such idiotic bittorent trackers which
17
- require 'rating' or other bullshit to participate. (For example, see
18
- http://rutracker.org)
19
-
20
- If a creator of the torrent file has disabled DHT (because he is a
21
- moron), you will not able to use 'cleaner' version of the torrent
22
- file. Sorry.
23
-
24
- The options are as follows:
25
-
26
- -a URL:: An announce tracker URL.
27
-
28
- --config-dirs:: List all possible locations for the
29
- configuration file. The first found wins.
30
-
31
- --config NAME:: The name of the configuration file. If
32
- it contains <tt>/</tt> in it, the list from
33
- <tt>--config-dirs</tt> is ignored.
34
-
35
- -V:: Show version and exit.
36
-
37
- -v:: Be more verbose. You can supply it several
38
- times, viz. <tt>-vv</tt> dumps even more
39
- debug info.
40
-
41
-
42
- ==Configuration
43
-
44
- bencview_clean looks for its configuration at 3 places at start up.
45
-
46
- 1. At <tt>BENCVIEW_CONF</tt> env variable.
47
- (Its format is exactly similar to CL options.)
48
-
49
- 2. At the configuration file. Its default name is
50
- <tt>bencview.yaml</tt> and it can be stored in several
51
- system directories which are observable by <tt>--config--dirs</tt> CL
52
- option.
53
-
54
- 3. At command line.
55
-
56
- Higher number levels overrides the values from lower number levels.
57
-
58
- The configuration file must be in YAML format. Look into <tt>`gem env
59
- gemdir`/gems/bencview-x.y.z/etc/</tt> directory for samples.
60
-
61
- ==Exit Status
62
-
63
- The utility exits 0 on success, and >0 if an error occurs. For example,
64
- if it read 3 files and 2 of them were invalid, the exit status will be 2
65
- (the number of failures).
66
-
67
- ==Examples
68
-
69
- % bencview_clean foo.torrent bar.torrent
70
- % bencview_clean -v foobar.torrent
71
- % bencview_clean -a 'http://tracker.example.org' foobar.torrent
72
-
73
- ==See Also
74
-
75
- {bencview}[link:doc/bencview_rdoc.html]
data/etc/bencview.yaml DELETED
@@ -1,2 +0,0 @@
1
- ---
2
- :foobar: foobar
data/lib/bencview/meta.rb DELETED
@@ -1,9 +0,0 @@
1
- module Bencview
2
- module Meta
3
- NAME = 'bencview'
4
- VERSION = '0.0.2'
5
- AUTHOR = 'Alexander Gromnitsky'
6
- EMAIL = 'alexander.gromnitsky@gmail.com'
7
- HOMEPAGE = 'http://github.com/gromnitsky/' + NAME
8
- end
9
- end
@@ -1,216 +0,0 @@
1
- # :erb:
2
- require 'yaml'
3
- require 'shellwords.rb'
4
- require 'optparse'
5
- require 'pp'
6
- require 'open4'
7
-
8
- require_relative 'meta'
9
-
10
- # :include: ../../README.rdoc
11
- module Bencview
12
-
13
- class Trestle
14
-
15
- # Execute _cmd_ and return a list [exit_status, stderr,
16
- # stdout]. Very handy.
17
- def self.cmd_run(cmd)
18
- so = sr = ''
19
- status = Open4::popen4(cmd) { |pid, stdin, stdout, stderr|
20
- so = stdout.read
21
- sr = stderr.read
22
- }
23
- [status.exitstatus, sr, so]
24
- end
25
-
26
- # Return a directory with program libraries.
27
- def self.gem_libdir
28
- t = ["#{File.dirname(File.expand_path($0))}/../lib/#{Bencview::Meta::NAME}",
29
- "#{Gem.dir}/gems/#{Bencview::Meta::NAME}-#{Bencview::Meta::VERSION}/lib/#{Bencview::Meta::NAME}",
30
- "lib/#{Bencview::Meta::NAME}"]
31
- t.each {|i| return i if File.readable?(i) }
32
- fail "all paths are invalid: #{t}"
33
- end
34
-
35
- # Analogue to shell command +which+.
36
- def self.in_path?(file)
37
- return true if file =~ %r%\A/% and File.exist? file
38
-
39
- ENV['PATH'].split(File::PATH_SEPARATOR).any? do |path|
40
- File.exist? File.join(path, file)
41
- end
42
- end
43
-
44
- # Print an error message _t_ and exit if _ec_ > 0.
45
- def self.errx(ec, t)
46
- STDERR.puts File.basename($0) + ' error: ' + t.to_s
47
- exit ec if ec > 0
48
- end
49
-
50
- # Print a warning.
51
- def self.warnx(t)
52
- STDERR.puts File.basename($0) + ' warning: ' + t.to_s
53
- end
54
-
55
- # #veputs uses this to decide to put a newline or not to put.
56
- NNL_MARK = '__NNL__'
57
-
58
- # Use this in your CL options to check if modifying some variable is
59
- # not an idempotent act.
60
- attr_reader :cl_opt_protect
61
-
62
- # [conf] Typically must be a reference to some global variable.
63
- def initialize(conf)
64
- @conf = conf
65
- @conf[:verbose] = 0
66
- @conf[:banner] = "Usage: #{File.basename($0)} [options]"
67
- @conf[:config] = Meta::NAME + '.yaml'
68
- @conf[:config_dirs] = [ENV['HOME']+'/.'+Meta::NAME,
69
- File.absolute_path("#{File.dirname(File.expand_path($0))}/../etc"),
70
- '/usr/etc', '/usr/local/etc', '/etc',
71
- "#{Gem.dir}/gems/#{Meta::NAME}-#{Meta::VERSION}/etc"
72
- ]
73
- @conf[:config_env] = [Meta::NAME.upcase + '_CONF']
74
-
75
- @cl_parsing_times = 0 # not used
76
- @cl_opt_protect = false
77
- end
78
-
79
- # [level] A verbose level.
80
- # [t] A string to print.
81
- #
82
- # Don't print _t_ with a newline if it contains NNL_MARK at the end.
83
- def veputs(level, t)
84
- t = t.dup
85
- nnl = nil
86
- if t.match(/#{NNL_MARK}$/)
87
- t.sub!(/#{$&}/, '')
88
- nnl = 1
89
- end
90
-
91
- if @conf[:verbose] >= level
92
- nnl ? print(t) : puts(t)
93
- STDOUT.flush
94
- end
95
- end
96
-
97
- # Run all configuration parsing in a batch.
98
- #
99
- # [rvars] A list of variable names which must be in the
100
- # configuration file.
101
- #
102
- # If no block is given, only standard CL options will be analysed.
103
- def config_parse(rvars, &block)
104
- cb = ->(b, src) {
105
- if b
106
- block.call src
107
- else
108
- # very basic default options
109
- cl_parse(src, nil, true)
110
- end
111
- }
112
-
113
- # 1. parse env
114
- @conf[:config_env].each {|i|
115
- # puts '0 run:'
116
- cb.call(block_given?, ENV[i].shellsplit) if ENV.key?(i)
117
- }
118
-
119
- # 2. parse CL in case of '--config' option
120
- # puts "\n1 run"
121
- @cl_opt_protect = true
122
- cb.call(block_given?, ARGV.dup)
123
- @cl_opt_protect = false
124
-
125
- # 3. load the configuration file & do the final CL parsing
126
- begin
127
- # puts "\n2 run"
128
- r = config_flat_load(rvars)
129
- rescue
130
- Trestle.errx(1, "cannot load config: #{$!}")
131
- end
132
- veputs(1, "Loaded config: #{r}")
133
- cb.call(block_given?, ARGV)
134
- end
135
-
136
- # Load a config file immediately if it contains '/' in its name,
137
- # otherwise search through several dirs for it.
138
- #
139
- # [rvars] a list of requied variables in the config
140
- #
141
- # Return a loaded filename or nil on error.
142
- def config_flat_load(rvars)
143
- p = ->(f) {
144
- if File.readable?(f)
145
- begin
146
- myconf = YAML.load_file(f)
147
- rescue
148
- abort("cannot parse #{f}: #{$!}")
149
- end
150
- rvars.each { |i|
151
- fail "missing or nil '#{i}' in #{f}" if ! myconf.key?(i.to_sym) || ! myconf[i.to_sym]
152
- }
153
- @conf.merge!(myconf)
154
- return @conf[:config]
155
- end
156
- return nil
157
- }
158
-
159
- if @conf[:config].index('/')
160
- return p.call(@config[:config])
161
- else
162
- @conf[:config_dirs].each {|dir|
163
- return dir+'/'+@conf[:config] if p.call(dir + '/' + @conf[:config])
164
- }
165
- end
166
-
167
- return nil
168
- end
169
-
170
-
171
- # Parses CL-like options.
172
- #
173
- # [src] An array of options (usually +ARGV+).
174
- #
175
- # If _o_ is non nil function parses _src_ immediately, otherwise it
176
- # only creates +OptionParser+ object and return it (if _simple_ is
177
- # false).
178
- def cl_parse(src, o = nil, simple = false)
179
- if ! o then
180
- # puts "NEW o (#{cl_opt_protect})" + src.to_s
181
- o = OptionParser.new
182
- o.banner = @conf[:banner]
183
- o.on('-v', 'Be more verbose.') { |i|
184
- # puts "cl_parsing_times "+cl_parsing_times.to_s
185
- @conf[:verbose] += 1 unless cl_opt_protect
186
- }
187
- o.on('-V', 'Show version & exit.') { |i|
188
- puts Meta::VERSION
189
- exit 0
190
- }
191
- o.on('--config NAME', "Set a config name (default is #{@conf[:config]})") {|i|
192
- @conf[:config] = i
193
- }
194
- o.on('--config-dirs', 'Show possible config locations') {
195
- @conf[:config_dirs].each { |j|
196
- f = j + '/' + @conf[:config]
197
- puts (File.readable?(f) ? '* ' : ' ') + f
198
- }
199
- exit 0
200
- }
201
-
202
- return o if ! simple
203
- end
204
-
205
- begin
206
- o.parse!(src)
207
- @cl_parsing_times += 1
208
- rescue
209
- Trestle.errx(1, $!.to_s)
210
- end
211
- end
212
-
213
- end # trestle
214
- end
215
-
216
- # Don't remove this: falsework/0.2.2/naive/2010-12-26T04:50:00+02:00
data/test/helper.rb DELETED
@@ -1,4 +0,0 @@
1
- # This is supposed to be your helper for all your test. Feel free to
2
- # add staff here.
3
-
4
- require_relative 'helper_trestle'
@@ -1,37 +0,0 @@
1
- # :erb:
2
- # Various staff for minitest. Include this file into your 'helper.rb'.
3
-
4
- require 'fileutils'
5
- include FileUtils
6
-
7
- require_relative '../lib/bencview/trestle'
8
- include Bencview
9
-
10
- # don't run tests automatically if they were invoked as 'gem check -t ...'
11
- if $0 =~ /gem/
12
- require 'minitest/unit'
13
- else
14
- require 'minitest/autorun'
15
- end
16
-
17
- # Return the right directory for (probably executable) _c_.
18
- def cmd(c)
19
- case File.basename(Dir.pwd)
20
- when Meta::NAME.downcase
21
- # test probably is executed from the Rakefile
22
- Dir.chdir('test')
23
- when 'test'
24
- # we are in the test directory, there is nothing special to do
25
- else
26
- # tests were invoked by 'gem check -t bencview'
27
- begin
28
- Dir.chdir(Trestle.gem_libdir + '/../../test')
29
- rescue
30
- raise "running tests from '#{Dir.pwd}' isn't supported: #{$!}"
31
- end
32
- end
33
-
34
- '../bin/' + c
35
- end
36
-
37
- # Don't remove this: falsework/0.2.2/naive/2010-12-26T04:50:00+02:00
data/test/rake_git.rb DELETED
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*-ruby-*-
3
- # :erb:
4
-
5
- # This is a helper for your Rakefile. Read the comments for each
6
- # function.
7
-
8
- require 'git'
9
- require 'pp'
10
-
11
- # Return a list of files in a git repository _repdir_.
12
- #
13
- # Add this to your gem spec:
14
- #
15
- # spec = Gem::Specification.new {|i|
16
- # i.files = git_ls('.')
17
- # }
18
- #
19
- # What it does is just collecting the list of the files from the git
20
- # repository. The idea is to use that list for the gem spec. No more
21
- # missing or redundant files in gems!
22
- def git_ls(repdir, ignore_some = true)
23
- ignore = ['/?\.gitignore$']
24
-
25
- r = []
26
- g = Git.open repdir
27
- g.ls_files.each {|i, v|
28
- next if ignore_some && ignore.index {|ign| i.match(/#{ign}/) }
29
- r << i
30
- }
31
- r
32
- end
33
-
34
- pp git_ls('.') if __FILE__ == $0
35
-
36
- # Don't remove this: falsework/0.2.2/naive/2010-12-26T04:50:00+02:00
@@ -1,43 +0,0 @@
1
- require_relative 'helper'
2
- require 'bencode'
3
- require 'digest/md5'
4
-
5
- class TestBencview_1272419217 < MiniTest::Unit::TestCase
6
- CMD = cmd('bencview') # get path to the exe & cd to tests directory
7
-
8
- def setup
9
- # this runs every time before test_*
10
- end
11
-
12
- def test_cleaner
13
- c = cmd('bencview_clean')
14
- r = Trestle.cmd_run "#{c} qwerty asdfgh"
15
- assert_equal(2, r[0])
16
- assert_match(/No such file or directory/, r[1])
17
-
18
- r = Trestle.cmd_run "#{c} -v torrent/[rutracker.org]2642547.torrent"
19
- assert_equal(0, r[0])
20
-
21
- t = BEncode.load_file r[2].strip
22
- assert_equal('Leech without any rating!', t['comment'])
23
- assert_equal([], t['announce-list'])
24
- assert_equal('http://tracker.openbittorrent.com/announce', t['announce'])
25
- end
26
-
27
- def test_viewer
28
- r = Trestle.cmd_run "#{CMD} qwerty asdfgh"
29
- assert_equal(2, r[0])
30
- assert_match(/No such file or directory/, r[1])
31
-
32
- r = Trestle.cmd_run "#{CMD} torrent/*.torrent"
33
- assert_equal(0, r[0])
34
- refute_equal(0, r[2].size)
35
-
36
- r = Trestle.cmd_run "#{CMD} torrent/[rutracker.org]314407.torrent torrent/[rutracker.org].t3128973.torrent"
37
- assert_equal(0, r[0])
38
- achieved = Digest::MD5.hexdigest(r[2].encode('UTF-8', Encoding.default_external))
39
- expected = Digest::MD5.hexdigest(File.read('viewer_output_01.txt').encode('UTF-8', 'KOI8-U'))
40
- assert_equal(expected, achieved)
41
- end
42
-
43
- end