photish 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +57 -7
- data/TODO.md +2 -0
- data/exe/photish +15 -1
- data/lib/photish/assets/example/site/_plugins/footer_links.rb +8 -13
- data/lib/photish/assets/example/site/_plugins/yell_loud.rb +2 -8
- data/lib/photish/assets/example/site/styles/basic.css +0 -1
- data/lib/photish/cache/manifest.rb +61 -0
- data/lib/photish/cache/manifest_db_file.rb +28 -0
- data/lib/photish/cli/interface.rb +7 -0
- data/lib/photish/command/base.rb +8 -5
- data/lib/photish/command/deploy.rb +3 -3
- data/lib/photish/command/generate.rb +48 -13
- data/lib/photish/command/host.rb +20 -3
- data/lib/photish/command/worker.rb +44 -0
- data/lib/photish/config/app_settings.rb +19 -4
- data/lib/photish/config/default_config.rb +28 -2
- data/lib/photish/config/file_config_location.rb +4 -4
- data/lib/photish/gallery/album.rb +14 -6
- data/lib/photish/gallery/collection.rb +9 -9
- data/lib/photish/gallery/image.rb +2 -2
- data/lib/photish/gallery/photo.rb +3 -3
- data/lib/photish/gallery/traits/breadcrumbable.rb +12 -17
- data/lib/photish/gallery/traits/urlable.rb +1 -5
- data/lib/photish/log/logger.rb +4 -3
- data/lib/photish/plugin/repository.rb +45 -21
- data/lib/photish/render/image_conversion.rb +28 -20
- data/lib/photish/render/site.rb +19 -41
- data/lib/photish/render/site_worker.rb +80 -0
- data/lib/photish/version.rb +1 -1
- data/lib/photish.rb +8 -2
- data/photish.gemspec +1 -2
- metadata +18 -29
- data/lib/photish/render/change_manifest.rb +0 -50
@@ -3,8 +3,8 @@ module Photish
|
|
3
3
|
class FileConfigLocation
|
4
4
|
FILE_NAME = 'config.yml'
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
@
|
6
|
+
def initialize(config_dir)
|
7
|
+
@config_dir = config_dir
|
8
8
|
end
|
9
9
|
|
10
10
|
def path
|
@@ -13,10 +13,10 @@ module Photish
|
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
|
-
attr_reader :
|
16
|
+
attr_reader :config_dir
|
17
17
|
|
18
18
|
def directory
|
19
|
-
|
19
|
+
config_dir || Dir.pwd
|
20
20
|
end
|
21
21
|
|
22
22
|
def config_file_name
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Photish
|
2
2
|
module Gallery
|
3
3
|
class Album
|
4
|
-
include
|
5
|
-
include
|
6
|
-
include
|
7
|
-
include
|
4
|
+
include Traits::Urlable
|
5
|
+
include Traits::Albumable
|
6
|
+
include Traits::Metadatable
|
7
|
+
include Traits::Breadcrumbable
|
8
8
|
include Photish::Plugin::Pluginable
|
9
9
|
|
10
10
|
delegate :qualities,
|
@@ -25,8 +25,8 @@ module Photish
|
|
25
25
|
@photos ||= Dir.entries(path)
|
26
26
|
.reject { |file| ['.', '..'].include?(file) }
|
27
27
|
.map { |file| File.join(path, file) }
|
28
|
-
.reject { |file| !File.file?(file)
|
29
|
-
|
28
|
+
.reject { |file| !File.file?(file) ||
|
29
|
+
!image_format?(file) }
|
30
30
|
.map { |file| Photo.new(self, file) }
|
31
31
|
end
|
32
32
|
|
@@ -41,6 +41,14 @@ module Photish
|
|
41
41
|
|
42
42
|
alias_method :base_url_name, :name
|
43
43
|
|
44
|
+
def image_format?(file)
|
45
|
+
extension = File.extname(file).split('.').last.try(:downcase)
|
46
|
+
return if extension.nil?
|
47
|
+
MIME::Types.type_for(extension).any? do
|
48
|
+
|mime| mime.to_s.match(formats)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
44
52
|
def album_class
|
45
53
|
self.class
|
46
54
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Photish
|
2
2
|
module Gallery
|
3
3
|
class Collection
|
4
|
-
include
|
5
|
-
include
|
6
|
-
include
|
7
|
-
include
|
4
|
+
include Traits::Urlable
|
5
|
+
include Traits::Albumable
|
6
|
+
include Traits::Metadatable
|
7
|
+
include Traits::Breadcrumbable
|
8
8
|
include Photish::Plugin::Pluginable
|
9
9
|
|
10
10
|
attr_reader :qualities,
|
@@ -29,11 +29,11 @@ module Photish
|
|
29
29
|
Photish::Plugin::Type::Collection
|
30
30
|
end
|
31
31
|
|
32
|
-
def
|
33
|
-
@
|
34
|
-
all_albums.map(&:
|
35
|
-
all_photos.map(&:
|
36
|
-
all_images.map(&:
|
32
|
+
def all_url_parts
|
33
|
+
@all_url_parts ||= [url_parts,
|
34
|
+
all_albums.map(&:url_parts),
|
35
|
+
all_photos.map(&:url_parts),
|
36
|
+
all_images.map(&:url_parts)].flatten(1)
|
37
37
|
end
|
38
38
|
|
39
39
|
private
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Photish
|
2
2
|
module Gallery
|
3
3
|
class Image
|
4
|
-
include
|
4
|
+
include Traits::Urlable
|
5
5
|
include Photish::Plugin::Pluginable
|
6
6
|
|
7
7
|
delegate :name,
|
@@ -36,7 +36,7 @@ module Photish
|
|
36
36
|
alias_method :base_url_name, :name
|
37
37
|
|
38
38
|
def url_end
|
39
|
-
"#{slugify(basename)}-#{slugify(quality_name)}#{extension}"
|
39
|
+
@url_end ||= "#{slugify(basename)}-#{slugify(quality_name)}#{extension}"
|
40
40
|
end
|
41
41
|
|
42
42
|
def basename
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module Photish
|
2
2
|
module Gallery
|
3
3
|
class Photo
|
4
|
-
include
|
5
|
-
include
|
6
|
-
include
|
4
|
+
include Traits::Urlable
|
5
|
+
include Traits::Metadatable
|
6
|
+
include Traits::Breadcrumbable
|
7
7
|
include Photish::Plugin::Pluginable
|
8
8
|
|
9
9
|
delegate :qualities,
|
@@ -3,17 +3,13 @@ module Photish
|
|
3
3
|
module Traits
|
4
4
|
module Breadcrumbable
|
5
5
|
def breadcrumbs
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
doc.a(level.name, href: level.url)
|
12
|
-
}
|
13
|
-
end
|
14
|
-
}
|
6
|
+
html = "<ul class=\"breadcrumbs\">"
|
7
|
+
parents_and_me.each_with_index do |level, index|
|
8
|
+
html << "<li class=\"" << crumb_class(index) << "\">"
|
9
|
+
html << "<a href=\"" << level.url << "\">" << level.name << "</a>"
|
10
|
+
html << "</li>"
|
15
11
|
end
|
16
|
-
|
12
|
+
html << "</ul>"
|
17
13
|
end
|
18
14
|
|
19
15
|
def parents_and_me
|
@@ -24,13 +20,12 @@ module Photish
|
|
24
20
|
private
|
25
21
|
|
26
22
|
def crumb_class(index)
|
27
|
-
crumb_class =
|
28
|
-
crumb_class << '
|
29
|
-
crumb_class <<
|
30
|
-
crumb_class << 'crumb-
|
31
|
-
crumb_class << 'crumb-
|
32
|
-
crumb_class
|
33
|
-
crumb_class.join(' ')
|
23
|
+
crumb_class = 'breadcrumb'
|
24
|
+
crumb_class << ' crumb-' << index.to_s
|
25
|
+
crumb_class << ' crumb-first' if index == 0
|
26
|
+
crumb_class << ' crumb-last' if index == (parents_and_me.count - 1)
|
27
|
+
crumb_class << ' crumb-only' if parents_and_me.count == 1
|
28
|
+
crumb_class
|
34
29
|
end
|
35
30
|
end
|
36
31
|
end
|
data/lib/photish/log/logger.rb
CHANGED
@@ -11,6 +11,7 @@ module Photish
|
|
11
11
|
|
12
12
|
def setup_logging(config)
|
13
13
|
return if setup_complete
|
14
|
+
|
14
15
|
setup_color_scheme if colorize?(config)
|
15
16
|
setup_stdout_output if output_to_stdout?(config)
|
16
17
|
setup_file_output if output_to_file?(config)
|
@@ -22,7 +23,7 @@ module Photish
|
|
22
23
|
private
|
23
24
|
|
24
25
|
def logging_level(config)
|
25
|
-
config.logging.level.to_sym
|
26
|
+
config.logging.level.try(:to_sym)
|
26
27
|
end
|
27
28
|
|
28
29
|
def colorize?(config)
|
@@ -55,7 +56,7 @@ module Photish
|
|
55
56
|
stdout_appender = Logging.appenders.stdout(
|
56
57
|
'stdout',
|
57
58
|
layout: Logging.layouts.pattern(
|
58
|
-
pattern: '[%d] %-5l %c: %m\n',
|
59
|
+
pattern: '[%d][%p][%t] %-5l %c: %m\n',
|
59
60
|
color_scheme: 'bright'
|
60
61
|
)
|
61
62
|
)
|
@@ -67,7 +68,7 @@ module Photish
|
|
67
68
|
file_appender = Logging.appenders.file(
|
68
69
|
'log/photish.log',
|
69
70
|
layout: Logging.layouts.pattern(
|
70
|
-
pattern: '[%d] %-5l %c: %m\n',
|
71
|
+
pattern: '[%d][%p][%t] %-5l %c: %m\n',
|
71
72
|
)
|
72
73
|
)
|
73
74
|
Logging.logger.root.add_appenders(file_appender)
|
@@ -1,39 +1,63 @@
|
|
1
1
|
module Photish
|
2
2
|
module Plugin
|
3
|
-
|
3
|
+
class Repository
|
4
|
+
include Singleton
|
5
|
+
|
4
6
|
class << self
|
5
7
|
def reload(log, site_dir)
|
6
|
-
log
|
7
|
-
Dir[File.join(site_dir, '_plugins', '*.rb')].each do |file|
|
8
|
-
load file
|
9
|
-
end
|
10
|
-
|
11
|
-
all_plugins.each do |plugin|
|
12
|
-
log.info "Found plugin #{plugin}"
|
13
|
-
end
|
8
|
+
self.instance.reload(log, site_dir)
|
14
9
|
end
|
15
10
|
|
16
11
|
def plugins_for(type)
|
17
|
-
|
12
|
+
self.instance.plugins_for(type)
|
18
13
|
end
|
19
14
|
|
20
|
-
def
|
21
|
-
|
22
|
-
.reject { |m| ignored_modules.include?(m) }
|
15
|
+
def loaded?
|
16
|
+
self.instance.loaded?
|
23
17
|
end
|
24
|
-
|
25
|
-
private
|
18
|
+
end
|
26
19
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
20
|
+
def reload(log, site_dir)
|
21
|
+
log.info "Loading plugins..."
|
22
|
+
Dir[File.join(site_dir, '_plugins', '*.rb')].each do |file|
|
23
|
+
load file
|
31
24
|
end
|
32
25
|
|
33
|
-
|
34
|
-
|
26
|
+
@all_plugins = nil
|
27
|
+
|
28
|
+
all_plugins.each do |plugin|
|
29
|
+
log.info "Found plugin #{plugin}"
|
35
30
|
end
|
36
31
|
end
|
32
|
+
|
33
|
+
def plugins_for(type)
|
34
|
+
all_plugins.reject { |m| !m.is_for?(type) }
|
35
|
+
end
|
36
|
+
|
37
|
+
def all_plugins
|
38
|
+
@all_plugins ||= constants.map { |m| constantize(m) }
|
39
|
+
.reject { |m| ignored_modules.include?(m) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def loaded?
|
43
|
+
@all_plugins.present?
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def constants
|
49
|
+
Photish::Plugin.constants
|
50
|
+
end
|
51
|
+
|
52
|
+
def ignored_modules
|
53
|
+
[Photish::Plugin::Repository,
|
54
|
+
Photish::Plugin::Pluginable,
|
55
|
+
Photish::Plugin::Type]
|
56
|
+
end
|
57
|
+
|
58
|
+
def constantize(symbol)
|
59
|
+
Kernel.const_get("Photish::Plugin::#{symbol}")
|
60
|
+
end
|
37
61
|
end
|
38
62
|
end
|
39
63
|
end
|
@@ -1,30 +1,20 @@
|
|
1
1
|
module Photish
|
2
2
|
module Render
|
3
3
|
class ImageConversion
|
4
|
-
def initialize(output_dir,
|
4
|
+
def initialize(output_dir, worker_index, version_hash, threads)
|
5
5
|
@output_dir = output_dir
|
6
|
-
@
|
6
|
+
@worker_index = worker_index
|
7
|
+
@version_hash = version_hash
|
8
|
+
@threads = threads
|
7
9
|
@log = Logging.logger[self]
|
8
10
|
end
|
9
11
|
|
10
12
|
def render(images)
|
11
|
-
|
12
|
-
|
13
|
-
log.info "Rendering #{images.count} images across #{max_workers} threads"
|
13
|
+
log.info "Rendering #{images.count} images across #{threads} threads"
|
14
14
|
|
15
15
|
change_manifest.preload
|
16
|
-
|
17
|
-
|
18
|
-
begin
|
19
|
-
while image = image_queue.pop(true)
|
20
|
-
convert(image) if changed?(image.url_path, image.path)
|
21
|
-
end
|
22
|
-
rescue ThreadError => e
|
23
|
-
log.info "Expected exception, queue is empty #{e.class} \"#{e.message}\" #{e.backtrace.join("\n")}"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
workers.map(&:join)
|
16
|
+
threads = spawn_thread_instances(to_queue(images))
|
17
|
+
threads.map(&:join)
|
28
18
|
flush_to_disk
|
29
19
|
end
|
30
20
|
|
@@ -32,16 +22,32 @@ module Photish
|
|
32
22
|
|
33
23
|
attr_reader :output_dir,
|
34
24
|
:log,
|
35
|
-
:
|
25
|
+
:worker_index,
|
26
|
+
:version_hash,
|
27
|
+
:threads
|
36
28
|
|
37
29
|
delegate :record,
|
38
30
|
:changed?,
|
39
31
|
:flush_to_disk,
|
32
|
+
:preload,
|
40
33
|
to: :change_manifest
|
41
34
|
|
35
|
+
def spawn_thread_instances(image_queue)
|
36
|
+
(0...threads).map do
|
37
|
+
Thread.new { process_images(image_queue) }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def process_images(image_queue)
|
42
|
+
while !image_queue.empty?
|
43
|
+
image = image_queue.pop
|
44
|
+
convert(image) if changed?(image.url_path, image.path)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
42
48
|
def to_queue(images)
|
43
49
|
image_queue = Queue.new
|
44
|
-
Array(images).each { |image| image_queue << image }
|
50
|
+
Array(images).shuffle.each { |image| image_queue << image }
|
45
51
|
image_queue
|
46
52
|
end
|
47
53
|
|
@@ -69,7 +75,9 @@ module Photish
|
|
69
75
|
end
|
70
76
|
|
71
77
|
def change_manifest
|
72
|
-
@change_manifest ||=
|
78
|
+
@change_manifest ||= Cache::Manifest.new(output_dir,
|
79
|
+
worker_index,
|
80
|
+
version_hash)
|
73
81
|
end
|
74
82
|
end
|
75
83
|
end
|
data/lib/photish/render/site.rb
CHANGED
@@ -1,58 +1,44 @@
|
|
1
1
|
module Photish
|
2
2
|
module Render
|
3
3
|
class Site
|
4
|
-
def initialize(
|
5
|
-
@
|
6
|
-
@site_dir = site_dir
|
7
|
-
@output_dir = output_dir
|
8
|
-
@max_workers = max_workers
|
4
|
+
def initialize(config)
|
5
|
+
@config = config
|
9
6
|
end
|
10
7
|
|
11
8
|
def all_for(collection)
|
12
|
-
delete_unknown_files(collection.
|
9
|
+
delete_unknown_files(collection.all_url_parts)
|
13
10
|
move_non_ignored_site_contents
|
14
|
-
|
15
11
|
collection_template.render(collection)
|
16
|
-
album_template.render(collection.all_albums)
|
17
|
-
photo_template.render(collection.all_photos)
|
18
|
-
|
19
|
-
image_conversion.render(collection.all_images)
|
20
12
|
end
|
21
13
|
|
22
14
|
private
|
23
15
|
|
24
|
-
attr_reader :
|
25
|
-
:site_dir,
|
26
|
-
:output_dir,
|
27
|
-
:max_workers
|
16
|
+
attr_reader :config
|
28
17
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
FileUtils.rm_rf(files_to_delete)
|
35
|
-
end
|
18
|
+
delegate :templates,
|
19
|
+
:site_dir,
|
20
|
+
:output_dir,
|
21
|
+
:worker_index,
|
22
|
+
to: :config
|
36
23
|
|
37
24
|
def move_non_ignored_site_contents
|
38
25
|
FileUtils.mkdir_p(output_dir)
|
39
26
|
FileUtils.cp_r(non_ignored_site_contents, output_dir)
|
40
27
|
end
|
41
28
|
|
42
|
-
def
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
def photo_template
|
51
|
-
Photish::Render::Page.new(layout_file, template_photo_file, output_dir)
|
29
|
+
def delete_unknown_files(url_parts)
|
30
|
+
do_not_delete = Set.new(url_parts.map { |url| File.join(output_dir, url) }
|
31
|
+
.map(&:to_s))
|
32
|
+
files_to_delete = Dir["#{output_dir}/**/*"].select do |f|
|
33
|
+
File.file?(f) && !do_not_delete.include?(f)
|
34
|
+
end
|
35
|
+
FileUtils.rm_rf(files_to_delete)
|
52
36
|
end
|
53
37
|
|
54
38
|
def collection_template
|
55
|
-
|
39
|
+
Page.new(layout_file,
|
40
|
+
template_collection_file,
|
41
|
+
output_dir)
|
56
42
|
end
|
57
43
|
|
58
44
|
def non_ignored_site_contents
|
@@ -67,14 +53,6 @@ module Photish
|
|
67
53
|
File.join(site_dir, templates_dir, templates.collection)
|
68
54
|
end
|
69
55
|
|
70
|
-
def template_album_file
|
71
|
-
File.join(site_dir, templates_dir, templates.album)
|
72
|
-
end
|
73
|
-
|
74
|
-
def template_photo_file
|
75
|
-
File.join(site_dir, templates_dir, templates.photo)
|
76
|
-
end
|
77
|
-
|
78
56
|
def templates_dir
|
79
57
|
'_templates'
|
80
58
|
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Photish
|
2
|
+
module Render
|
3
|
+
class SiteWorker
|
4
|
+
def initialize(config, version_hash)
|
5
|
+
@config = config
|
6
|
+
@version_hash = version_hash
|
7
|
+
end
|
8
|
+
|
9
|
+
def all_for(collection)
|
10
|
+
tasks(collection).shuffle.each(&:call)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
attr_reader :config,
|
16
|
+
:version_hash
|
17
|
+
|
18
|
+
delegate :templates,
|
19
|
+
:site_dir,
|
20
|
+
:output_dir,
|
21
|
+
:workers,
|
22
|
+
:threads,
|
23
|
+
:worker_index,
|
24
|
+
to: :config
|
25
|
+
|
26
|
+
def tasks(collection)
|
27
|
+
[
|
28
|
+
->{ album_template.render(subset(collection.all_albums)) },
|
29
|
+
->{ photo_template.render(subset(collection.all_photos)) },
|
30
|
+
->{ image_conversion.render(subset(collection.all_images)) },
|
31
|
+
]
|
32
|
+
end
|
33
|
+
|
34
|
+
def subset(items)
|
35
|
+
worker_index_zeroed.step(items.count, workers)
|
36
|
+
.map { |i| items[i] }
|
37
|
+
.compact
|
38
|
+
end
|
39
|
+
|
40
|
+
def image_conversion
|
41
|
+
ImageConversion.new(output_dir,
|
42
|
+
worker_index,
|
43
|
+
version_hash,
|
44
|
+
threads)
|
45
|
+
end
|
46
|
+
|
47
|
+
def album_template
|
48
|
+
Page.new(layout_file,
|
49
|
+
template_album_file,
|
50
|
+
output_dir)
|
51
|
+
end
|
52
|
+
|
53
|
+
def photo_template
|
54
|
+
Page.new(layout_file,
|
55
|
+
template_photo_file,
|
56
|
+
output_dir)
|
57
|
+
end
|
58
|
+
|
59
|
+
def layout_file
|
60
|
+
File.join(site_dir, templates_dir, templates.layout)
|
61
|
+
end
|
62
|
+
|
63
|
+
def template_album_file
|
64
|
+
File.join(site_dir, templates_dir, templates.album)
|
65
|
+
end
|
66
|
+
|
67
|
+
def template_photo_file
|
68
|
+
File.join(site_dir, templates_dir, templates.photo)
|
69
|
+
end
|
70
|
+
|
71
|
+
def templates_dir
|
72
|
+
'_templates'
|
73
|
+
end
|
74
|
+
|
75
|
+
def worker_index_zeroed
|
76
|
+
worker_index - 1
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/photish/version.rb
CHANGED
data/lib/photish.rb
CHANGED
@@ -10,16 +10,20 @@ require 'webrick'
|
|
10
10
|
require 'listen'
|
11
11
|
require 'yaml'
|
12
12
|
require 'thor'
|
13
|
-
require 'filemagic'
|
14
13
|
require 'recursive_open_struct'
|
15
14
|
require 'cgi'
|
16
15
|
require 'facter'
|
16
|
+
require 'mime-types'
|
17
|
+
require 'thread'
|
18
|
+
require 'thwait'
|
19
|
+
require 'slim'
|
17
20
|
|
18
21
|
# Photish
|
19
22
|
require 'photish/plugin/type'
|
20
23
|
require 'photish/plugin/pluginable'
|
21
24
|
require 'photish/plugin/repository'
|
22
25
|
require 'photish/command/base'
|
26
|
+
require 'photish/command/worker'
|
23
27
|
require 'photish/command/generate'
|
24
28
|
require 'photish/command/host'
|
25
29
|
require 'photish/command/init'
|
@@ -43,8 +47,10 @@ require 'photish/gallery/image'
|
|
43
47
|
require 'photish/gallery/collection'
|
44
48
|
require 'photish/render/page'
|
45
49
|
require 'photish/render/site'
|
50
|
+
require 'photish/render/site_worker'
|
46
51
|
require 'photish/render/image_conversion'
|
47
|
-
require 'photish/
|
52
|
+
require 'photish/cache/manifest'
|
53
|
+
require 'photish/cache/manifest_db_file'
|
48
54
|
require 'photish/rake/task'
|
49
55
|
require 'photish/version'
|
50
56
|
|
data/photish.gemspec
CHANGED
@@ -27,13 +27,12 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_dependency "slim", "~> 3.0"
|
28
28
|
spec.add_dependency "tilt", "~> 2.0"
|
29
29
|
spec.add_dependency "mini_magick", "~> 4.3"
|
30
|
-
spec.add_dependency "ruby-filemagic", "~> 0.7"
|
31
30
|
spec.add_dependency "mini_exiftool", "~> 2.5"
|
32
31
|
spec.add_dependency "recursive-open-struct", "~> 1.0"
|
33
|
-
spec.add_dependency "nokogiri", "~> 1.6"
|
34
32
|
spec.add_dependency "logging", "~> 2.0"
|
35
33
|
spec.add_dependency "listen", "~> 3.0"
|
36
34
|
spec.add_dependency "facter", "~> 2.4"
|
35
|
+
spec.add_dependency "mime-types", "~> 3.0"
|
37
36
|
|
38
37
|
spec.add_development_dependency "anemone", "~> 0.7"
|
39
38
|
spec.add_development_dependency "bundler", "~> 1.10"
|