namaste 0.2.0 → 0.3.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 CHANGED
@@ -15,6 +15,8 @@ doc
15
15
  pkg
16
16
 
17
17
  Gemfile.lock
18
+
19
+ *.gem
18
20
  # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
19
21
  #
20
22
  # * Create a file at ~/.gitignore
@@ -1,112 +1,21 @@
1
1
  require 'i18n'
2
- # The Namaste module conains a Mixin module to include into a class.
3
-
4
- # class MyNamaste
5
- # include Namaste::Mixin
6
- # end
7
- # MyNamaste.new
8
- # MyNamaste.who = "John Doe"
9
- # MyNamaste.what = "John's Manifesto"
10
2
 
11
3
  module Namaste
12
4
  # @return [Hash] of Namaste mappings for integer and type value
13
5
  DUBLIN_KERNEL = { :type => 0, :who => 1, :what => 2, :when => 3, :where => 4 }
14
6
 
15
7
  # @return [Hash] of regular expressions matching the Namaste::DUBLIN_KERNAL Hash
16
- PATTERN = Hash[*Namaste::DUBLIN_KERNEL.map { |k, v| [k, Regexp.new("^#{v}=.*")]}.flatten]
8
+ PATTERN = Hash[*Namaste::DUBLIN_KERNEL.map { |k, v| [k, Regexp.new("^#{v}=")]}.flatten]
17
9
 
18
10
  # @return [Regexp] of standard Namaste file name pattern
19
- PATTERN_CORE = /^\d=.*/
11
+ PATTERN_CORE = /^\d=/
20
12
 
21
13
  # @return [Regexp] of the possible exteneded Namaste file name pattern
22
- PATTERN_EXTENDED = /=.*/
23
-
24
- module Mixin
25
- # When this Mixin module is included this will define getters and setters on your class for each of the keys in Namaste::DUBLIN_KERNAL.
26
- def self.included base
27
- Namaste::DUBLIN_KERNEL.each do |k,v|
28
- base.class_eval do
29
- define_method(k.to_s) do |*args|
30
- namaste(:filter => k)
31
- end
32
-
33
- define_method(k.to_s+'=') do |*args|
34
- set_namaste v, *args
35
- end
36
- end
37
- end
38
- end
39
-
40
- # Return the file contents of a Namaste given a filter and regexp
41
- # @param [Hash] an arguments hash that accepts filter, extended, and regex arguments
42
- # @return [String] the contents of the Namaste
43
- def namaste args = {}
44
- namaste_tags(args).map { |x| get_namaste x }
45
- end
46
-
47
- # @return [Hash] with the Dflat info broken out into its individual components of type, name, major, and minor.
48
- def dirtype
49
- namaste(:filter => :type).map do |nam|
50
- matches = /([^_]+)[|\/](\d+)\.(\d+)/.match(nam[:value])
51
- { :type => nam[:value], :name => matches[1], :major => matches[2], :minor => matches[3] } if matches
52
- end
53
- end
54
-
55
- private
56
-
57
- # Get an array of namaste tags that match the filter and regex provided.
58
- # @param [Hash] an arguments hash that accepts filter, extended, and regex arguments
59
- # @return [Array] an array of Namaste tags
60
- def namaste_tags args = {}
61
- rgx = nil
62
-
63
- if args[:filter]
64
- if Namaste::PATTERN.key? args[:filter].to_sym
65
- rgx = Namaste::PATTERN[args[:filter].to_sym]
66
- else
67
- rgx = Regexp.new("^#{args[:filter]}=.*")
68
- end
69
- else
70
- rgx = Namaste::PATTERN_CORE
71
- rgx = Regexp(rgx, Namaste::PATTERN_EXTENDED) if args[:extended]
72
- end
73
-
74
- rgx = args[:regex] if args[:regex]
75
-
76
- self.select { |x| x =~ rgx }
77
- end
78
-
79
- def set_namaste tag, value
80
- File.open(File.join(self.path, make_namaste(tag, value)), 'w') do |f|
81
- f.write(value)
82
- end
83
- end
84
-
85
- def get_namaste namaste_tag
86
- n = {}
87
- name, tvalue = namaste_tag.split '='
88
- n[:file] = namaste_tag
89
- n[:name] = name
90
- n[:value] = open(File.join(self.path, namaste_tag)).read.strip
91
- n
92
- end
93
-
94
- def make_namaste tag, value
95
- value = I18n.transliterate value
96
- value.gsub!(/[^A-Za-z0-9\-\._]+/, '_')
97
- value.gsub!(/_{2,}/, '_')
98
- value.gsub!(/^_|_$/, '_')
99
- encoded_value = value.downcase
100
-
101
- n = "%s=%s" % [tag, encoded_value]
102
- n = n.slice(0...252) + "..." if n.length > 255
103
- n
104
- end
105
-
106
- end
14
+ PATTERN_EXTENDED = /=/
107
15
 
108
- class Dir < ::Dir
109
- include Namaste::Mixin
110
- end
16
+ autoload :Mixin, 'namaste/mixin'
17
+ autoload :Dir, 'namaste/dir'
18
+ autoload :Set, 'namaste/set'
19
+ autoload :Tag, 'namaste/tag'
111
20
 
112
21
  end
@@ -0,0 +1,8 @@
1
+ module Namaste
2
+ class Dir < ::Dir
3
+ autoload :Extend, 'namaste/dir/extend'
4
+
5
+ include Namaste::Mixin
6
+
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ require 'namaste'
2
+
3
+ class Dir
4
+ include Namaste::Mixin
5
+ end
@@ -0,0 +1,31 @@
1
+ module Namaste
2
+ module Mixin
3
+ # define shortcut methods for dublin kernel values
4
+ def self.included(base)
5
+ Namaste::DUBLIN_KERNEL.each do |k,v|
6
+ base.class_eval do
7
+ define_method(k.to_s) do |*args|
8
+ namaste[k]
9
+ end
10
+
11
+ define_method(k.to_s+'=') do |v|
12
+ namaste[k] = v
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ # Get the set of namaste tags for this directory
19
+ # @return [Namaste::Set]
20
+ def namaste
21
+ @namaste ||= Namaste::Set.new(self)
22
+ end
23
+
24
+ # If a Namaste 'type' tag is defined, provide structured data
25
+ # @return [Struct::Dirtype]
26
+ def dirtype
27
+ type = namaste[:type]
28
+ type.first.dirtype unless type.empty?
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,38 @@
1
+ module Namaste
2
+ class Set
3
+ # @param [Dir] dir
4
+ def initialize(dir)
5
+ @dir = dir
6
+ end
7
+
8
+ # Get all the namaste tags for the directory
9
+ # @return [Array<Namaste::Tag>]
10
+ def all
11
+ select
12
+ end
13
+
14
+ # Get only select namaste tags for the directory
15
+ # @return [Array<Namaste::Tag>]
16
+ def [] key = nil
17
+ select(key)
18
+ end
19
+
20
+ # Set a namaste tag
21
+ # @param [String] key
22
+ # @param [String] value
23
+ def []= key, value
24
+ Namaste::Tag.new(@dir.path, key, value)
25
+ end
26
+
27
+
28
+ private
29
+ def select key = nil
30
+ rgx = Namaste::PATTERN[key] if key.is_a? Symbol and Namaste::PATTERN.key?(key)
31
+ rgx ||= Regexp.new("^#{Regexp.escape(key)}=") if key.is_a? String
32
+ rgx ||= Regexp.new("^#{key}=") if key.is_a? Integer
33
+ rgx ||= Namaste::PATTERN_EXTENDED if key == :extended
34
+ rgx ||= Namaste::PATTERN_CORE if key == nil
35
+ @dir.select { |x| x =~ rgx }.map { |x| Tag.new(File.join(@dir.path, x)) }
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,123 @@
1
+ module Namaste
2
+ class Tag
3
+ # Create a filename for a namaste key/value pair
4
+ # @return [String]
5
+ def self.filename tag, value
6
+ n = "%s=%s" % [tag, self.elide(value)]
7
+ n = n.slice(0...252) + "..." if n.length > 255
8
+ n
9
+ end
10
+
11
+ # @param [Directory, File] directory_or_file
12
+ # @param [String] tag
13
+ # @param [String] value
14
+ def initialize(directory_or_file, tag = nil, value = nil)
15
+ directory_or_file = File.expand_path(directory_or_file)
16
+
17
+ tag = Namaste::DUBLIN_KERNEL[tag] if tag.is_a? Symbol
18
+
19
+ if File.directory?(directory_or_file)
20
+ @dir = directory_or_file
21
+ @tag = tag.to_s
22
+ @value = value.to_s
23
+ write!
24
+ elsif File.file?(directory_or_file)
25
+ @file = File.new(directory_or_file, "a+")
26
+ @dir = File.dirname(@file.path)
27
+ else
28
+ raise "Unknown directory or file (#{directory_or_file.to_s})"
29
+ end
30
+
31
+ load_tag_extensions
32
+ end
33
+
34
+ # @return [String] namaste value
35
+ def value
36
+ file.rewind
37
+ @value ||= file.read
38
+ end
39
+
40
+ # @param [String] value
41
+ def value=(value)
42
+ delete
43
+ @value = value.to_s
44
+ write!
45
+ end
46
+
47
+ # @return [String] namaste tag
48
+ def tag
49
+ @tag ||= File.basename(file.path).split("=").first
50
+ end
51
+
52
+ # @param [String] namaste tag
53
+ def tag=(tag)
54
+ delete
55
+ @tag = tag.to_s
56
+ write!
57
+ end
58
+
59
+ # Delete this tag
60
+ def delete
61
+ @value = value # make sure to preserve the value after the tag is deleted
62
+ File.delete(file.path)
63
+ @file = nil
64
+ end
65
+
66
+ private
67
+ def file
68
+ @file ||= File.new(File.join(@dir, filename), "a+")
69
+ end
70
+
71
+ def filename
72
+ self.class.filename(@tag, @value)
73
+ end
74
+
75
+ # write the namaste tag to the filesystem
76
+ def write!
77
+ file.rewind
78
+ file.write(value)
79
+ file.flush
80
+ file.truncate(file.pos)
81
+ file.rewind
82
+ end
83
+
84
+ # transliterate and truncate the namaste value
85
+ def elide
86
+ self.class.elide(@value)
87
+ end
88
+
89
+ protected
90
+ # transliterate and truncate the value
91
+ # @param [String] value
92
+ # @return [String] ASCII string
93
+ def self.elide value
94
+ value = I18n.transliterate value
95
+ value.gsub!(/[^A-Za-z0-9\-\._]+/, '_')
96
+ value.gsub!(/_{2,}/, '_')
97
+ value.gsub!(/^_|_$/, '_')
98
+ encoded_value = value.downcase
99
+ end
100
+
101
+ private
102
+ def load_tag_extensions
103
+ case tag
104
+ when "0"
105
+ self.extend(Dirtype)
106
+
107
+ end
108
+ end
109
+
110
+ module Dirtype
111
+ # @return [Struct::Dirtype] Parses the namaste 'type' tag to provide structured data (#full, #name, #major, #minor)
112
+ def dirtype
113
+ v = value
114
+ matches = /([^_\/]+)[_\/](\d+)\.(\d+)/.match(v)
115
+
116
+ if matches
117
+ Struct.new("Dirtype", :full, :name, :major, :minor)
118
+ Struct::Dirtype.new(*matches)
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -1,3 +1,3 @@
1
1
  module Namaste
