dircat 0.1.12 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/LICENSE.txt +1 -1
  2. data/README.md +31 -6
  3. data/bin/dircat +5 -1
  4. data/bin/scat +9 -0
  5. data/dircat.gemspec +48 -15
  6. data/examples/example.rb +2 -1
  7. data/lib/dircat.rb +29 -34
  8. data/lib/dircat/cat_on_sqlite/cat_on_sqlite.rb +177 -0
  9. data/lib/dircat/cat_on_sqlite/directory_visitor.rb +106 -0
  10. data/lib/dircat/cat_on_sqlite/migration/00_create_dircat_properties.rb +13 -0
  11. data/lib/dircat/cat_on_sqlite/migration/01_create_categories.rb +12 -0
  12. data/lib/dircat/cat_on_sqlite/migration/02_create_images.rb +16 -0
  13. data/lib/dircat/cat_on_sqlite/migration/03_create_items.rb +23 -0
  14. data/lib/dircat/cat_on_sqlite/migration/04_create_taggings.rb +13 -0
  15. data/lib/dircat/cat_on_sqlite/migration/05_create_tags.rb +13 -0
  16. data/lib/dircat/cat_on_sqlite/model/category.rb +16 -0
  17. data/lib/dircat/cat_on_sqlite/model/image.rb +24 -0
  18. data/lib/dircat/cat_on_sqlite/model/item.rb +19 -0
  19. data/lib/dircat/cat_on_sqlite/model/tag.rb +58 -0
  20. data/lib/dircat/cat_on_sqlite/model/tagging.rb +9 -0
  21. data/lib/dircat/cat_on_sqlite/simple_cataloger_error.rb +9 -0
  22. data/lib/dircat/cat_on_sqlite_cli/cli_cat.rb +25 -0
  23. data/lib/dircat/cat_on_sqlite_cli/cli_server.rb +65 -0
  24. data/lib/dircat/cat_on_sqlite_cli/cmd_create.rb +56 -0
  25. data/lib/dircat/cat_on_sqlite_cli/cmd_list.rb +72 -0
  26. data/lib/dircat/cat_on_sqlite_cli/cmd_server.rb +62 -0
  27. data/lib/dircat/cat_on_sqlite_cli/cmd_update.rb +49 -0
  28. data/lib/dircat/{cat.rb → cat_on_yaml/cat_on_yaml.rb} +22 -10
  29. data/lib/dircat/cat_on_yaml/entry.rb +64 -0
  30. data/lib/dircat/{cli → cat_on_yaml_cli}/cli_dircat.rb +0 -0
  31. data/lib/dircat/{cli → cat_on_yaml_cli}/command_build.rb +53 -12
  32. data/lib/dircat/{cli → cat_on_yaml_cli}/command_diff.rb +4 -4
  33. data/lib/dircat/{cli → cat_on_yaml_cli}/command_query.rb +16 -2
  34. data/lib/dircat/config.rb +25 -0
  35. data/lib/dircat/extensions.rb +26 -0
  36. data/lib/dircat/server/helpers.rb +60 -0
  37. data/lib/dircat/server/my_static.rb +40 -0
  38. data/lib/dircat/server/web_server.rb +176 -0
  39. data/lib/dircat/version.rb +2 -1
  40. data/lib/dircat_on_sqlite.rb +31 -0
  41. data/lib/dircat_on_sqlite_cli.rb +37 -0
  42. data/lib/simple_cataloger_dm/cli.rb +32 -0
  43. data/lib/simple_cataloger_dm/core.rb +43 -0
  44. data/lib/simple_cataloger_dm/core/catalog.rb +141 -0
  45. data/lib/simple_cataloger_dm/core/directory_visitor.rb +107 -0
  46. data/lib/simple_cataloger_dm/core/extensions.rb +26 -0
  47. data/lib/simple_cataloger_dm/core/simple_cataloger_error.rb +9 -0
  48. data/lib/simple_cataloger_dm/models/category.rb +21 -0
  49. data/lib/simple_cataloger_dm/models/image.rb +30 -0
  50. data/lib/simple_cataloger_dm/models/item.rb +24 -0
  51. data/lib/simple_cataloger_dm/models/tag.rb +62 -0
  52. data/lib/simple_cataloger_dm/models/tagging.rb +11 -0
  53. data/lib/simple_cataloger_dm/server/helpers.rb +60 -0
  54. data/lib/simple_cataloger_dm/server/my_static.rb +40 -0
  55. data/lib/simple_cataloger_dm/server/web_server.rb +171 -0
  56. data/spec/dircat/cat_on_sqlite/cat_on_sqlite_spec.rb +41 -0
  57. data/spec/dircat/cat_on_sqlite_web/web_server_spec.rb +30 -0
  58. data/spec/dircat/{cat_spec.rb → cat_on_yaml/cat_on_yaml_spec.rb} +20 -14
  59. data/spec/dircat/{cli → cat_on_yaml_cli}/cli_dircat_spec.rb +0 -0
  60. data/spec/dircat/{cli → cat_on_yaml_cli}/command_build_spec.rb +4 -4
  61. data/spec/dircat/{cli → cat_on_yaml_cli}/command_diff_spec.rb +0 -0
  62. data/spec/dircat/{cli → cat_on_yaml_cli}/command_query_spec.rb +1 -1
  63. data/spec/fixtures/certified_output/cat_dir1_20120811.yaml +25 -0
  64. data/spec/fixtures/certified_output/cat_dir2_20120811.yaml +34 -0
  65. data/spec/fixtures/certified_output/{dircat1.yaml → dircat1_version_0.1.yaml} +0 -0
  66. data/spec/fixtures/certified_output/{dircat2.yaml → dircat2_version_0.1.yaml} +0 -0
  67. data/spec/fixtures/dir4/file1.txt +1 -0
  68. data/spec/fixtures/dir4/file2.txt +1 -0
  69. data/spec/fixtures/dir4/subdir/file3.txt +1 -0
  70. data/spec/fixtures/films/A-Z/A/Arancia meccanica [Stanley Kubrick][1971]/folder.jpg +0 -0
  71. data/spec/fixtures/films/A-Z/P/Plan 9 [Edward Wood][1959]/folder.jpg +0 -0
  72. data/spec/fixtures/films/Directors/[Akira Kurosawa]/[1940] Dersu Uzala [5]/folder.jpg +0 -0
  73. data/spec/fixtures/films/Directors/[Akira Kurosawa]/[1965] Barbarossa [Toshiro Mifune][4]/folder.jpg +0 -0
  74. data/spec/fixtures/films/Directors/[Federico Fellini]/[1963] 8 e mezzo [Marcello Mastroianni][Claudia Cardinale][5]/folder.jpg +0 -0
  75. data/spec/fixtures/films/Directors/[Woody Allen]/[1977] Annie Hall [Diane Keaton][5]/folder.jpg +0 -0
  76. data/{.gemtest → spec/fixtures/readme.txt} +0 -0
  77. data/spec/fixtures/tmp/test_ar.sqlite3 +0 -0
  78. data/spec/fixtures/tmp/test_ar.yml +7 -0
  79. data/spec/generate_directories_to_catalog.rb +80 -0
  80. data/spec/generate_mysql_catalog.rb +124 -0
  81. data/spec/spec_helper.rb +29 -0
  82. data/tasks/rspec.rake +0 -2
  83. metadata +390 -112
  84. data/lib/dircat/entry.rb +0 -61
  85. data/lib/dircat/extension_md5.rb +0 -25
  86. data/lib/dircat/extension_numeric.rb +0 -15
  87. data/spec/dircat/md5_spec.rb +0 -8
  88. data/spec/dircat/numeric_spec.rb +0 -13
