namaste 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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