2
- VERSION = "0.2.0"
3
- end
2
+ VERSION = "0.3.0"
3
+ end
@@ -0,0 +1,97 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Namaste do
4
+ describe "namaste dublin kernel shortcuts" do
5
+ it "should define the appropriate setters and getters" do
6
+ Dir.mktmpdir do |d|
7
+ dir = Namaste::Dir.new(d)
8
+ dir.respond_to?(:type).should be_true
9
+ dir.respond_to?(:type=).should be_true
10
+ dir.respond_to?(:who).should be_true
11
+ dir.respond_to?(:who=).should be_true
12
+ dir.respond_to?(:what).should be_true
13
+ dir.respond_to?(:what=).should be_true
14
+ dir.respond_to?(:when).should be_true
15
+ dir.respond_to?(:when=).should be_true
16
+ dir.respond_to?(:where).should be_true
17
+ dir.respond_to?(:where=).should be_true
18
+ end
19
+ end
20
+ end
21
+
22
+ describe "namaste_tags" do
23
+ before(:each) do
24
+ @tmpdir = Dir.mktmpdir
25
+ @dir = Namaste::Dir.new(@tmpdir)
26
+ end
27
+
28
+ after(:each) do
29
+ FileUtils.rm_rf(@tmpdir)
30
+ end
31
+
32
+ it "should handle dublin kernel filters correctly" do
33
+ File.open(File.join(@dir.path, "1=last,first"), "w") do |f|
34
+ f.write("Last, First")
35
+ end
36
+
37
+ @dir.namaste[:who].should have(1).entries
38
+ tag = @dir.namaste[:who].first
39
+ tag.tag.should == "1"
40
+ tag.value.should == "Last, First"
41
+ end
42
+
43
+ it "should handle numeric filters correctly" do
44
+ File.open(File.join(@dir.path, "1=last,first"), "w") do |f|
45
+ f.write("Last, First")
46
+ end
47
+
48
+ @dir.namaste[1].should have(1).entries
49
+ tag = @dir.namaste[1].first
50
+ tag.tag.should == "1"
51
+ tag.value.should == "Last, First"
52
+ end
53
+
54
+ it "should add new tags" do
55
+ @dir.namaste[1] = "Mahler, Gustav"
56
+
57
+ @dir.namaste[1].should have(1).entries
58
+ tag = @dir.namaste[1].first
59
+ tag.tag.should == "1"
60
+ tag.value.should == "Mahler, Gustav"
61
+ end
62
+
63
+ it "should append tags" do
64
+ @dir.namaste[1] = "Mahler, Gustav"
65
+ @dir.namaste[1] = "Helsinki Radio Symphony Orchestra"
66
+
67
+ @dir.namaste[1].should have(2).entries
68
+ end
69
+
70
+ it "should delete tags" do
71
+ @dir.namaste[1] = "Schmidt, Andreas"
72
+ @dir.namaste[1].should have(1).entries
73
+ @dir.namaste[1].first.delete
74
+ @dir.namaste[1].should be_empty
75
+ end
76
+
77
+ end
78
+ describe "dirtype" do
79
+ it "should understand the dirtype property" do
80
+ Dir.mktmpdir do |tmpdir|
81
+
82
+ File.open(File.join(tmpdir,"0=dflat_0.19"),"w") do |f|
83
+ f.write("Dflat/0.19")
84
+ end
85
+
86
+ @dir = Namaste::Dir.new(tmpdir)
87
+ dt = @dir.dirtype
88
+
89
+ dt.full.should == "Dflat/0.19"
90
+ dt.name.should == "Dflat"
91
+ dt.major.should == "0"
92
+ dt.minor.should == "19"
93
+ end
94
+ end
95
+
96
+ end
97
+ end
@@ -0,0 +1,84 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "Namaste::Tag" do
4
+ describe "filename" do
5
+ it "should handle a simple value" do
6
+ Namaste::Tag.filename(0, 'abcdef').should == "0=abcdef"
7
+ end
8
+ it "should properly handle dflat" do
9
+ Namaste::Tag.filename(0, 'Dflat/0.19').should == "0=dflat_0.19"
10
+ end
11
+ it "should handle compled values correctly" do
12
+ Namaste::Tag.filename(0, 'rQ@f2!éüAsd!').should == "0=rq_f2_euasd_"
13
+ end
14
+ it "should handle extended integers correctly" do
15
+ Namaste::Tag.filename('x_123', 'extended').should == "x_123=extended"
16
+ end
17
+ it "should truncate file name at 255 characters" do
18
+ namaste = Namaste::Tag.filename(0, 'lfvtshfasfogfzjgqokuwicivlnyluqlgfcsfmhtdbmrizvzqkiyaxqtlclkgxpgkmxtwwylepsorbdnddgrdgzpcyojqbwuxkqkfzmfbkxrfpaaymgygbpjgqxyklkfblqekgtrpdxvjsmodvkrlwcfrqswdknngervsjivehotqeiowigfpwymunrccgjhakdwpugwwtpqcpkwqvwlhcqccwqovlwaldwfuoalscdvzccgnpooedbrnttzmno')
19
+ namaste.length.should == 255
20
+ namaste.should == '0=lfvtshfasfogfzjgqokuwicivlnyluqlgfcsfmhtdbmrizvzqkiyaxqtlclkgxpgkmxtwwylepsorbdnddgrdgzpcyojqbwuxkqkfzmfbkxrfpaaymgygbpjgqxyklkfblqekgtrpdxvjsmodvkrlwcfrqswdknngervsjivehotqeiowigfpwymunrccgjhakdwpugwwtpqcpkwqvwlhcqccwqovlwaldwfuoalscdvzccgnpooedbrnt...'
21
+ end
22
+ end
23
+
24
+ describe "new tag file" do
25
+ it "should create a new file" do
26
+ Dir.mktmpdir do |dir|
27
+ file = File.join(dir, "1=value")
28
+ tag = Namaste::Tag.new(dir, 1, 'value')
29
+ tag.send(:filename).should == "1=value"
30
+ tag.send(:file).path.should == file
31
+ File.should exist(file)
32
+ File.new(file).read.should == "value"
33
+ end
34
+ end
35
+ end
36
+
37
+ describe "opening an existing tag file" do
38
+ it "should load tag and value" do
39
+ Dir.mktmpdir do |dir|
40
+ file = File.join(dir, "2=asdfg")
41
+ File.open(file, "w+") { |f| f.write("asdfg"); f.flush }
42
+
43
+ tag = Namaste::Tag.new(file)
44
+ tag.send(:file).path.should == file
45
+ tag.tag.should == "2"
46
+ tag.value.should == "asdfg"
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ describe "writing a new value" do
53
+ it "should delete and re-add a tag when the tag is changed" do
54
+ Dir.mktmpdir do |dir|
55
+ file = File.join(dir, "2=asdfg")
56
+ File.open(file, "w+") { |f| f.write("asdfg"); f.flush }
57
+
58
+ tag = Namaste::Tag.new(file)
59
+ tag.tag = 1
60
+
61
+ File.should_not exist(file)
62
+ File.should exist(File.join(dir, "1=asdfg"))
63
+ end
64
+
65
+ end
66
+ it "should delete and re-add a tag when the value is changed" do
67
+ Dir.mktmpdir do |dir|
68
+ file = File.join(dir, "2=asdfg")
69
+ File.open(file, "w+") { |f| f.write("asdfg"); f.flush }
70
+
71
+ tag = Namaste::Tag.new(file)
72
+ tag.value = 'qwerty'
73
+
74
+ File.should_not exist(file)
75
+ File.should exist(File.join(dir, "2=qwerty"))
76
+ end
77
+ end
78
+ end
79
+
80
+ describe "deleting a tag" do
81
+
82
+ end
83
+
84
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: namaste
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 2
8
+ - 3
9
9
  - 0
