segua 0.1.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/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ doc
2
+ .yardoc
3
+
data/.yardopts ADDED
@@ -0,0 +1,4 @@
1
+ --markup "markdown"
2
+ --title "Segua"
3
+ lib/**/*.rb -
4
+ README.md LICENSE.md
data/LICENSE.md ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2012 by the University of Arizona.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are
6
+ met:
7
+
8
+ * Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+
11
+ * Redistributions in binary form must reproduce the above copyright
12
+ notice, this list of conditions and the following disclaimer in
13
+ the documentation and/or other materials provided with the
14
+ distribution.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,59 @@
1
+ Segua
2
+ =====
3
+
4
+ Introduction
5
+ ------------
6
+
7
+ Segua is a tool that works similar to `tail -f`. The primary difference is that Segua uses a directory, not a file, as input. It then finds the file with the most recent modification time, and follows that file. After printing a line, Segua will review the directory entries to see if one has a newer modification time, and begin following that one.
8
+
9
+ Compatibility
10
+ -------------
11
+
12
+ Segua is tested on the following platforms:
13
+
14
+ * **ruby-1.9.3** on **Linux**
15
+
16
+ That is all.
17
+
18
+ Roadmap
19
+ -------
20
+
21
+ * Tests :P
22
+ * Do not print the whole file contents at the beginning. Act more like `tail -f`
23
+ * Make the `SEGUA` lines optional.
24
+ * Option for using creation time, instead of modification time
25
+ * Fix: `/home/sam/code/segua/lib/segua.rb:36:in `strip': invalid byte sequence in UTF-8 (ArgumentError)` when latest file is a Vim swap file.
26
+
27
+ Installation
28
+ ------------
29
+
30
+ gem install segua
31
+
32
+ Contributing
33
+ ------------
34
+
35
+ Please do! Contributing is easy. Please read the CONTRIBUTING.md document for more info. ... Whet exists.
36
+
37
+ Usage
38
+ -----
39
+
40
+ Segua is meant to be used primarily as the binary script that is provided, `segua`. You can also require the class itself, with
41
+
42
+ require 'segua'
43
+ segua = Segua.new("some/directory")
44
+
45
+ Versioning
46
+ ----------
47
+
48
+ Segua follows [Semantic Versioning](http://semver.org/) (at least approximately) version 2.0.0-rc1.
49
+
50
+ Further Reading
51
+ ---------------
52
+
53
+ * [tail man page](http://unixhelp.ed.ac.uk/CGI/man-cgi?tail)
54
+
55
+ License
56
+ -------
57
+
58
+ Please see [LICENSE.md|LICENSE.md].
59
+
data/bin/segua ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ require File.join(File.dirname(File.expand_path(__FILE__)), '..', 'lib', 'segua')
3
+
4
+ dir = File.expand_path(ARGV.shift)
5
+
6
+ segua = Segua.new(dir)
7
+ segua.follow
@@ -0,0 +1,4 @@
1
+ class Segua
2
+ # Gem version
3
+ Version = "0.1.0"
4
+ end
data/lib/segua.rb ADDED
@@ -0,0 +1,64 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), 'segua', 'version')
2
+
3
+ # Segua tracks changes in files in `@dir`, always following the most recently changed.
4
+ #
5
+ # It emulates `tail -f`. `tail's` argument, `-f`, stands for "follow." "Segua" is the imperative
6
+ # form of "to follow" in Italian.
7
+ class Segua
8
+ # Create a new Segua against `dir`.
9
+ def initialize(dir)
10
+ @dir = dir
11
+ end
12
+
13
+ # Print a few lines before switching to a new file, indicating the new file.
14
+ def print_file_update(file_name)
15
+ puts ""
16
+ puts "SEGUA: ==================" + ('='*file_name.length)
17
+ puts "SEGUA: most recent file: #{file_name}"
18
+ puts "SEGUA: ==================" + ('='*file_name.length)
19
+ puts ""
20
+ end
21
+
22
+ # Following the file with the most recent modification time, print each line of the file,
23
+ # indefinitely.
24
+ def follow
25
+ file_name = latest_file
26
+ while file_name.nil?
27
+ sleep 1
28
+ file_name = latest_file
29
+ end
30
+
31
+ print_file_update(file_name)
32
+ handle = File.open file_name
33
+
34
+ while true
35
+ line = handle.gets
36
+ if line.nil?
37
+ sleep 0.5
38
+ else
39
+ puts line.chomp.strip
40
+ end
41
+ new_file_name = latest_file
42
+ while new_file_name.nil?
43
+ sleep 1
44
+ new_file_name = latest_file
45
+ end
46
+ if new_file_name != file_name
47
+ print_file_update(new_file_name)
48
+ file_name = new_file_name
49
+ handle.close
50
+ handle = File.open file_name
51
+ next
52
+ end
53
+ end
54
+ handle.close
55
+ end
56
+
57
+ # Find, among all of the files located directly inside `dir`, the one with the most recent
58
+ # modification time. Returns the full file path as a String.
59
+ def latest_file
60
+ Dir.entries(@dir).map {|f| File.join(@dir, f) }.reject {|f| File.directory?(f) }.inject do |memo,file|
61
+ File.mtime(memo) > File.mtime(file) ? memo : file
62
+ end
63
+ end
64
+ end
metadata ADDED
@@ -0,0 +1,56 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: segua
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sam Rawlins
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-09 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Segua acts like tail -f, except that it accepts a directory as input,
15
+ not a file. It then constantly evaluates which file is the most recently modified,
16
+ and follows that file.
17
+ email:
18
+ - katt-core@listserv.arizona.edu
19
+ executables:
20
+ - segua
21
+ extensions: []
22
+ extra_rdoc_files: []
23
+ files:
24
+ - .gitignore
25
+ - .yardopts
26
+ - LICENSE.md
27
+ - README.md
28
+ - bin/segua
29
+ - lib/segua.rb
30
+ - lib/segua/version.rb
31
+ homepage: http://uaz-kf-a09.mosaic.arizona.edu/
32
+ licenses: []
33
+ post_install_message:
34
+ rdoc_options: []
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ requirements: []
50
+ rubyforge_project:
51
+ rubygems_version: 1.8.17
52
+ signing_key:
53
+ specification_version: 3
54
+ summary: Follow the most recently modified files in a directory.
55
+ test_files: []
56
+ has_rdoc: