dirk 0.1.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/lib/dirk.rb ADDED
@@ -0,0 +1,136 @@
1
+ require 'yaml'
2
+ # require 'image_fu'
3
+
4
+ class Dirk
5
+ attr_reader :path, :attributes, :attr_file
6
+
7
+ def self.dir
8
+ ""
9
+ end
10
+
11
+ def initialize(p = "", options = {})
12
+ @prefix = options[:prefix] || "_"
13
+ @attr_file = @prefix + (options[:attr_file] || "attributes.txt")
14
+ @root_path = Pathname.new(options[:root] || "public/data")
15
+ @path = (@root_path + self.class.dir + p).realpath
16
+ @attributes = get_attributes
17
+ end
18
+
19
+ # used to access the attributes of the current object
20
+ def method_missing(name, *args, &block)
21
+ @attributes ? @attributes[name.to_s] : nil
22
+ end
23
+
24
+ def name
25
+ slug.gsub(/_/, " ").split(".")[0]
26
+ end
27
+
28
+ def slug
29
+ path.basename.to_s
30
+ end
31
+
32
+ # returns the path relative to the root_path for the application
33
+ def relative_path(p = path)
34
+ anchor = p.ftype == "directory" ? @root_path : "public"
35
+ p.relative_path_from(Pathname.new(anchor).realpath)
36
+ end
37
+
38
+ # returns the url corresponding to the path
39
+ def url(p = path)
40
+ "/" + relative_path(p).to_s.downcase.gsub(/\s/, " ")
41
+ end
42
+
43
+ def extension
44
+ @path.extname[1..-1]
45
+ end
46
+
47
+ def parent
48
+ Dirk.new(@path.parent)
49
+ end
50
+
51
+ # creates a hash of Dirk objects for any non-system sub-directories of the current directory
52
+ def children(options = {})
53
+ children = get_children("directory").collect { |child| Dirk.new(child) }
54
+ children.reject! { |child| child.published == false || child.draft == true }
55
+ children.sort! { |a, b| a.send(options[:sort]).to_s <=> b.send(options[:sort]).to_s } if options[:sort]
56
+ children.reverse if options[:order].to_s.upcase == "DESC"
57
+ children
58
+ end
59
+
60
+ # creates a hash of Dirk objects for any non-system files in the current directory
61
+ def files(options = {})
62
+ resize_images_if_needed
63
+ files = get_children("file").collect do |file|
64
+ Dirk.new(file, { :attr_file => file.basename.to_s.gsub(file.extname, '.txt') })
65
+ end
66
+
67
+ files.sort! { |a, b| a.send(options[:sort]).to_s <=> b.send(options[:sort]).to_s } if options[:sort]
68
+ files
69
+ end
70
+
71
+ def thumb_path
72
+ thumb_path = Pathname.new(parent.path.realpath.to_s + "/#{@prefix}thumbs/" + path.basename)
73
+ create_thumbnail(path) unless thumb_path.exist?
74
+ thumb_path.realpath
75
+ end
76
+
77
+ def thumb_url
78
+ url(thumb_path)
79
+ end
80
+
81
+ private
82
+
83
+ def resize_images_if_needed
84
+ resize_path = Pathname.new(path.parent.realpath.to_s + "/#{@prefix}resize/")
85
+
86
+ if resize_path.exist?
87
+ back_path = (file.dirname).realpath.to_s + "/#{@prefix}backup"
88
+ FileUtils.mkdir_p back_dir unless File.exists?(back_dir)
89
+ FileUtils.mv(file, back_dir)
90
+
91
+ resize_path.entries.each do |image_path|
92
+ convert_size(image_path, path.parent.real_path)
93
+ end
94
+ end
95
+ end
96
+
97
+ def convert_size(file, destination)
98
+ %x{convert #{destination + "/" + file.basename} -resize 1000x1000 #{file}}
99
+ end
100
+
101
+ def get_children(type = %w{directory file})
102
+ @path.children.
103
+ reject { |child| [@prefix, "."].include?(child.basename.to_s[0..0]) }.
104
+ reject { |child| not [*type].include?(child.ftype) }
105
+ end
106
+
107
+ def get_attributes
108
+ file_contents = read_file(@attr_file)
109
+ return YAML::load(file_contents) if file_contents
110
+ {}
111
+ end
112
+
113
+ #TODO needs re-factoring - path should only be the directory and the file should be separate
114
+ def read_file(file)
115
+ text_file = (path.ftype == "directory" ? path : Pathname.new(path.dirname)) + file
116
+ File.read(text_file) if File.exists?(text_file)
117
+ end
118
+
119
+ end
120
+
121
+ class FileAttributes
122
+ def initialize(file)
123
+ return false unless file && !File.exists?(file)
124
+ contents = File.read(file)
125
+ @attribs = YAML::load(contents) if contents
126
+ end
127
+
128
+ def read(filename)
129
+ @attribs[filename]["title"]
130
+ end
131
+
132
+ def keys(filename)
133
+ @attribs[filename].keys
134
+ end
135
+
136
+ end
@@ -0,0 +1,19 @@
1
+ require 'faster_csv'
2
+
3
+ module Process
4
+ def contents(file)
5
+ case file.extname
6
+ when "txt":
7
+ file_contents = read_file(file)
8
+ return YAML::load_stream(file_contents).documents if file_contents
9
+ when "csv":
10
+ return FasterCSV.for_each load(file_contents) if %w{txt yml}.include?(file.extname)
11
+ end
12
+ {}
13
+ end
14
+
15
+ def read_file(file)
16
+ text_file = (path.ftype == "directory" ? path : Pathname.new(path.dirname)) + file
17
+ File.read(text_file) if File.exists?(text_file)
18
+ end
19
+ end
@@ -0,0 +1,6 @@
1
+ title: Portfolio Site
2
+ sub_title: This is the portfolio of a madman.
3
+ body: |
4
+ Welcome to the terrordome.
5
+ We do things differently inside.
6
+ There is no place to hide.
File without changes
@@ -0,0 +1,3 @@
1
+ title: Project 2
2
+ sub_title: This is a really great project
3
+ date: 2009
@@ -0,0 +1,6 @@
1
+ "image_1.jpg":
2
+ title: "A title beyond all titles"
3
+ description: "Some more meta data for your delectation"
4
+ "image_2.jpg":
5
+ title: "A title that's not as good as some other titles, but not bad nontheless"
6
+ description: "Yep, data is the meat on the bones"
@@ -0,0 +1,2 @@
1
+ title: This is project 3
2
+ sub_title: This is a really great project.
data/test/test_dirk.rb ADDED
@@ -0,0 +1,82 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require File.expand_path(
4
+ File.join(File.dirname(__FILE__), %w[.. lib dirk]))
5
+
6
+ class Projects < Dirk
7
+ def self.dir
8
+ "portfolio"
9
+ end
10
+ end
11
+
12
+ class TestDirk < Test::Unit::TestCase
13
+ def setup
14
+ test_root = File.join(File.dirname(__FILE__), 'fixtures', 'data')
15
+ @test_options = { :root => test_root }
16
+
17
+ @root = Dirk.new("", @test_options )
18
+ @projects = Projects.new("", @test_options )
19
+ @first_project = Dirk.new("portfolio/project_1", @test_options )
20
+ @second_project = Dirk.new("portfolio/project_2", @test_options )
21
+ @second_sub_project = Dirk.new("portfolio/project_2/sub-project_2", @test_options )
22
+ @image_1 = Pathname.new(test_root) + "portfolio/project_2/image_1.jpg"
23
+ @image_2 = Pathname.new(test_root) + "portfolio/project_2/image_2.jpg"
24
+ end
25
+
26
+ def test_subclass_can_set_starting_directory
27
+ assert_equal @projects.path, Dirk.new("portfolio", @test_options ).path
28
+ end
29
+
30
+ def test_dirk_correctly_counts_files
31
+ assert_equal 0, @root.files.size
32
+ assert_equal 1, @second_sub_project.files.size
33
+ assert_equal 2, @second_sub_project.parent.files.size
34
+ end
35
+
36
+ def test_dirk_correctly_shows_files
37
+ assert_equal @image_1, @projects.children[1].files[0].path
38
+ assert_equal [@image_1, @image_2], @second_sub_project.parent.files.collect { |file| file.path }
39
+ end
40
+
41
+ def test_dirk_correctly_counts_children
42
+ assert_equal 3, @root.children.size
43
+ end
44
+
45
+ def test_dirk_correctly_reads_parent
46
+ assert_equal @root.path, @root.children.first.parent.path
47
+ assert_equal @root.title, @root.children.first.parent.title
48
+ end
49
+
50
+ def test_dirk_correctly_traverses_heirarchy
51
+ assert_equal "portfolio", @root.children[2].path.basename.to_s
52
+ end
53
+
54
+ def test_dirk_correctly_computes_object_directory
55
+ assert_equal @second_sub_project.path, @root.children[2].children[1].children[1].path
56
+ end
57
+
58
+ def test_dirk_correctly_reads_attributes
59
+ assert_equal "Portfolio Site", @root.title
60
+ assert_equal "This is the portfolio of a madman.", @root.sub_title
61
+ assert_equal "Welcome to the terrordome.\nWe do things differently inside.\nThere is no place to hide.", @root.body
62
+ assert_equal "Project 2", @second_sub_project.parent.title
63
+ assert_equal "This is a really great project", @second_sub_project.parent.sub_title
64
+ end
65
+
66
+ def test_dirk_accepts_root_override
67
+ assert true
68
+ end
69
+
70
+ def test_dirk_accepts_prefix_override
71
+ project = Dirk.new("portfolio/project_3", @test_options.merge({:prefix => "^"}) )
72
+ assert_equal "This is project 3", project.title
73
+ end
74
+
75
+ def test_dirk_returns_slug
76
+ assert_equal "image_1.jpg", Dirk.new(@image_1).slug
77
+ end
78
+
79
+ def test_dirk_returns_name
80
+ assert_equal "image 1", Dirk.new(@image_1).name
81
+ end
82
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dirk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - James Andrews
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-13 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: me@jamesandre.ws
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - test/fixtures/data/_attributes.txt
26
+ - test/fixtures/data/news/_2009-04-36.txt
27
+ - test/fixtures/data/portfolio/project_1/_attributes.txt
28
+ - test/fixtures/data/portfolio/project_1/sub-project_1/_attributes.txt
29
+ - test/fixtures/data/portfolio/project_1/sub-project_2/_attributes.txt
30
+ - test/fixtures/data/portfolio/project_1/sub-project_3/_attributes.txt
31
+ - test/fixtures/data/portfolio/project_2/_attributes.txt
32
+ - test/fixtures/data/portfolio/project_2/_file_attributes.txt
33
+ - test/fixtures/data/portfolio/project_2/image_1.jpg
34
+ - test/fixtures/data/portfolio/project_2/image_2.jpg
35
+ - test/fixtures/data/portfolio/project_2/sub-project_1/_attributes.txt
36
+ - test/fixtures/data/portfolio/project_2/sub-project_2/broken_image_1.jpg
37
+ - test/fixtures/data/portfolio/project_3/^attributes.txt
38
+ - test/test_dirk.rb
39
+ - lib/dirk.rb
40
+ - lib/processes/read_file.rb
41
+ has_rdoc: true
42
+ homepage: http://jamesandre.ws
43
+ licenses: []
44
+
45
+ post_install_message:
46
+ rdoc_options: []
47
+
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: "0"
55
+ version:
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
+ version:
62
+ requirements: []
63
+
64
+ rubyforge_project: dirk
65
+ rubygems_version: 1.3.5
66
+ signing_key:
67
+ specification_version: 3
68
+ summary: Makes your file system act as a database
69
+ test_files: []
70
+