10
- version: 0.2.0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Chris Beer
@@ -15,13 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-06-09 00:00:00 -05:00
18
+ date: 2011-06-29 00:00:00 -04:00
19
19
  default_executable: namaste
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: i18n
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
22
+ version_requirements: &id001 !ruby/object:Gem::Requirement
25
23
  none: false
26
24
  requirements:
27
25
  - - ">="
@@ -30,12 +28,12 @@ dependencies:
30
28
  segments:
31
29
  - 0
32
30
  version: "0"
31
+ prerelease: false
33
32
  type: :runtime
34
- version_requirements: *id001
33
+ requirement: *id001
34
+ name: i18n
35
35
  - !ruby/object:Gem::Dependency
36
- name: rake
37
- prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
36
+ version_requirements: &id002 !ruby/object:Gem::Requirement
39
37
  none: false
40
38
  requirements:
41
39
  - - ">="
@@ -44,12 +42,12 @@ dependencies:
44
42
  segments:
45
43
  - 0
46
44
  version: "0"
45
+ prerelease: false
47
46
  type: :development
48
- version_requirements: *id002
47
+ requirement: *id002
48
+ name: rake
49
49
  - !ruby/object:Gem::Dependency
50
- name: rcov
51
- prerelease: false
52
- requirement: &id003 !ruby/object:Gem::Requirement
50
+ version_requirements: &id003 !ruby/object:Gem::Requirement
53
51
  none: false