@@ -0,0 +1,13 @@
1
+ # -*- coding: utf-8 -*-
2
+ class CreateDircatProperties < ActiveRecord::Migration
3
+ def self.up
4
+ create_table :dircat_properties do |t|
5
+ t.string :name, :null => false
6
+ t.string :value, :null => false
7
+ end
8
+ end
9
+
10
+ def self.down
11
+ drop_table :dircat_properties
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ # -*- coding: utf-8 -*-
2
+ class CreateCategories < ActiveRecord::Migration
3
+ def self.up
4
+ create_table :categories do |t|
5
+ t.string :name, :null => false
6
+ end
7
+ end
8
+
9
+ def self.down
10
+ drop_table :categories
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ # -*- coding: utf-8 -*-
2
+ class CreateImages < ActiveRecord::Migration
3
+ def self.up
4
+ create_table :images do |t|
5
+ t.string :path, :null => false
6
+ t.string :path_from_catalog_root, :null => false
7
+
8
+ t.integer :tag_id
9
+ t.integer :item_id
10
+ end
11
+ end
12
+
13
+ def self.down
14
+ drop_table :images
15
+ end
16
+ end
@@ -0,0 +1,23 @@
1
+ # -*- coding: utf-8 -*-
2
+ class CreateItems < ActiveRecord::Migration
3
+ def self.up
4
+ create_table :items do |t|
5
+
6
+ t.string :md5
7
+
8
+ t.string :name, :null => false
9
+ t.string :path, :null => false
10
+ t.string :path_from_catalog_root, :null => false
11
+ t.integer :size, :null => false
12
+
13
+ t.date :added_at, :null => false
14
+
15
+ t.integer :rating
16
+ t.date :flagged_at
17
+ end
18
+ end
19
+
20
+ def self.down
21
+ drop_table :items
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ # -*- coding: utf-8 -*-
2
+ class CreateTaggings < ActiveRecord::Migration
3
+ def self.up
4
+ create_table :taggings, :id => false do |t|
5
+ t.integer :item_id
6
+ t.integer :tag_id
7
+ end
8
+ end
9
+
10
+ def self.down
11
+ drop_table :taggings
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- coding: utf-8 -*-
2
+ class CreateTags < ActiveRecord::Migration
3
+ def self.up
4
+ create_table :tags do |t|
5
+ t.string :name, :null => false
6
+ t.integer :category_id
7
+ end
8
+ end
9
+
10
+ def self.down
11
+ drop_table :tags
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ # -*- coding: utf-8 -*-
2
+ module SimpleCataloger
3
+
4
+ class Category < ActiveRecord::Base
5
+ scope :order_by_name, order("name")
6
+ has_many :tags, :order => "name"
7
+
8
+ # tried following but it didn't work
9
+ # has_many :items, :through => :tags
10
+ #
11
+ def items
12
+ tags.collect { |t| t.items }.flatten
13
+ end
14
+ end
15
+
16
+ end
@@ -0,0 +1,24 @@
1
+ # -*- coding: utf-8 -*-
2
+ module SimpleCataloger
3
+
4
+ class Image < ActiveRecord::Base
5
+ belongs_to :item # :required => false
6
+ belongs_to :tag # :required => false
7
+
8
+ def to_json(*a)
9
+ { :item => if item then
10
+ item.name
11
+ else
12
+ nil
13
+ end,
14
+ :tag => if tag then
15
+ tag.name
16
+ else
17
+ nil
18
+ end,
19
+ :src => path_from_catalog_root }.to_json(*a)
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,19 @@
1
+ # -*- coding: utf-8 -*-
2
+ module SimpleCataloger
3
+
4
+ class Item < ActiveRecord::Base
5
+ has_many :taggings
6
+ has_many :tags, :through => :taggings
7
+ has_many :images
8
+
9
+ def to_s
10
+ name
11
+ end
12
+
13
+ def peso
14
+ 1
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,58 @@
1
+ # -*- coding: utf-8 -*-
2
+ module SimpleCataloger
3
+
4
+ class Tag < ActiveRecord::Base
5
+ belongs_to :category
6
+
7
+ has_many :taggings
8
+ has_many :items, :through => :taggings, :order => "name"
9
+ has_many :images
10
+
11
+ ##################################################
12
+ #
13
+
14
+ RE_TAG = /\[([^\]]+)\]/
15
+
16
+ # extracts tags from directory or file name
17
+ def self.extract_tags(dir_or_file_name)
18
+ tags = []
19
+ match_data = dir_or_file_name.match(RE_TAG)
20
+ while match_data
21
+ tags << match_data[1]
22
+ match_data = dir_or_file_name.match(RE_TAG, match_data.end(0))
23
+ end
24
+ tags
25
+ end
26
+
27
+ def self.extract_name(dir_or_file_name)
28
+ dir_or_file_name.gsub(Tag::RE_TAG, '').strip
29
+ end
30
+
31
+ RE_RATING = /^\d$/
32
+ RE_YEAR = /^\d\d\d\d$/
33
+
34
+ MATCHES = [
35
+ [RE_RATING, "rating", proc { |tag_name| tag_name.to_i }],
36
+ [RE_YEAR, "year", proc { |tag_name| tag_name.to_i }]
37
+ ]
38
+
39
+ #
40
+ # decode standard tags
41
+ #
42
+ def self.match_category(tag_name)
43
+ MATCHES.each do |re, category_name, convert|
44
+ if re.match tag_name
45
+ category = Category.find_or_create_by_name(category_name)
46
+ tag = Tag.find_or_create_by_name_and_category_id(
47
+ convert.call(tag_name),
48
+ category.id
49
+ )
50
+ return category
51
+ end
52
+ end
53
+ nil
54
+ end
55
+
56
+ end # class Tag
57
+
58
+ end # module SimpleCatalog
@@ -0,0 +1,9 @@
1
+ # -*- coding: utf-8 -*-
2
+ module SimpleCataloger
3
+
4
+ class Tagging < ActiveRecord::Base
5
+ belongs_to :item
6
+ belongs_to :tag
7
+ end
8
+
9
+ end # module
@@ -0,0 +1,9 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module SimpleCataloger
4
+ class SimpleCatalogerError < StandardError
5
+ def initialize(msg)
6
+ super
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,25 @@
1
+ # -*- coding: utf-8 -*-
2
+ class CliCat < OptParseCommand::CliMain
3
+
4
+ def self.command
5
+ "simple_cataloger"
6
+ end
7
+
8
+ def self.description
9
+ "description"
10
+ end
11
+
12
+ def self.version
13
+ SimpleCataloger::VERSION
14
+ end
15
+
16
+ # def defaults(options)
17
+ # OpenStruct.new(
18
+ # )
19
+ # end
20
+
21
+ # def option_parser(options)
22
+ # super(options)
23
+ # end
24
+
25
+ end
@@ -0,0 +1,65 @@
1
+ # -*- coding: utf-8 -*-
2
+ module SimpleCataloger
3
+ #
4
+ # Build a catalogue starting from a directory
5
+ #
6
+ class CliServer
7
+
8
+ def self.run
9
+ return self.new.parse_args( ARGV )
10
+ end
11
+
12
+ def parse_args( argv )
13
+ options = { :verbose => true, :force => false }
14
+ opts = OptionParser.new
15
+ opts.banner << " <catalog name>\n"
16
+ opts.banner << "launch a webs server to browse the content of <catalog name>\n";
17
+ opts.banner << "\n"
18
+
19
+ opts.on("-h", "--help", "Print this message") do
20
+ puts opts
21
+ return 0
22
+ end
23
+
24
+ opts.on("--version", "show the simple catalog version") do
25
+ puts "simple catalog version #{SimpleCatalog::version}"
26
+ return 0
27
+ end
28
+
29
+ opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
30
+ options[:verbose] = v
31
+ end
32
+
33
+ rest = opts.parse(argv)
34
+
35
+ if rest.length < 1
36
+ puts "too few arguments"
37
+ puts "-h to print help"
38
+ return 0
39
+ end
40
+
41
+ catalog_name = rest[0]
42
+ cat_opts = {}
43
+
44
+ #
45
+ # option verbose
46
+ #
47
+
48
+ if options.has_key?(:verbose)
49
+ if options[:verbose]
50
+ cat_opts[:verbose_level] = 1
51
+ end
52
+ end
53
+
54
+ #
55
+ # main
56
+ #
57
+
58
+ catalog = CatOnSqlite.new(catalog_name)
59
+ WebServer.run! :host => 'localhost', :port => 9091, :catalog => catalog
60
+
61
+ 0
62
+ end
63
+
64
+ end
65
+ end
@@ -0,0 +1,56 @@
1
+ # -*- coding: utf-8 -*-
2
+ module SimpleCataloger
3
+ class CmdCreate < OptParseCommand::Command
4
+
5
+ CliCat.register_command(self)
6
+
7
+ def self.command
8
+ "create"
9
+ end
10
+
11
+ def self.description
12
+ "create a catalog"
13
+ end
14
+
15
+ def self.usage
16
+ "#{command} <catalog name> <directory>\n" +
17
+ "Create a catalog with name <catalog name> starting from structure of <directory>"
18
+ end
19
+
20
+ def defaults(options)
21
+ options.force = false
22
+ options
23
+ end
24
+
25
+ def option_parser(options)
26
+ parser = super(options)
27
+ parser
28
+ end
29
+
30
+ def exec(main, options, rest)
31
+ if rest.length < 2
32
+ puts "too few arguments"
33
+ puts "-h to print help"
34
+ return 0
35
+ end
36
+ catalog_name = rest[0]
37
+ catalog_dirname = rest[1]
38
+ catalog_dirname = File.expand_path(catalog_dirname)
39
+
40
+ if not FileTest.directory?(catalog_dirname)
41
+ puts "'#{catalog_dirname}' not exists or is not a directory"
42
+ return 0
43
+ end
44
+
45
+ begin
46
+ catalog = SimpleCataloger::CatOnSqlite.new(catalog_name)
47
+ catalog.create(catalog_dirname)
48
+ catalog.update
49
+ rescue SimpleCataloger::SimpleCatalogerError => e
50
+ puts e.message
51
+ end
52
+ 0
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,72 @@
1
+ # -*- coding: utf-8 -*-
2
+ module SimpleCataloger
3
+ class CmdList < OptParseCommand::Command
4
+
5
+ CliCat.register_command(self)
6
+
7
+ def self.command
8
+ "list"
9
+ end
10
+
11
+ def self.description
12
+ "list items in catalog"
13
+ end
14
+
15
+ def self.usage
16
+ "#{command} <catalog name> <directory>\n" +
17
+ "Create a catalog with name <catalog name> starting from structure of <directory>"
18
+ end
19
+
20
+ def defaults(options)
21
+ options.force = false
22
+ options
23
+ end
24
+
25
+ def option_parser(options)
26
+ parser = super(options)
27
+ parser
28
+ end
29
+
30
+ def exec(main, options, rest)
31
+ if rest.length < 1
32
+ puts "too few arguments"
33
+ puts "-h to print help"
34
+ return 0
35
+ end
36
+
37
+ catalog_name = rest[0]
38
+ cat_opts = {}
39
+
40
+ # begin
41
+ catalog = CatOnSqlite.new(catalog_name).open
42
+ puts "contains of '#{catalog.name}'"
43
+ puts "categories"
44
+ Category.all.each do |c|
45
+ puts "\t #{c.name}"
46
+ end
47
+
48
+ # Category.find_by_name("Actor").items.each do |i|
49
+ # pp i
50
+ # end
51
+
52
+ #
53
+ # Tags
54
+ #
55
+ puts "tags"
56
+ Tag.all.each do |t|
57
+ puts "\t #{t.name} (category: #{t.category.name})"
58
+ end
59
+
60
+ puts "items"
61
+ Item.all.each do |f|
62
+ puts "\t #{f.name}"
63
+ end
64
+ # rescue e
65
+ # puts e.message
66
+ # end
67
+
68
+ 0
69
+ end
70
+
71
+ end
72
+ end