vitreous_share 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/.gitignore +5 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +3 -0
  4. data/README.md +7 -0
  5. data/Rakefile +13 -0
  6. data/lib/vitreous/share/common_structure.rb +9 -0
  7. data/lib/vitreous/share/dropbox_structure.rb +38 -0
  8. data/lib/vitreous/share/element.rb +38 -0
  9. data/lib/vitreous/share/index_searcher.rb +16 -0
  10. data/lib/vitreous/share/indexer.rb +24 -0
  11. data/lib/vitreous/share/indexer_utils.rb +69 -0
  12. data/lib/vitreous/share/local_structure.rb +35 -0
  13. data/lib/vitreous/share/version.rb +5 -0
  14. data/lib/vitreous/vitreous.rb +3 -0
  15. data/lib/vitreous_share.rb +13 -0
  16. data/test/dropbox_structure_real_test.rb +26 -0
  17. data/test/dropbox_structure_test.rb +37 -0
  18. data/test/element_test.rb +18 -0
  19. data/test/fixtures/folder_structure/file 1.jpg +0 -0
  20. data/test/fixtures/folder_structure/file 1.thumb.txt +1 -0
  21. data/test/fixtures/folder_structure/file 1.txt +1 -0
  22. data/test/fixtures/folder_structure/subfolder 1/file 1.jpg +0 -0
  23. data/test/fixtures/folder_structure/subfolder 1/file 1.txt +1 -0
  24. data/test/fixtures/folder_structure/subfolder 1/file 2.jpg +0 -0
  25. data/test/fixtures/folder_structure/subfolder 1/file 2.txt +1 -0
  26. data/test/fixtures/folder_structure/subfolder 1/subsubfolder 1/file 1.txt +1 -0
  27. data/test/fixtures/folder_structure/subfolder 1.jpg +0 -0
  28. data/test/fixtures/folder_structure/subfolder 1.txt +1 -0
  29. data/test/fixtures/folder_structure/subfolder 2/file 1.txt +1 -0
  30. data/test/fixtures/index.json +110 -0
  31. data/test/fixtures/structure.json +146 -0
  32. data/test/index_searcher_test.rb +28 -0
  33. data/test/indexer_test.rb +30 -0
  34. data/test/indexer_utils_test.rb +85 -0
  35. data/test/local_structure_test.rb +23 -0
  36. data/test/test_helper.rb +7 -0
  37. data/vitreous_share.gemspec +29 -0
  38. metadata +225 -0
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ /tmp
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.8.7@vitreous_share
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # VitreousShare
2
+
3
+ Shared components between VitreousCloud and VitreousStandalone.
4
+
5
+ ## Status
6
+
7
+ Uncomplete version, under development.
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'bundler'
4
+
5
+ Bundler::GemHelper.install_tasks
6
+
7
+ task :default => :test
8
+
9
+ Rake::TestTask.new do |t|
10
+ t.libs << '.'
11
+ t.test_files = FileList['test/*_test.rb']
12
+ t.verbose = true
13
+ end
@@ -0,0 +1,9 @@
1
+ module Vitreous
2
+ module Share
3
+ class CommonStructure
4
+ def self.txt?( path )
5
+ File.extname( path ).gsub( '.', '' ) =~ Vitreous::TXT_EXTENSIONS
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,38 @@
1
+ module Vitreous
2
+ module Share
3
+ class DropboxStructure < CommonStructure
4
+ def initialize( path, session )
5
+ @path = path
6
+ @session = session
7
+ end
8
+
9
+ def generate( path = @path )
10
+ {
11
+ 'name' => File.basename( path ),
12
+ 'path' => '/',
13
+ 'uri' => uri( path ),
14
+ 'type' => 'directory',
15
+ 'elements' => tree( path ),
16
+ 'content' => nil
17
+ }
18
+ end
19
+
20
+ def tree( path )
21
+ @session.entry( path ).list.to_a.map do |e|
22
+ {
23
+ 'name' => File.basename( e.path ),
24
+ 'path' => e.path.gsub( @path, '' ),
25
+ 'uri' => uri( e.path ),
26
+ 'type' => e.directory? ? 'directory' : 'file',
27
+ 'elements' => e.directory? ? tree( e.path ) : [],
28
+ 'content' => CommonStructure.txt?( e.path ) ? @session.download( e.path ) : nil
29
+ }
30
+ end
31
+ end
32
+
33
+ def uri( path )
34
+ "http://dl.dropbox.com/u/#{@session.account.uid}/#{path.gsub( /^\/Public\//, '' ).gsub( /^\//, '' )}"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,38 @@
1
+ module Vitreous
2
+ module Share
3
+ class Element < Mustache
4
+ def initialize( hash )
5
+ @hash = hash
6
+ meta_methods
7
+ end
8
+
9
+ def meta_methods
10
+ @hash.each do |k,v|
11
+ (class << self; self; end).class_eval do
12
+ define_method( k.to_sym ) { v } if !method_defined?( k.to_sym )
13
+ end
14
+ end
15
+ end
16
+
17
+ def collection?
18
+ @hash['type'] == 'collection'
19
+ end
20
+
21
+ def item?
22
+ @hash['type'] == 'item'
23
+ end
24
+
25
+ def elements
26
+ @hash['elements'].map { |e| Element.new( e ) }
27
+ end
28
+
29
+ def collections
30
+ @hash['elements'].select { |e| e['type'] == 'collection' }.map { |e| Element.new( e ) }
31
+ end
32
+
33
+ def items
34
+ @hash['elements'].select { |e| e['type'] == 'item' }.map { |e| Element.new( e ) }
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,16 @@
1
+ module Vitreous
2
+ module Share
3
+ class IndexSearcher
4
+ def self.search( node, link )
5
+ return node if node['link'] == link
6
+
7
+ node['elements'].each do |e|
8
+ found = Vitreous::Share::IndexSearcher.search( e, link )
9
+ return found if found
10
+ end
11
+
12
+ return nil
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ module Vitreous
2
+ module Share
3
+ class Indexer
4
+ def initialize( structure )
5
+ @structure = structure
6
+ end
7
+
8
+ def generate( structure = [@structure] )
9
+ Vitreous::Share::IndexerUtils.grouping( structure ).values.map do |e|
10
+ {
11
+ 'title' => Vitreous::Share::IndexerUtils.file_name_to_title( e[0]['name'] ),
12
+ 'link' => Vitreous::Share::IndexerUtils.to_link( e[0]['path'] ),
13
+ 'type' => e.any? { |e2| e2['type'] == 'directory' } ? 'collection' : 'item',
14
+ 'elements' => generate( e[0]['elements'] )
15
+ }.merge( Vitreous::Share::IndexerUtils.meta( e ) )
16
+ end
17
+ end
18
+
19
+ def json
20
+ JSON.pretty_generate( generate[0] )
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,69 @@
1
+ module Vitreous
2
+ module Share
3
+ module IndexerUtils
4
+ def self.file_name_to_title( file_name )
5
+ remove_extensions( file_name ).gsub( /^\d*(_|\s)/, '' )
6
+ end
7
+
8
+ def self.remove_extensions( file_name )
9
+ File.basename( file_name ).gsub( /\..*$/, '' )
10
+ end
11
+
12
+ def self.to_link( path )
13
+ return path if path == '/'
14
+
15
+ path.split('/').map do |e|
16
+ to_slug( remove_extensions( e ) )
17
+ end.join('/')
18
+ end
19
+
20
+ def self.to_slug( string )
21
+ string.
22
+ downcase.
23
+ gsub(/[^a-z0-9 -_]/,"").
24
+ gsub('_', '-').
25
+ gsub(/[ ]+/,"-")
26
+ end
27
+
28
+ def self.grouping( elements )
29
+ elements.group_by do |e|
30
+ to_slug( remove_extensions( e['name'] ) )
31
+ end
32
+ end
33
+
34
+ def self.meta( elements )
35
+ result = {}
36
+
37
+ elements.select { |e| e['type'] == 'file' }.each do |e|
38
+ ext_name = File.basename( e['path'] ).split( '.' )[-1]
39
+ meta_ext_name = File.basename( e['path'] ).split( '.' )[1..-1].reverse.join( '_' )
40
+
41
+ if( ext_name =~ Vitreous::TXT_EXTENSIONS )
42
+ result[meta_ext_name] = e['content']
43
+ else
44
+ result[meta_ext_name] = e['uri']
45
+ end
46
+ end
47
+
48
+ # create arrays of metas
49
+ result.merge!( meta_arrays( result ) )
50
+ end
51
+
52
+ def self.meta_arrays( meta )
53
+ result = {}
54
+
55
+ meta.each do |k,v|
56
+ key = "#{k.split('_')[0]}s"
57
+ result[key] = [] unless result[key]
58
+ result[key] << v
59
+ end
60
+
61
+ result.each do |k,v|
62
+ result[k].sort!
63
+ end
64
+
65
+ return result
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,35 @@
1
+ module Vitreous
2
+ module Share
3
+ class LocalStructure < CommonStructure
4
+
5
+ def initialize( path )
6
+ @path = path
7
+ end
8
+
9
+ def generate( path = @path )
10
+ {
11
+ 'name' => File.basename( path ),
12
+ 'path' => path == @path ? '/' : path.gsub( @path, '' ),
13
+ 'uri' => uri( path ),
14
+ 'type' => File.directory?( path ) ? 'directory' : 'file',
15
+ 'elements' => File.directory?( path ) ? tree( path ) : [],
16
+ 'content' => CommonStructure.txt?( path ) ? File.read( path ) : nil
17
+ }
18
+ end
19
+
20
+ def tree( path )
21
+ Dir.glob( File.join( path, '*' ) ).sort.map do |e|
22
+ generate( e )
23
+ end
24
+ end
25
+
26
+ def uri( path )
27
+ "#{Vitreous::Share::LocalStructure.base_uri}#{path.gsub( @path, '' )}"
28
+ end
29
+
30
+ def self.base_uri
31
+ ""
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ module Vitreous
2
+ module Share
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module Vitreous
2
+ TXT_EXTENSIONS = /^(txt|md|html|meta)$/
3
+ end
@@ -0,0 +1,13 @@
1
+ require 'json'
2
+ require 'dropbox'
3
+ require 'mustache'
4
+
5
+ require "#{File.dirname(__FILE__)}/vitreous/vitreous"
6
+ require "#{File.dirname(__FILE__)}/vitreous/share/indexer_utils"
7
+ require "#{File.dirname(__FILE__)}/vitreous/share/version"
8
+ require "#{File.dirname(__FILE__)}/vitreous/share/common_structure"
9
+ require "#{File.dirname(__FILE__)}/vitreous/share/local_structure"
10
+ require "#{File.dirname(__FILE__)}/vitreous/share/dropbox_structure"
11
+ require "#{File.dirname(__FILE__)}/vitreous/share/indexer"
12
+ require "#{File.dirname(__FILE__)}/vitreous/share/index_searcher"
13
+ require "#{File.dirname(__FILE__)}/vitreous/share/element"
@@ -0,0 +1,26 @@
1
+ # require File.expand_path( "#{File.dirname(__FILE__)}/test_helper" )
2
+ #
3
+ # class DropboxStructureTest < Test::Unit::TestCase
4
+ # def setup
5
+ # @session =
6
+ # ::Dropbox::Session.deserialize(
7
+ # File.read( "#{File.dirname(__FILE__)}/../tmp/session_authorized.serialized" )
8
+ # )
9
+ #
10
+ # @session.mode = :dropbox
11
+ # end
12
+ #
13
+ # def test_generate
14
+ # structure =
15
+ # Vitreous::Share::DropboxStructure.new(
16
+ # "/Public/XXX5/website",
17
+ # @session
18
+ # )
19
+ #
20
+ # # create fixture
21
+ # puts "!!This should be commented!!"
22
+ # File.open( "#{FIXTURES_PATH}/dropbox_structure_real.json", 'w' ) do |f|
23
+ # f.write JSON.pretty_generate structure.generate
24
+ # end
25
+ # end
26
+ # end
@@ -0,0 +1,37 @@
1
+ require File.expand_path( "#{File.dirname(__FILE__)}/test_helper" )
2
+ require 'dummy_dropbox'
3
+
4
+ class DropboxStructureTest < Test::Unit::TestCase
5
+ def setup
6
+ DummyDropbox.root_path = FIXTURES_PATH
7
+ @session = ::Dropbox::Session.new( 'key', 'secret' )
8
+
9
+ # @session =
10
+ # ::Dropbox::Session.deserialize(
11
+ # File.read( "#{File.dirname(__FILE__)}/tmp/session_authorized.serialized" )
12
+ # )
13
+
14
+ @session.mode = :dropbox
15
+ end
16
+
17
+ def test_generate
18
+ Vitreous::Share::DropboxStructure.any_instance.stubs( :uri ).returns( 'wadus uri' )
19
+
20
+ structure =
21
+ Vitreous::Share::DropboxStructure.new(
22
+ "/folder_structure",
23
+ @session
24
+ )
25
+
26
+ # # create fixture
27
+ # puts "!!This should be commented!!"
28
+ # File.open( "#{FIXTURES_PATH}/structure.json", 'w' ) do |f|
29
+ # f.write JSON.pretty_generate structure.generate
30
+ # end
31
+
32
+ assert_equal(
33
+ JSON.load( File.read( "#{FIXTURES_PATH}/structure.json" ) ),
34
+ structure.generate
35
+ )
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ require File.expand_path( "#{File.dirname(__FILE__)}/test_helper" )
2
+
3
+ class ElementTest < Test::Unit::TestCase
4
+ def test_initialize
5
+ index = JSON.load( File.read( "#{FIXTURES_PATH}/index.json" ) )
6
+ element = Vitreous::Share::Element.new( index )
7
+
8
+ assert_equal( 'folder_structure', element.title )
9
+ assert_equal( '/', element.link )
10
+ assert_equal( true, element.collection? )
11
+ assert_equal( false, element.item? )
12
+ assert_equal( 3, element.elements.size )
13
+ assert_equal( 1, element.items.size )
14
+ assert_equal( 2, element.collections.size )
15
+
16
+ assert_equal( '/file-1', element.elements.first.link )
17
+ end
18
+ end
File without changes
@@ -0,0 +1 @@
1
+ file content
@@ -0,0 +1 @@
1
+ file content
@@ -0,0 +1 @@
1
+ file content
@@ -0,0 +1 @@
1
+ file content
File without changes
@@ -0,0 +1 @@
1
+ file content
@@ -0,0 +1 @@
1
+ file content
@@ -0,0 +1,110 @@
1
+ {
2
+ "title": "folder_structure",
3
+ "elements": [
4
+ {
5
+ "jpg": "wadus uri",
6
+ "title": "file 1",
7
+ "txt": "file content",
8
+ "txts": [
9
+ "file content",
10
+ "file content"
11
+ ],
12
+ "elements": [
13
+
14
+ ],
15
+ "type": "item",
16
+ "link": "/file-1",
17
+ "txt_thumb": "file content",
18
+ "jpgs": [
19
+ "wadus uri"
20
+ ]
21
+ },
22
+ {
23
+ "jpg": "wadus uri",
24
+ "title": "subfolder 1",
25
+ "txt": "file content",
26
+ "txts": [
27
+ "file content"
28
+ ],
29
+ "elements": [
30
+ {
31
+ "jpg": "wadus uri",
32
+ "title": "file 1",
33
+ "txt": "file content",
34
+ "txts": [
35
+ "file content"
36
+ ],
37
+ "elements": [
38
+
39
+ ],
40
+ "type": "item",
41
+ "link": "/subfolder-1/file-1",
42
+ "jpgs": [
43
+ "wadus uri"
44
+ ]
45
+ },
46
+ {
47
+ "jpg": "wadus uri",
48
+ "title": "file 2",
49
+ "txt": "file content",
50
+ "txts": [
51
+ "file content"
52
+ ],
53
+ "elements": [
54
+
55
+ ],
56
+ "type": "item",
57
+ "link": "/subfolder-1/file-2",
58
+ "jpgs": [
59
+ "wadus uri"
60
+ ]
61
+ },
62
+ {
63
+ "title": "subsubfolder 1",
64
+ "elements": [
65
+ {
66
+ "title": "file 1",
67
+ "txt": "file content",
68
+ "txts": [
69
+ "file content"
70
+ ],
71
+ "elements": [
72
+
73
+ ],
74
+ "type": "item",
75
+ "link": "/subfolder-1/subsubfolder-1/file-1"
76
+ }
77
+ ],
78
+ "type": "collection",
79
+ "link": "/subfolder-1/subsubfolder-1"
80
+ }
81
+ ],
82
+ "type": "collection",
83
+ "link": "/subfolder-1",
84
+ "jpgs": [
85
+ "wadus uri"
86
+ ]
87
+ },
88
+ {
89
+ "title": "subfolder 2",
90
+ "elements": [
91
+ {
92
+ "title": "file 1",
93
+ "txt": "file content",
94
+ "txts": [
95
+ "file content"
96
+ ],
97
+ "elements": [
98
+
99
+ ],
100
+ "type": "item",
101
+ "link": "/subfolder-2/file-1"
102
+ }
103
+ ],
104
+ "type": "collection",
105
+ "link": "/subfolder-2"
106
+ }
107
+ ],
108
+ "type": "collection",
109
+ "link": "/"
110
+ }
@@ -0,0 +1,146 @@
1
+ {
2
+ "name": "folder_structure",
3
+ "uri": "wadus uri",
4
+ "elements": [
5
+ {
6
+ "name": "file 1.jpg",
7
+ "uri": "wadus uri",
8
+ "elements": [
9
+
10
+ ],
11
+ "type": "file",
12
+ "content": null,
13
+ "path": "/file 1.jpg"
14
+ },
15
+ {
16
+ "name": "file 1.thumb.txt",
17
+ "uri": "wadus uri",
18
+ "elements": [
19
+
20
+ ],
21
+ "type": "file",
22
+ "content": "file content",
23
+ "path": "/file 1.thumb.txt"
24
+ },
25
+ {
26
+ "name": "file 1.txt",
27
+ "uri": "wadus uri",
28
+ "elements": [
29
+
30
+ ],
31
+ "type": "file",
32
+ "content": "file content",
33
+ "path": "/file 1.txt"
34
+ },
35
+ {
36
+ "name": "subfolder 1",
37
+ "uri": "wadus uri",
38
+ "elements": [
39
+ {
40
+ "name": "file 1.jpg",
41
+ "uri": "wadus uri",
42
+ "elements": [
43
+
44
+ ],
45
+ "type": "file",
46
+ "content": null,
47
+ "path": "/subfolder 1/file 1.jpg"
48
+ },
49
+ {
50
+ "name": "file 1.txt",
51
+ "uri": "wadus uri",
52
+ "elements": [
53
+
54
+ ],
55
+ "type": "file",
56
+ "content": "file content",
57
+ "path": "/subfolder 1/file 1.txt"
58
+ },
59
+ {
60
+ "name": "file 2.jpg",
61
+ "uri": "wadus uri",
62
+ "elements": [
63
+
64
+ ],
65
+ "type": "file",
66
+ "content": null,
67
+ "path": "/subfolder 1/file 2.jpg"
68
+ },
69
+ {
70
+ "name": "file 2.txt",
71
+ "uri": "wadus uri",
72
+ "elements": [
73
+
74
+ ],
75
+ "type": "file",
76
+ "content": "file content",
77
+ "path": "/subfolder 1/file 2.txt"
78
+ },
79
+ {
80
+ "name": "subsubfolder 1",
81
+ "uri": "wadus uri",
82
+ "elements": [
83
+ {
84
+ "name": "file 1.txt",
85
+ "uri": "wadus uri",
86
+ "elements": [
87
+
88
+ ],
89
+ "type": "file",
90
+ "content": "file content",
91
+ "path": "/subfolder 1/subsubfolder 1/file 1.txt"
92
+ }
93
+ ],
94
+ "type": "directory",
95
+ "content": null,
96
+ "path": "/subfolder 1/subsubfolder 1"
97
+ }
98
+ ],
99
+ "type": "directory",
100
+ "content": null,
101
+ "path": "/subfolder 1"
102
+ },
103
+ {
104
+ "name": "subfolder 1.jpg",
105
+ "uri": "wadus uri",
106
+ "elements": [
107
+
108
+ ],
109
+ "type": "file",
110
+ "content": null,
111
+ "path": "/subfolder 1.jpg"
112
+ },
113
+ {
114
+ "name": "subfolder 1.txt",
115
+ "uri": "wadus uri",
116
+ "elements": [
117
+
118
+ ],
119
+ "type": "file",
120
+ "content": "file content",
121
+ "path": "/subfolder 1.txt"
122
+ },
123
+ {
124
+ "name": "subfolder 2",
125
+ "uri": "wadus uri",
126
+ "elements": [
127
+ {
128
+ "name": "file 1.txt",
129
+ "uri": "wadus uri",
130
+ "elements": [
131
+
132
+ ],
133
+ "type": "file",
134
+ "content": "file content",
135
+ "path": "/subfolder 2/file 1.txt"
136
+ }
137
+ ],
138
+ "type": "directory",
139
+ "content": null,
140
+ "path": "/subfolder 2"
141
+ }
142
+ ],
143
+ "type": "directory",
144
+ "content": null,
145
+ "path": "/"
146
+ }
@@ -0,0 +1,28 @@
1
+ require File.expand_path( "#{File.dirname(__FILE__)}/test_helper" )
2
+
3
+ class IndexSearcherTest < Test::Unit::TestCase
4
+ def test_search
5
+ root = JSON.load( File.read( "#{FIXTURES_PATH}/index.json" ) )
6
+
7
+ element_found =
8
+ Vitreous::Share::IndexSearcher.search(
9
+ root,
10
+ '/subfolder-1/subsubfolder-1/file-1'
11
+ )
12
+
13
+ assert_equal( 'file 1', element_found['title'] )
14
+ assert_equal( '/subfolder-1/subsubfolder-1/file-1', element_found['link'] )
15
+ end
16
+
17
+ def test_search_not_found
18
+ root = JSON.load( File.read( "#{FIXTURES_PATH}/index.json" ) )
19
+
20
+ element_found =
21
+ Vitreous::Share::IndexSearcher.search(
22
+ root,
23
+ '/not/exists'
24
+ )
25
+
26
+ assert_nil( element_found )
27
+ end
28
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path( "#{File.dirname(__FILE__)}/test_helper" )
2
+
3
+ class IndexerTest < Test::Unit::TestCase
4
+ def test_generate
5
+ indexer =
6
+ Vitreous::Share::Indexer.new(
7
+ JSON.load( File.read( "#{FIXTURES_PATH}/structure.json" ) )
8
+ )
9
+
10
+ assert( indexer.generate.is_a? Array )
11
+ end
12
+
13
+ def test_json
14
+ indexer =
15
+ Vitreous::Share::Indexer.new(
16
+ JSON.load( File.read( "#{FIXTURES_PATH}/structure.json" ) )
17
+ )
18
+
19
+ # # create fixture
20
+ # puts "!!This should be commented!!"
21
+ # File.open( "#{FIXTURES_PATH}/index.json", 'w' ) do |f|
22
+ # f.write indexer.json
23
+ # end
24
+
25
+ assert_equal(
26
+ JSON.load( File.read( "#{FIXTURES_PATH}/index.json" ) ),
27
+ JSON.load( indexer.json )
28
+ )
29
+ end
30
+ end
@@ -0,0 +1,85 @@
1
+ require File.expand_path( "#{File.dirname(__FILE__)}/test_helper" )
2
+
3
+ class IndexerUtilsTest < Test::Unit::TestCase
4
+
5
+ def test_to_slug
6
+ assert_equal(
7
+ 'pepe-y-jun',
8
+ Vitreous::Share::IndexerUtils.to_slug( 'pepe y juán' )
9
+ )
10
+ end
11
+
12
+ def test_remove_extensions
13
+ assert_equal(
14
+ 'pepe y juán',
15
+ Vitreous::Share::IndexerUtils.remove_extensions( 'pepe y juán.thumb.jpg' )
16
+ )
17
+ end
18
+
19
+ def test_to_link
20
+ assert_equal(
21
+ '/path-1/path-2/my-file',
22
+ Vitreous::Share::IndexerUtils.to_link( '/Path 1/Path 2/My File.thumb.jpg' )
23
+ )
24
+
25
+ assert_equal(
26
+ '/',
27
+ Vitreous::Share::IndexerUtils.to_link( '/' )
28
+ )
29
+ end
30
+
31
+ def test_grouping
32
+ structure = JSON.load( File.read( "#{FIXTURES_PATH}/structure.json" ) )
33
+
34
+ groups = Vitreous::Share::IndexerUtils.grouping( structure['elements'] )
35
+ assert_equal( 3, groups.size )
36
+ end
37
+
38
+ def test_meta
39
+ structure = [
40
+ {
41
+ "type" => "file",
42
+ "content" => nil,
43
+ "path" => "/folder 1.jpg",
44
+ "uri" => "http://dropbox.com/user/folder 1.jpg",
45
+ "name" => "folder 1.jpg"
46
+ },
47
+ {
48
+ "type" => "file",
49
+ "content" => "file content",
50
+ "path" => "/folder 1.txt",
51
+ "uri" => "http://dropbox.com/user/folder 1.txt",
52
+ "name" => "folder 1.txt"
53
+ },
54
+ {
55
+ "type" => "directory",
56
+ "content" => nil,
57
+ "path" => "/folder 1",
58
+ "uri" => "http://dropbox.com/user/folder 1",
59
+ "name" => "folder 1"
60
+ }
61
+ ]
62
+
63
+ meta = Vitreous::Share::IndexerUtils.meta( structure )
64
+
65
+ assert_equal( "http://dropbox.com/user/folder 1.jpg", meta['jpg'] )
66
+ assert_equal( "file content", meta['txt'] )
67
+ assert_equal( ["file content"], meta['txts'] )
68
+ assert_equal( ["http://dropbox.com/user/folder 1.jpg"], meta['jpgs'] )
69
+ end
70
+
71
+ def test_meta_arrays
72
+ meta = {
73
+ 'jpg' => 'jpg',
74
+ 'jpg_0' => 'jpg 0',
75
+ 'jpg_1' => 'jpg 1',
76
+ 'txt' => 'txt',
77
+ 'txt_0' => 'txt 0'
78
+ }
79
+
80
+ meta_arrays = Vitreous::Share::IndexerUtils.meta_arrays( meta )
81
+
82
+ assert_equal( ["txt", "txt 0"], meta_arrays['txts'] )
83
+ assert_equal( ["jpg", "jpg 0", "jpg 1"], meta_arrays['jpgs'] )
84
+ end
85
+ end
@@ -0,0 +1,23 @@
1
+ require File.expand_path( "#{File.dirname(__FILE__)}/test_helper" )
2
+
3
+ class LocalStructureTest < Test::Unit::TestCase
4
+ def test_generate
5
+ Vitreous::Share::LocalStructure.any_instance.stubs( :uri ).returns( 'wadus uri' )
6
+
7
+ structure =
8
+ Vitreous::Share::LocalStructure.new(
9
+ "#{FIXTURES_PATH}/folder_structure"
10
+ )
11
+
12
+ # # create fixture
13
+ # puts "!!This should be commented!!"
14
+ # File.open( "#{FIXTURES_PATH}/structure.json", 'w' ) do |f|
15
+ # f.write( JSON.pretty_generate( structure.generate ) )
16
+ # end
17
+
18
+ assert_equal(
19
+ JSON.load( File.read( "#{FIXTURES_PATH}/structure.json" ) ),
20
+ structure.generate
21
+ )
22
+ end
23
+ end
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'mocha'
4
+
5
+ require "#{File.dirname( __FILE__)}/../lib/vitreous_share"
6
+
7
+ FIXTURES_PATH = File.expand_path( "#{File.dirname(__FILE__)}/fixtures" )
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "vitreous/share/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "vitreous_share"
7
+ s.version = Vitreous::Share::VERSION
8
+ s.authors = ["Fernando Guillen"]
9
+ s.email = ["fguillen.mail@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = "Shared components for Vitreous"
12
+ s.description = "Shared components for Vitreous"
13
+
14
+ s.rubyforge_project = "vitreous_share"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_dependency "json"
22
+ s.add_dependency "dropbox"
23
+ s.add_dependency "mustache"
24
+
25
+ s.add_development_dependency "bundler", ">= 1.0.0.rc.6"
26
+ s.add_development_dependency "mocha"
27
+ s.add_development_dependency "dummy_dropbox"
28
+ s.add_development_dependency "rake"
29
+ end
metadata ADDED
@@ -0,0 +1,225 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vitreous_share
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Fernando Guillen
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-07-27 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: json
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: dropbox
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: mustache
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :runtime
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ name: bundler
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 15424057
72
+ segments:
73
+ - 1
74
+ - 0
75
+ - 0
76
+ - rc
77
+ - 6
78
+ version: 1.0.0.rc.6
79
+ type: :development
80
+ version_requirements: *id004
81
+ - !ruby/object:Gem::Dependency
82
+ name: mocha
83
+ prerelease: false
84
+ requirement: &id005 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ hash: 3
90
+ segments:
91
+ - 0
92
+ version: "0"
93
+ type: :development
94
+ version_requirements: *id005
95
+ - !ruby/object:Gem::Dependency
96
+ name: dummy_dropbox
97
+ prerelease: false
98
+ requirement: &id006 !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ hash: 3
104
+ segments:
105
+ - 0
106
+ version: "0"
107
+ type: :development
108
+ version_requirements: *id006
109
+ - !ruby/object:Gem::Dependency
110
+ name: rake
111
+ prerelease: false
112
+ requirement: &id007 !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ hash: 3
118
+ segments:
119
+ - 0
120
+ version: "0"
121
+ type: :development
122
+ version_requirements: *id007
123
+ description: Shared components for Vitreous
124
+ email:
125
+ - fguillen.mail@gmail.com
126
+ executables: []
127
+
128
+ extensions: []
129
+
130
+ extra_rdoc_files: []
131
+
132
+ files:
133
+ - .gitignore
134
+ - .rvmrc
135
+ - Gemfile
136
+ - README.md
137
+ - Rakefile
138
+ - lib/vitreous/share/common_structure.rb
139
+ - lib/vitreous/share/dropbox_structure.rb
140
+ - lib/vitreous/share/element.rb
141
+ - lib/vitreous/share/index_searcher.rb
142
+ - lib/vitreous/share/indexer.rb
143
+ - lib/vitreous/share/indexer_utils.rb
144
+ - lib/vitreous/share/local_structure.rb
145
+ - lib/vitreous/share/version.rb
146
+ - lib/vitreous/vitreous.rb
147
+ - lib/vitreous_share.rb
148
+ - test/dropbox_structure_real_test.rb
149
+ - test/dropbox_structure_test.rb
150
+ - test/element_test.rb
151
+ - test/fixtures/folder_structure/file 1.jpg
152
+ - test/fixtures/folder_structure/file 1.thumb.txt
153
+ - test/fixtures/folder_structure/file 1.txt
154
+ - test/fixtures/folder_structure/subfolder 1.jpg
155
+ - test/fixtures/folder_structure/subfolder 1.txt
156
+ - test/fixtures/folder_structure/subfolder 1/file 1.jpg
157
+ - test/fixtures/folder_structure/subfolder 1/file 1.txt
158
+ - test/fixtures/folder_structure/subfolder 1/file 2.jpg
159
+ - test/fixtures/folder_structure/subfolder 1/file 2.txt
160
+ - test/fixtures/folder_structure/subfolder 1/subsubfolder 1/file 1.txt
161
+ - test/fixtures/folder_structure/subfolder 2/file 1.txt
162
+ - test/fixtures/index.json
163
+ - test/fixtures/structure.json
164
+ - test/index_searcher_test.rb
165
+ - test/indexer_test.rb
166
+ - test/indexer_utils_test.rb
167
+ - test/local_structure_test.rb
168
+ - test/test_helper.rb
169
+ - vitreous_share.gemspec
170
+ has_rdoc: true
171
+ homepage: ""
172
+ licenses: []
173
+
174
+ post_install_message:
175
+ rdoc_options: []
176
+
177
+ require_paths:
178
+ - lib
179
+ required_ruby_version: !ruby/object:Gem::Requirement
180
+ none: false
181
+ requirements:
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ hash: 3
185
+ segments:
186
+ - 0
187
+ version: "0"
188
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
+ none: false
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ hash: 3
194
+ segments:
195
+ - 0
196
+ version: "0"
197
+ requirements: []
198
+
199
+ rubyforge_project: vitreous_share
200
+ rubygems_version: 1.3.7
201
+ signing_key:
202
+ specification_version: 3
203
+ summary: Shared components for Vitreous
204
+ test_files:
205
+ - test/dropbox_structure_real_test.rb
206
+ - test/dropbox_structure_test.rb
207
+ - test/element_test.rb
208
+ - test/fixtures/folder_structure/file 1.jpg
209
+ - test/fixtures/folder_structure/file 1.thumb.txt
210
+ - test/fixtures/folder_structure/file 1.txt
211
+ - test/fixtures/folder_structure/subfolder 1.jpg
212
+ - test/fixtures/folder_structure/subfolder 1.txt
213
+ - test/fixtures/folder_structure/subfolder 1/file 1.jpg
214
+ - test/fixtures/folder_structure/subfolder 1/file 1.txt
215
+ - test/fixtures/folder_structure/subfolder 1/file 2.jpg
216
+ - test/fixtures/folder_structure/subfolder 1/file 2.txt
217
+ - test/fixtures/folder_structure/subfolder 1/subsubfolder 1/file 1.txt
218
+ - test/fixtures/folder_structure/subfolder 2/file 1.txt
219
+ - test/fixtures/index.json
220
+ - test/fixtures/structure.json
221
+ - test/index_searcher_test.rb
222
+ - test/indexer_test.rb
223
+ - test/indexer_utils_test.rb
224
+ - test/local_structure_test.rb
225
+ - test/test_helper.rb