54
52
  requirements:
55
53
  - - ">="
@@ -58,12 +56,12 @@ dependencies:
58
56
  segments:
59
57
  - 0
60
58
  version: "0"
59
+ prerelease: false
61
60
  type: :development
62
- version_requirements: *id003
61
+ requirement: *id003
62
+ name: rcov
63
63
  - !ruby/object:Gem::Dependency
64
- name: bundler
65
- prerelease: false
66
- requirement: &id004 !ruby/object:Gem::Requirement
64
+ version_requirements: &id004 !ruby/object:Gem::Requirement
67
65
  none: false
68
66
  requirements:
69
67
  - - ~>
@@ -74,12 +72,12 @@ dependencies:
74
72
  - 0
75
73
  - 0
76
74
  version: 1.0.0
75
+ prerelease: false
77
76
  type: :development
78
- version_requirements: *id004
77
+ requirement: *id004
78
+ name: bundler
79
79
  - !ruby/object:Gem::Dependency
80
- name: rspec
81
- prerelease: false
82
- requirement: &id005 !ruby/object:Gem::Requirement
80
+ version_requirements: &id005 !ruby/object:Gem::Requirement
83
81
  none: false
84
82
  requirements:
85
83
  - - ">"
@@ -90,12 +88,12 @@ dependencies:
90
88
  - 0
