[#35036] Intentional Programming — "John" <nojgoalbyspam@...>

Hi all

17 messages 2002/03/01

[#35112] RDoc question — Michael Davis <mdavis@...>

I have a question about RDoc. I would like to reference an external

17 messages 2002/03/02

[#35162] string to array and back — Ron Jeffries <ronjeffries@...>

I am needing to convert strings to arrays of bytes and back. I see pack and

19 messages 2002/03/03

[#35364] file reading impossibly slow? — Ron Jeffries <ronjeffries@...>

So I'm doing this benchmark to work with my set program. Part of the problem is

18 messages 2002/03/07

[#35429] Interesting link on static/dynamic typing... — Robert Feldt <feldt@...>

...relevant to Ruby compared to other languages discussion:

25 messages 2002/03/08
[#35441] Re: Interesting link on static/dynamic typing... — Paul Brannan <paul@...> 2002/03/08

On Fri, Mar 08, 2002 at 05:34:43PM +0900, Robert Feldt wrote:

[#35460] Spam, ruby-talk, and me — Dave Thomas <Dave@...>

14 messages 2002/03/08

[#35537] Confusion — David Corbin <dcorbin@...>

The following is from my debugging through xmlc.rb

16 messages 2002/03/10

[#35579] RE: WIN32OLE and LDAP — "Morris, Chris" <chris.morris@...>

> The new version 0.4.2 of Win32OLE has WIN32OLE.bind method.

16 messages 2002/03/11

[#35652] Method type 'abstract' — Peter Hickman <peter@...>

The one thing I miss in Ruby is the abstract class method to go along

15 messages 2002/03/12

[#35653] Some potential RCRs — "Bob Alexander" <bobalex@...>

Here are a few thing I am considering submitting as RCRs. I'm looking =

50 messages 2002/03/12
[#35672] Re: Some potential RCRs — matz@... (Yukihiro Matsumoto) 2002/03/12

Hi,

[#35683] Re: Some potential RCRs — Massimiliano Mirra <list@...> 2002/03/12

On Wed, Mar 13, 2002 at 03:58:01AM +0900, Yukihiro Matsumoto wrote:

[#35697] Re: Some potential RCRs — David Alan Black <dblack@...> 2002/03/13

Hello --

[#35694] rpkg 0.3 — Massimiliano Mirra <list@...>

14 messages 2002/03/13
[#35699] RE: [ANN] rpkg 0.3 — <james@...> 2002/03/13

>

[#35787] testunit - setup -> set_up ? — "Morris, Chris" <chris.morris@...>

I'm just starting to use testunit instead of rubyunit ... I noticed with an

21 messages 2002/03/13
[#35793] RE: testunit - setup -> set_up ? — "Nathaniel Talbott" <nathaniel@...> 2002/03/13

Morris, Chris [mailto:chris.morris@snelling.com] wrote:

[#35796] Re: testunit - setup -> set_up ? — Dave Thomas <Dave@...> 2002/03/13

"Nathaniel Talbott" <nathaniel@talbott.ws> writes:

[#35797] RE: testunit - setup -> set_up ? — "Nathaniel Talbott" <nathaniel@...> 2002/03/13

dave@thomases.com [mailto:dave@thomases.com] wrote:

[#35898] camelCase and underscore_style — "Morris, Chris" <chris.morris@...>

First, a question. If underscore_style is the Ruby norm for methods and the

20 messages 2002/03/15
[#35924] Re: camelCase and underscore_style — "Guy N. Hurst" <gnhurst@...> 2002/03/15

Phil Tomson wrote:

[#35930] RE: camelCase and underscore_style — "Nathaniel Talbott" <nathaniel@...> 2002/03/16

Guy N. Hurst [mailto:gnhurst@hurstlinks.com] wrote:

[#35989] ANN: Locana GUI and GUI Builder version 0.81 — Michael Davis <mdavis@...>

I am pleased to announce release 0.81 of Locana. Locana is a GUI

16 messages 2002/03/16

[#35992] XPath — Michael Schuerig <schuerig@...>

27 messages 2002/03/16

[#36034] Mini Rant: Indenting — Thomas Hurst <tom.hurst@...>

Why is it that I see *so* much code like:

14 messages 2002/03/17

[#36049] web templating for static sites? — Massimiliano Mirra <list@...>

I'm using the Template Toolkit for generating static web sites and I

42 messages 2002/03/17
[#36426] web standars (was: web templating for static sites?) — Tobias Reif <tobiasreif@...> 2002/03/20

Albert Wagner wrote:

[#36052] Xml Serialization for Ruby — "Chris Morris" <chrismo@...>

=Xml Serialization for Ruby

20 messages 2002/03/17
[#36059] Re: [ANN] Xml Serialization for Ruby — Massimiliano Mirra <list@...> 2002/03/17

On Mon, Mar 18, 2002 at 05:20:56AM +0900, Chris Morris wrote:

[#36067] eval/Module question — David Corbin <dcorbin@...>

If I have a String src that is similar to the following:

13 messages 2002/03/18

[#36157] Development of Windows version of Ruby — ptkwt@...1.aracnet.com (Phil Tomson)

Now that we've dumped the cygwin requirement for the Windows version of

63 messages 2002/03/18
[#36330] Re: Development of Windows version of Ruby — Ron Jeffries <ronjeffries@...> 2002/03/19

On Tue, 19 Mar 2002 14:05:27 GMT, "Albert L. Wagner" <alwagner@uark.edu> wrote:

[#36431] Re: Development of Windows version of Ruby — Dennis Newbold <dennisn@...> 2002/03/20

[#36458] Windows version of Ruby (proposals) — ptkwt@... (Phil Tomson) 2002/03/21

Dennis Newbold <dennisn@pe.net> wrote in message news:<Pine.GSO.3.96.1020320113603.22242B-100000@shell2>...

[#36482] RE: Windows version of Ruby (proposals) — "Christian Boos" <cboos@...> 2002/03/21

Some thoughts on the 2 first Windows issues, plus a 4th one...

[#36496] Re: Windows version of Ruby (proposals) — Dave Thomas <Dave@...> 2002/03/21

"Christian Boos" <cboos@bct-technology.com> writes:

[#36510] Re: Windows version of Ruby (proposals) — nobu.nokada@... 2002/03/21

Hi,

[#36514] Re: Windows version of Ruby (proposals) — Dave Thomas <Dave@...> 2002/03/21

nobu.nokada@softhome.net writes:

[#36518] Re: Windows version of Ruby (proposals) — nobu.nokada@... 2002/03/21

Hi,

[#36211] dots in Dir.entries — matz@... (Yukihiro Matsumoto)

Hi,

22 messages 2002/03/19

[#36231] style choice — Ron Jeffries <ronjeffries@...>

A style question for the community ... which of the following do you prefer, and

18 messages 2002/03/19

[#36345] ANN: REXML 2.0 — Sean Russell <ser@...>

I have a feeling there will only be three major revisions of REXML. Version

19 messages 2002/03/20

[#36610] Re: Windows version of Ruby (proposals) — Ron Jeffries <ronjeffries@...>

On Thu, 21 Mar 2002 14:11:55 GMT, Dave Thomas <Dave@PragmaticProgrammer.com> wrote:

16 messages 2002/03/22

[#36645] Ruby for Mac OS 10.1 — Jim Freeze <jim@...>

Hi:

28 messages 2002/03/23

[#36768] Re: Difference between 'do' and 'begin' — Clemens Hintze <c.hintze@...>

In <slrna9ulvi.f2h.mwg@fluffy.isd.dp.ua> Wladimir Mutel <mwg@fluffy.isd.dp.ua> writes:

23 messages 2002/03/26
[#36783] RE: Difference between 'do' and 'begin' — <james@...> 2002/03/26

[#36792] Re: Difference between 'do' and 'begin' — Kent Dahl <kentda@...> 2002/03/26

james@rubyxml.com wrote:

[#36808] Error calling Tk in a loop — <james@...>

I'm trying to write some code that pops up a Tk window when for certain

15 messages 2002/03/26

[#36841] RE: Windows version of Ruby (proposals) — "Andres Hidalgo" <sol123@...>

I believe that Ruby has a place in windows (Office), I happened to have

14 messages 2002/03/27

[#36863] Hash.new(Hash.new) doesn't use Hash.new as default value — "Jonas Delfs" <jonas@...>

Hi -

18 messages 2002/03/27

[#37080] Why isn't Math object-oriented? — Bil Kleb <W.L.Kleb@...>

So I'm reading along in the Pixaxe book (yet again), and I am told

15 messages 2002/03/30

[#37121] String#begins?(s) — timsuth@... (Tim Sutherland)

class String

24 messages 2002/03/31

[CODE] Opinions wanted (long)

From: Massimiliano Mirra <list@...>
Date: 2002-03-08 13:54:58 UTC
List: ruby-talk #35439
These are some embryonic ideas that generated after a discussion with
Wichael Witrant, author of path.rb.

This is about accessing and modifying file system entities (for lack
of a better term), such as files, directories, fifos etc., either
locally or (for example) via ftp or http, in an unified way.

It is also about really treating such entities just like objects in an
load-modify-commit (or rollback) cycle, like for file I/O (you might
call this ``filesystem I/O''), rather than doing a lot of atomic
modify-commit operations (e.g. File.delete('file.txt')) and constantly
keeping track of what is on disk.

It is *not* about accessing the content of the entity, and the stream
discussion we had a while ago, though it might be related.

Do you think there is usefulness to pursue this direction?



require 'ftools'
require 'uri'

# This class represents a file system entity, which can be a (local or
# remote) file, directory, fifo, link...
# Currently only supports local (file://) files and directories.

class FSE
  def initialize(uri)
    @current_uri = URI.parse uri
    @final_uri = @current_uri.dup
    
    exists? ? @ftype = File.ftype(@current_uri.path) : @ftype = 'file'
  end

  # Mark the file for deletion at next _sync_ call.
  
  def delete
    @delete = true
  end

  # Clear the delete mark if it was set.

  def undelete
    @delete = false
  end

  # Returns true if the entity the instance was initialized exists now
  # (either because it existed before or because we called the _sync_
  # method) or not yet.
  #
  #   passwd_file = "/etc/passwd"
  #   p passwd_file.exists?  
  #     true
  #   new_file = "/home/joe/unnamed.txt"
  #   p new_file.exists 
  #     false
  #   new_file.sync
  #   p new_file.exists? 
  #     true

  def exists?
    FileTest.exists? @current_uri.path
  end

  # Set the path the entity will have after the next sync, either as a
  # moved or as a copied entity.
  #
  #   config_file = FSE.new("/etc/config.rc")
  #   config_file.copying = true
  #   config_file.path = "/home/joe/.confrc"
  #   p config_file.path           
  #     "/home/joe/.confrc"
  #   p config_file.current_path   
  #     "/etc/config"
  #   config_file.sync
  #   p config_file.path           
  #     "/home/joe/.confrc"
  #   p config_file.current_path   
  #     "/home/joe/.confrc"

  def path=(apath)
    @final_uri.path = apath
  end

  # Returns the final path of the entity, i.e. the path it will have
  # after the next _sync_.  This may from the path of the entity on
  # the disk (_current_path_), if iet has not been _sync_ed yet.

  def path
    @final_uri.path
  end

  # Current path of the entity.  It can only be read.  To move an
  # entity, use the _path=_ method, then apply changes with _sync_.

  def current_path
    @current_uri.path
  end

  # States whether we are working on a copy of the entity we passed in
  # at initialization time, or changes such as rename or move should
  # be applied to the original entity.

  def copying=(boolean)
    @copying = boolean
  end

  # Define the type of this entity, *if* it was created from scratch
  # and was not _sync_ed yet.  The type of an existing entity (either
  # because it existed before or because we _sync_ed it to disk
  # already) cannot be changed.

  def ftype=(atype)
    raise "Cannot change the type of an existing filesystem entity." if exists?
    raise "Unknown file type." unless ['file', 'directory'].include?(atype)
    @ftype = atype
  end

  # Apply pending changes to the entity.
     
  def sync
    if @delete
      delete_path(@current_uri.path)
      return
    end

    if exists?
      if @current_uri != @final_uri
	@copying ? File.copy(@current_uri.path, @final_uri.path) : File.mv(@current_uri.path, @final_uri.path)
	@current_uri = @final_uri.dup
      end
    else
      case @ftype
      when 'file'
	system('touch', @final_uri.path)
      when 'directory'
	Dir.mkdir(@final_uri.path)
      end
    end
  end

  private

  def delete_path(path)
    if FileTest.directory?(path)
      Dir.rmdir(path)
    else
      File.delete(path)
    end
  end
end



if $0 == __FILE__
  require 'Lapidary/TestCase'
  
  class TestFSE < Lapidary::TestCase
    def initialize(*args)
      super(*args)
      Dir.mkdir 'test' unless FileTest.exists? 'test'
      system('rm -rf test/*')
    end

    def testCopy
      # test whether anything gets copied

      file = FSE.new('/etc/passwd')
      file.copying = true
      file.path = 'test/passwd'
      file.sync

      assert FileTest.exists? 'test/passwd'

      # test if what was copied matches what we started with

      source_content = File.open('/etc/passwd') {|f| f.read}
      dest_content = File.open('test/passwd') {|f| f.read}
      
      assert source_content, dest_content

      # cleanup

      File.delete 'test/passwd'
    end

    def testMove
      # copy something

      file = FSE.new('/etc/passwd')
      file.copying = true
      file.path = 'test/passwd'
      file.sync

      # now move it

      new_file = FSE.new('test/passwd')
      file.copying = false
      file.path = 'test/foo'
      file.sync

      # test whether anything was moved

      assert FileTest.exists? 'test/foo'   

      # cleanup

      File.delete 'test/foo'
    end

    def testCreateFile
      f = FSE.new('test/entity')
      f.ftype = 'file'
      f.sync

      assert FileTest.exists? 'test/entity'
      assert FileTest.file? 'test/entity'

      File.delete 'test/entity'
    end

    def testCreateDir
      f = FSE.new('test/sampledir')
      f.ftype = 'directory'
      f.sync

      assert FileTest.exists? 'test/sampledir'
      assert FileTest.directory? 'test/sampledir'
      
      Dir.rmdir('test/sampledir')      
    end

    def testDelete
      f = FSE.new('test/entity')
      f.ftype = 'file'
      f.sync

      f.delete
      assert FileTest.exists? 'test/entity'
      f.sync
      assert !FileTest.exists?('test/entity')
    end

    def testUndelete
      f = FSE.new('test/entity')
      f.ftype = 'file'
      f.sync

      f.delete
      f.undelete
      f.sync
      assert FileTest.exists? 'test/entity'

      f.delete
      f.sync
    end
  end
  
  require 'Lapidary/UI/Console/TestRunner'
  Lapidary::UI::Console::TestRunner.run(TestFSE)
end

In This Thread

Prev Next