91
89
  - 0
92
90
  version: 2.0.0
91
+ prerelease: false
93
92
  type: :development
94
- version_requirements: *id005
93
+ requirement: *id005
94
+ name: rspec
95
95
  - !ruby/object:Gem::Dependency
96
- name: yard
97
- prerelease: false
98
- requirement: &id006 !ruby/object:Gem::Requirement
96
+ version_requirements: &id006 !ruby/object:Gem::Requirement
99
97
  none: false
100
98
  requirements:
101
99
  - - ">="
@@ -104,12 +102,12 @@ dependencies:
104
102
  segments:
105
103
  - 0
106
104
  version: "0"
105
+ prerelease: false
107
106
  type: :development
108
- version_requirements: *id006
107
+ requirement: *id006
108
+ name: yard
109
109
  - !ruby/object:Gem::Dependency
110
- name: RedCloth
111
- prerelease: false
112
- requirement: &id007 !ruby/object:Gem::Requirement
110
+ version_requirements: &id007 !ruby/object:Gem::Requirement
113
111
  none: false
114
112
  requirements:
115
113
  - - ">="
@@ -118,8 +116,10 @@ dependencies:
118
116
  segments:
119
117
  - 0
120
118
  version: "0"
119
+ prerelease: false
121
120
  type: :development
122
- version_requirements: *id007
121
+ requirement: *id007
122
+ name: RedCloth
123
123
  description: A ruby client implementation of the Namaste specification for directory description with filename-based tags. [https://wiki.ucop.edu/display/Curation/Namaste]
124
124
  email: chris@cbeer.info
125
125
  executables:
@@ -137,9 +137,15 @@ files:
137
137
  - Rakefile
138
138
  - bin/namaste
139
139
  - lib/namaste.rb
140
+ - lib/namaste/dir.rb
141
+ - lib/namaste/dir/extend.rb
142
+ - lib/namaste/mixin.rb
143
+ - lib/namaste/set.rb
144
+ - lib/namaste/tag.rb
140
145
  - lib/namaste/version.rb
141
146
  - namaste.gemspec
142
- - spec/lib/namaste_spec.rb
147
+ - spec/lib/namaste_dir_spec.rb
148
+ - spec/lib/namaste_tag_spec.rb
143
149
  - spec/spec_helper.rb
144
150
  has_rdoc: true
145
151
  homepage: http://github.com/microservices/namaste
@@ -171,10 +177,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
171
177
  requirements: []
172
178
 
173
179
  rubyforge_project:
174
- rubygems_version: 1.6.2
180
+ rubygems_version: 1.5.3
175
181
  signing_key:
176
182
  specification_version: 3
177
183
  summary: A ruby client implementation of the Namaste specification for directory description with filename-based tags.
178
184
  test_files:
179
- - spec/lib/namaste_spec.rb
185
+ - spec/lib/namaste_dir_spec.rb
186
+ - spec/lib/namaste_tag_spec.rb
180
187
  - spec/spec_helper.rb
@@ -1,125 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
-
3
- class TestNamasteSurrogate
4
- include Namaste::Mixin
5
-
6
- def test_make_namaste tag, value
7
- make_namaste tag, value
8
- end
9
-
10
- end
11
- describe Namaste do
12
- before(:all) do
13
- @namaste = TestNamasteSurrogate.new
14
- end
15
- describe "make_namaste" do
16
- it "should handle a simple value" do
17
- @namaste.test_make_namaste(0, 'abcdef').should == "0=abcdef"
18
- end
19
- it "should properly handle dflat" do
20
- @namaste.test_make_namaste(0, 'Dflat/0.19').should == "0=dflat_0.19"
21
- end
22
- it "should handle compled values correctly" do
23
- @namaste.test_make_namaste(0, 'rQ@f2!éüAsd!').should == "0=rq_f2_euasd_"
24
- end
25
- it "should handle extended integers correctly" do
26
- @namaste.test_make_namaste('x_123', 'extended').should == "x_123=extended"
27
- end
28
- it "should truncate file name at 255 characters" do
29
- namaste = @namaste.test_make_namaste(0, 'lfvtshfasfogfzjgqokuwicivlnyluqlgfcsfmhtdbmrizvzqkiyaxqtlclkgxpgkmxtwwylepsorbdnddgrdgzpcyojqbwuxkqkfzmfbkxrfpaaymgygbpjgqxyklkfblqekgtrpdxvjsmodvkrlwcfrqswdknngervsjivehotqeiowigfpwymunrccgjhakdwpugwwtpqcpkwqvwlhcqccwqovlwaldwfuoalscdvzccgnpooedbrnttzmno')
30
- namaste.length.should == 255
31
- namaste.should == '0=lfvtshfasfogfzjgqokuwicivlnyluqlgfcsfmhtdbmrizvzqkiyaxqtlclkgxpgkmxtwwylepsorbdnddgrdgzpcyojqbwuxkqkfzmfbkxrfpaaymgygbpjgqxyklkfblqekgtrpdxvjsmodvkrlwcfrqswdknngervsjivehotqeiowigfpwymunrccgjhakdwpugwwtpqcpkwqvwlhcqccwqovlwaldwfuoalscdvzccgnpooedbrnt...'
32
- end
33
- end
34
-
35
- describe "object instantiation" do
36
- it "should define the appropriate setters and getters" do
37
- d = Dir.mktmpdir
38
- dir = Namaste::Dir.new(d)
39
- dir.respond_to?(:type).should be_true
40
- dir.respond_to?(:type=).should be_true
41
- dir.respond_to?(:who).should be_true
42
- dir.respond_to?(:who=).should be_true
43
- dir.respond_to?(:what).should be_true
44
- dir.respond_to?(:what=).should be_true
45
- dir.respond_to?(:when).should be_true
46
- dir.respond_to?(:when=).should be_true
47
- dir.respond_to?(:where).should be_true
48
- dir.respond_to?(:where=).should be_true
49
- end
50
- end
51
- describe "namaste_tags" do
52
- it "should handle normal filters correclty" do
53
- Dir.mktmpdir do |d|
54
- dir = Namaste::Dir.new(d)
55
- File.open(File.join(dir.path,"1=last,first"),"w") do |f|
56
- f.write("Last,First")
57
- end
58
- dir.send(:namaste_tags,{:filter=>"1"}).include?("1=last,first").should be_true
59
- end
60
- end
61
- it "should take regular expressions correctly" do
62
- Dir.mktmpdir do |d|
63
- dir = Namaste::Dir.new(d)
64
- File.open(File.join(dir.path,"1=last,first"),"w") do |f|
65
- f.write("Last,First")
66
- end
67
- dir.send(:namaste_tags,{:regex=>/last,first/}).include?("1=last,first").should be_true
68
- end
69
- end
70
- it "should take a number as a regexp and handle it correclty" do
71
- Dir.mktmpdir do |d|
72
- dir = Namaste::Dir.new(d)
73
- File.open(File.join(dir.path,"1=last,first"),"w") do |f|
74
- f.write("Last,First")
75
- end
76
- dir.send(:namaste_tags,{:filter=>:who}).include?("1=last,first").should be_true
77
- end
78
- end
79
- end
80
-
81
- describe "get_namaste" do
82
- it "should reterive the appriprate tag" do
83
- Dir.mktmpdir do |d|
84
- dir = Namaste::Dir.new(d)
85
- File.open(File.join(dir.path,"1=last,first"),"w") do |f|
86
- f.write("Last,First")
87
- end
88
- data = dir.send(:get_namaste,"1=last,first")
89
- data.has_key?(:value).should be_true and
90
- data[:value].should == "Last,First"
91
-
92
- data.has_key?(:file).should be_true and
93
- data[:file].should == "1=last,first"
94
-
95
- data.has_key?(:name).should be_true and
96
- data[:name].should == "1"
97
- end
98
- end
99
- end
100
-
101
- describe "dirtype" do
102
- it "should parse out the Dflat type properly" do
103
- Dir.mktmpdir do |d|
104
- dir = Namaste::Dir.new(d)
105
- File.open(File.join(dir.path,"0=dflat_0.19"),"w") do |f|
106
- f.write("Dflat/0.19")
107
- end
108
- dir.dirtype.length == 1
109
-
110
- dir.dirtype.first.has_key?(:name).should be_true and
111
- dir.dirtype.first[:name].should == "Dflat"
112
-
113
- dir.dirtype.first.has_key?(:minor).should be_true and
114
- dir.dirtype.first[:minor].should == "19"
115
-
116
- dir.dirtype.first.has_key?(:type).should be_true and
117
- dir.dirtype.first[:type].should == "Dflat/0.19"
118
-
119
- dir.dirtype.first.has_key?(:major).should be_true and
120
- dir.dirtype.first[:major].should == "0"
121
- end
122
- end
123
- end
124
-
125
- end