photish 0.3.3 → 0.3.4
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.
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ff58bf1d669264455034b1ea27a798ea979d2f0
|
4
|
+
data.tar.gz: 6f6bb07a9b0ecd54643b9090c27336b13c0ecb09
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea5d2478db86db55aca53b8fec1abe53c65d6714e6fa12bd6d3c8cd85b5f4d145183e184b4e9a10bf1a8b9cd0fd4650426ae4416f2862b7c54bae49953881663
|
7
|
+
data.tar.gz: b86aa902da22f12807bdef9d26b46f7df180472268e56affc1ea9b63a7ee0c2f45fd15056a64c3a049bcb9a8acf05c6c99f54e7a3c185ce801f725f7bd72dfb6
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -34,9 +34,8 @@ It is strongly recommended to read through the [Installation](#installation)
|
|
34
34
|
and [Usage](#usage) sections before seriously using Photish, however to get up
|
35
35
|
and running:
|
36
36
|
|
37
|
-
1. Ensure [ImageMagick](http://www.imagemagick.org/script/index.php)
|
38
|
-
[Exiftool](http://www.sno.phy.queensu.ca/~phil/exiftool/)
|
39
|
-
[Nokogiri](http://www.nokogiri.org/tutorials/installing_nokogiri.html) are
|
37
|
+
1. Ensure [ImageMagick](http://www.imagemagick.org/script/index.php) and
|
38
|
+
[Exiftool](http://www.sno.phy.queensu.ca/~phil/exiftool/) are
|
40
39
|
installed (see [Dependencies](#dependencies))
|
41
40
|
1. Install Photish `gem install photish`
|
42
41
|
1. Create a base project with `photish init --example`
|
@@ -63,6 +62,8 @@ and running:
|
|
63
62
|
- [Template Helpers](#template-helpers)
|
64
63
|
- [Generate](#generate)
|
65
64
|
- [Execution Order](#execution-order)
|
65
|
+
- [Workers and Threads](#workers-and-threads)
|
66
|
+
- [Caching](#caching)
|
66
67
|
- [Host](#host)
|
67
68
|
- [Rake Task](#rake-task)
|
68
69
|
- [Plugins](#plugins)
|
@@ -191,8 +192,6 @@ Photish has dependencies on certain utilities:
|
|
191
192
|
conversion
|
192
193
|
- [Exiftool](http://www.sno.phy.queensu.ca/~phil/exiftool/) for image metadata
|
193
194
|
retrieval
|
194
|
-
- [Nokogiri](http://www.nokogiri.org/tutorials/installing_nokogiri.html) for
|
195
|
-
XML writing and parsing
|
196
195
|
|
197
196
|
**On MacOSX, using [Brew](http://brew.sh/)**
|
198
197
|
|
@@ -293,6 +292,8 @@ logging:
|
|
293
292
|
url:
|
294
293
|
host: http://mydomain.com
|
295
294
|
base: 'subdirectory'
|
295
|
+
workers: 4
|
296
|
+
threads: 2
|
296
297
|
```
|
297
298
|
|
298
299
|
The meanings and purpose of each field is defined below:
|
@@ -315,6 +316,8 @@ Field | Purpose
|
|
315
316
|
`url` | a listing of the various url options
|
316
317
|
`url/host` | if you would like URLs generated with a specific host prefix, you can define it here, otherwise leave it as '/' or do not set this configuration at all
|
317
318
|
`url/base` | if your website will be hosted in a sub folder and will not be accessible at the root of the host, you can specify the sub folder(s) here, this will also mean your website will be hosted in a sub folder when ran using `photish host`
|
319
|
+
`workers` | the number of workers to create, for computers with multiple processors, photish is configured by default to spawn a worker for each process, a worker is responsible for image generation and html generation, load balancing is done randomly via a simple round robin allocation
|
320
|
+
`threads` | the number of threads each worker should create to handle image magick transcoding
|
318
321
|
|
319
322
|
#### Customizing Templates
|
320
323
|
|
@@ -468,6 +471,55 @@ The Generate command does the following:
|
|
468
471
|
1. Converts all Photo(s) to the configured quality versions, writing various
|
469
472
|
images to the `output` folder
|
470
473
|
|
474
|
+
#### Workers and Threads
|
475
|
+
|
476
|
+
In order to achieve maximum utilization of all processors on a CPU during
|
477
|
+
generation, Photish has the ability to create multiple workers and threads.
|
478
|
+
|
479
|
+
A worker is a spawned sub process created by the Generate command. The worker
|
480
|
+
sub process is responsible for generating the HTML and Images for a sub set of
|
481
|
+
the collection.
|
482
|
+
|
483
|
+
Within each worker, threads are created when calling out to the Image Magick
|
484
|
+
binary. During conversion, Image Magick often does not reach full processor
|
485
|
+
utilization so rather then block the whole worker, it can be more performant to
|
486
|
+
spawn multiple Image Magick processes at once.
|
487
|
+
|
488
|
+
For collections with a large number of images and HTML pages, multiple workers
|
489
|
+
and threads can be used to rapidly speed up generation. However if the
|
490
|
+
collection is quite small and the images are of a small size, workers and
|
491
|
+
threads will increase the generation time as loading a new ruby runtime and
|
492
|
+
creating multiple threads may have a higher setup time then just generating in
|
493
|
+
a single ruby process.
|
494
|
+
|
495
|
+
The number of workers and threads is configurable in the [config
|
496
|
+
file](#config-file-options) with the `workers` and `threads` options. By
|
497
|
+
default, Photish will spawn a worker for each processor detected on the
|
498
|
+
computer. It will then create 2 threads per worker. As each worker spawns it's
|
499
|
+
own thread, for a computer with 4 processors, 4 workers will be created, each
|
500
|
+
with 2 threads, which means in total Photish will manage 8 threads and
|
501
|
+
potentially run 8 Image Magick processes concurrently. When tweaking the number
|
502
|
+
of workers and threads it is important to consider IO bottlenecks as this will
|
503
|
+
most likely be the limiting factor in performance.
|
504
|
+
|
505
|
+
#### Caching
|
506
|
+
|
507
|
+
Photish caches the generation of images to avoid regeneration when the
|
508
|
+
Generate command is run or the generate event is triggered while hosting
|
509
|
+
a local version of Photish with the Host command.
|
510
|
+
|
511
|
+
The cache file is stored in the `output_dir` and is named `.changes.yml`.
|
512
|
+
|
513
|
+
To do a full regeneration, simple run the Generate command with the `force`
|
514
|
+
flag:
|
515
|
+
|
516
|
+
$ photish generate --force
|
517
|
+
|
518
|
+
Images are regenerated when they are modified, renamed or moved.
|
519
|
+
|
520
|
+
Changing the `qualities` option in the config file will also trigger a full
|
521
|
+
regeneration of all images.
|
522
|
+
|
471
523
|
### Host
|
472
524
|
|
473
525
|
To test and view your changes locally, the host command can be used to run a
|
@@ -521,8 +573,6 @@ called inside the template, it will render the message in bold wrapped in the
|
|
521
573
|
|
522
574
|
**site/_plugins/shout.rb**
|
523
575
|
```ruby
|
524
|
-
require 'nokogiri'
|
525
|
-
|
526
576
|
module Photish::Plugin::Shout
|
527
577
|
|
528
578
|
def self.is_for?(type)
|
data/TODO.md
CHANGED
data/exe/photish
CHANGED
@@ -1,10 +1,24 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
|
2
3
|
if ENV['COVERAGE']
|
3
4
|
require 'simplecov'
|
4
|
-
|
5
5
|
SimpleCov.command_name "photish-binary-#{Process.pid}"
|
6
6
|
SimpleCov.root(File.join(File.expand_path(File.dirname(__FILE__)), '..'))
|
7
7
|
end
|
8
8
|
|
9
|
+
if ENV['PROFILE']
|
10
|
+
require 'ruby-prof'
|
11
|
+
FileUtils.rm_rf('profile')
|
12
|
+
RubyProf.start
|
13
|
+
end
|
14
|
+
|
9
15
|
require 'photish'
|
10
16
|
Photish::CLI::Interface.start
|
17
|
+
|
18
|
+
if ENV['PROFILE']
|
19
|
+
profile_filename = "cmd-#{ARGV[0] || 'unknown'}-#{Process.pid}"
|
20
|
+
FileUtils.mkdir_p('profile')
|
21
|
+
RubyProf::MultiPrinter.new(RubyProf.stop)
|
22
|
+
.print(profile: profile_filename,
|
23
|
+
path: 'profile')
|
24
|
+
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
|
3
1
|
module Photish::Plugin::FooterLinks
|
4
2
|
|
5
3
|
def self.is_for?(type)
|
@@ -12,19 +10,16 @@ module Photish::Plugin::FooterLinks
|
|
12
10
|
end
|
13
11
|
|
14
12
|
def links_with_seperator(links, seperator)
|
15
|
-
|
16
|
-
|
17
|
-
links.
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
text = "#{link[:text]} #{seperator} "
|
22
|
-
end
|
23
|
-
|
24
|
-
doc.a(text, href: link[:url])
|
13
|
+
html = ''
|
14
|
+
links.each_with_index do |link, index|
|
15
|
+
if index == (links.count - 1)
|
16
|
+
text = link[:text]
|
17
|
+
else
|
18
|
+
text = "#{link[:text]} #{seperator} "
|
25
19
|
end
|
20
|
+
html << "<a href=\"" << link[:url] << "\">" << text << "</a>"
|
26
21
|
end
|
27
|
-
|
22
|
+
html
|
28
23
|
end
|
29
24
|
end
|
30
25
|
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
|
3
1
|
module Photish::Plugin::YellLoud
|
4
2
|
|
5
3
|
def self.is_for?(type)
|
@@ -12,11 +10,7 @@ module Photish::Plugin::YellLoud
|
|
12
10
|
end
|
13
11
|
|
14
12
|
def yell_very_loud
|
15
|
-
|
16
|
-
|
17
|
-
doc.span("Yelling \"#{name}\" from a plugin!",
|
18
|
-
style: 'font-weight:bold;color:red;font-size:200%;')
|
19
|
-
end
|
20
|
-
doc.to_html
|
13
|
+
text = "Yelling \"#{name}\" from a plugin!"
|
14
|
+
"<span style=\"font-weight:bold;color:red;font-size:200%;\">#{text}</span>"
|
21
15
|
end
|
22
16
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Photish
|
2
|
+
module Cache
|
3
|
+
class Manifest
|
4
|
+
def initialize(output_dir, worker_index, version_hash)
|
5
|
+
@output_dir = output_dir
|
6
|
+
@worker_index = worker_index
|
7
|
+
@version_hash = version_hash
|
8
|
+
@cache = {}
|
9
|
+
@worker_db = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def record(key, file_path = nil)
|
13
|
+
checksum = checksum_of_file(file_path || key)
|
14
|
+
worker_db[key] = checksum
|
15
|
+
db[key] = checksum
|
16
|
+
end
|
17
|
+
|
18
|
+
def changed?(key, file_path = nil)
|
19
|
+
checksum = checksum_of_file(file_path || key)
|
20
|
+
worker_db[key] = checksum
|
21
|
+
checksum != db[key]
|
22
|
+
end
|
23
|
+
|
24
|
+
def flush_to_disk
|
25
|
+
File.open(worker_db_file, 'w') { |f| f.write(worker_db.to_yaml) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def preload
|
29
|
+
db
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
attr_reader :output_dir,
|
35
|
+
:cache,
|
36
|
+
:version_hash,
|
37
|
+
:worker_index,
|
38
|
+
:worker_db
|
39
|
+
|
40
|
+
def checksum_of_file(file_path)
|
41
|
+
cache.fetch(file_path.hash) do |key|
|
42
|
+
cache[key] = version_hash.to_s +
|
43
|
+
Digest::MD5.file(file_path).hexdigest
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def db
|
48
|
+
return @db if @db
|
49
|
+
@db = File.exist?(db_file) ? YAML.load_file(db_file) : {}
|
50
|
+
end
|
51
|
+
|
52
|
+
def db_file
|
53
|
+
ManifestDbFile.db_file(output_dir)
|
54
|
+
end
|
55
|
+
|
56
|
+
def worker_db_file
|
57
|
+
ManifestDbFile.worker_db_file(output_dir, worker_index)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Photish
|
2
|
+
module Cache
|
3
|
+
module ManifestDbFile
|
4
|
+
def concat_db_files(output_dir, workers)
|
5
|
+
changes = (1..workers).inject({}) do |accumulator, worker_index|
|
6
|
+
file = worker_db_file(output_dir, worker_index)
|
7
|
+
accumulator.merge!(YAML.load_file(file)) if File.exist?(file)
|
8
|
+
accumulator
|
9
|
+
end
|
10
|
+
File.open(db_file(output_dir), 'w') { |f| f.write(changes.to_yaml) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def db_file(output_dir)
|
14
|
+
FileUtils.mkdir_p(output_dir)
|
15
|
+
File.join(output_dir, '.changes.yml')
|
16
|
+
end
|
17
|
+
|
18
|
+
def worker_db_file(output_dir, index)
|
19
|
+
FileUtils.mkdir_p(output_dir)
|
20
|
+
File.join(output_dir, ".changes.#{index}.yml")
|
21
|
+
end
|
22
|
+
|
23
|
+
module_function :concat_db_files,
|
24
|
+
:db_file,
|
25
|
+
:worker_db_file
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -4,10 +4,17 @@ module Photish
|
|
4
4
|
package_name "Photish"
|
5
5
|
|
6
6
|
desc "generate", "Generates the gallery static site"
|
7
|
+
option :worker_index, type: :numeric
|
7
8
|
def generate
|
8
9
|
Photish::Command::Generate.new(options).execute
|
9
10
|
end
|
10
11
|
|
12
|
+
desc "worker", "A worker process that helps the generate command"
|
13
|
+
option :worker_index, type: :numeric
|
14
|
+
def worker
|
15
|
+
Photish::Command::Worker.new(options).execute
|
16
|
+
end
|
17
|
+
|
11
18
|
desc "host", "Serves the HTML on a HTTP server"
|
12
19
|
def host
|
13
20
|
Photish::Command::Host.new(options).execute
|
data/lib/photish/command/base.rb
CHANGED
@@ -21,15 +21,18 @@ module Photish
|
|
21
21
|
attr_reader :runtime_config,
|
22
22
|
:log
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
24
|
+
delegate :config,
|
25
|
+
:version_hash,
|
26
|
+
to: :app_settings
|
28
27
|
|
29
28
|
private
|
30
29
|
|
30
|
+
def app_settings
|
31
|
+
@app_settings ||= Config::AppSettings.new(runtime_config)
|
32
|
+
end
|
33
|
+
|
31
34
|
def setup_logging
|
32
|
-
|
35
|
+
Log::Logger.instance.setup_logging(config)
|
33
36
|
end
|
34
37
|
end
|
35
38
|
end
|
@@ -23,7 +23,7 @@ module Photish
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def load_all_plugins
|
26
|
-
|
26
|
+
Plugin::Repository.reload(log, site_dir)
|
27
27
|
end
|
28
28
|
|
29
29
|
def engine_class
|
@@ -33,11 +33,11 @@ module Photish
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def deploy_plugins
|
36
|
-
|
36
|
+
Plugin::Repository.plugins_for(deploy_plugin_type)
|
37
37
|
end
|
38
38
|
|
39
39
|
def deploy_plugin_type
|
40
|
-
|
40
|
+
Plugin::Type::Deploy
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
@@ -2,32 +2,57 @@ module Photish
|
|
2
2
|
module Command
|
3
3
|
class Generate < Base
|
4
4
|
def run
|
5
|
+
log.info "Starting generation with #{workers} workers"
|
6
|
+
|
7
|
+
spawn_all_workers
|
5
8
|
load_all_plugins
|
6
|
-
|
7
|
-
|
9
|
+
wait_for_workers_to_complete
|
10
|
+
concat_db_files
|
11
|
+
perform_serial_generation
|
12
|
+
|
13
|
+
log.info "Generation completed successfully"
|
8
14
|
end
|
9
15
|
|
10
16
|
private
|
11
17
|
|
12
18
|
delegate :output_dir,
|
13
|
-
:site_dir,
|
14
19
|
:photo_dir,
|
15
|
-
:qualities,
|
16
|
-
:templates,
|
17
20
|
:url,
|
18
|
-
:
|
21
|
+
:site_dir,
|
22
|
+
:qualities,
|
23
|
+
:photish_executable,
|
24
|
+
:workers,
|
19
25
|
to: :config
|
20
26
|
|
21
27
|
def load_all_plugins
|
22
|
-
|
28
|
+
Plugin::Repository.reload(log, site_dir)
|
29
|
+
end
|
30
|
+
|
31
|
+
def spawn_all_workers
|
32
|
+
return single_worker if one_worker?
|
33
|
+
@spawned_processes ||= (1..workers).map do |index|
|
34
|
+
Process.spawn(ENV, worker_command(index))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def wait_for_workers_to_complete
|
39
|
+
return if one_worker?
|
40
|
+
@spawned_processes.map do |pid|
|
41
|
+
Process.waitpid(pid)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def one_worker?
|
46
|
+
workers == 1
|
47
|
+
end
|
48
|
+
|
49
|
+
def single_worker
|
50
|
+
Worker.new(runtime_config.merge(worker_index: 1)).execute
|
23
51
|
end
|
24
52
|
|
25
|
-
def
|
26
|
-
|
27
|
-
|
28
|
-
output_dir,
|
29
|
-
max_workers)
|
30
|
-
.all_for(collection)
|
53
|
+
def perform_serial_generation
|
54
|
+
Render::Site.new(config)
|
55
|
+
.all_for(collection)
|
31
56
|
end
|
32
57
|
|
33
58
|
def collection
|
@@ -39,6 +64,16 @@ module Photish
|
|
39
64
|
def qualities_mapped
|
40
65
|
qualities.map { |quality| OpenStruct.new(quality) }
|
41
66
|
end
|
67
|
+
|
68
|
+
def worker_command(worker_index)
|
69
|
+
[photish_executable,
|
70
|
+
'worker',
|
71
|
+
"--worker_index=#{worker_index}"].join(' ')
|
72
|
+
end
|
73
|
+
|
74
|
+
def concat_db_files
|
75
|
+
Cache::ManifestDbFile.concat_db_files(output_dir, workers)
|
76
|
+
end
|
42
77
|
end
|
43
78
|
end
|
44
79
|
end
|
data/lib/photish/command/host.rb
CHANGED
@@ -8,6 +8,7 @@ module Photish
|
|
8
8
|
log.info "Monitoring paths #{paths_to_monitor}"
|
9
9
|
|
10
10
|
regenerate_entire_site
|
11
|
+
regenerate_thread
|
11
12
|
start_http_server_with_listener
|
12
13
|
end
|
13
14
|
|
@@ -17,14 +18,27 @@ module Photish
|
|
17
18
|
:output_dir,
|
18
19
|
:site_dir,
|
19
20
|
:photo_dir,
|
21
|
+
:config_file_location,
|
20
22
|
to: :config
|
21
23
|
|
22
24
|
def start_http_server_with_listener
|
23
25
|
trap 'INT' do server.shutdown end
|
24
26
|
listener.start
|
25
27
|
server.start
|
26
|
-
listener.stop
|
27
28
|
log.info "Photish host has shutdown"
|
29
|
+
ensure
|
30
|
+
regenerate_thread.exit if @regenerate_thread
|
31
|
+
listener.stop if @listener
|
32
|
+
end
|
33
|
+
|
34
|
+
def regenerate_thread
|
35
|
+
@regenerate_thread ||= Thread.new do
|
36
|
+
loop do
|
37
|
+
queue.pop
|
38
|
+
queue.clear
|
39
|
+
regenerate_entire_site
|
40
|
+
end
|
41
|
+
end
|
28
42
|
end
|
29
43
|
|
30
44
|
def server
|
@@ -39,8 +53,7 @@ module Photish
|
|
39
53
|
log.info "File was modified #{modified}" if modified.present?
|
40
54
|
log.info "File was added #{added}" if added.present?
|
41
55
|
log.info "File was removed #{removed}" if removed.present?
|
42
|
-
|
43
|
-
regenerate_entire_site
|
56
|
+
queue.push(modified || added || removed)
|
44
57
|
end
|
45
58
|
end
|
46
59
|
|
@@ -61,6 +74,10 @@ module Photish
|
|
61
74
|
Photish::Command::Generate.new(runtime_config)
|
62
75
|
.execute
|
63
76
|
end
|
77
|
+
|
78
|
+
def queue
|
79
|
+
@queue ||= Queue.new
|
80
|
+
end
|
64
81
|
end
|
65
82
|
end
|
66
83
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Photish
|
2
|
+
module Command
|
3
|
+
class Worker < Base
|
4
|
+
def run
|
5
|
+
log.info "Worker ##{worker_index} starting"
|
6
|
+
|
7
|
+
load_all_plugins
|
8
|
+
render_whole_site
|
9
|
+
|
10
|
+
log.info "Site generation completed, by Worker ##{worker_index}"
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
delegate :site_dir,
|
16
|
+
:photo_dir,
|
17
|
+
:output_dir,
|
18
|
+
:qualities,
|
19
|
+
:url,
|
20
|
+
:worker_index,
|
21
|
+
to: :config
|
22
|
+
|
23
|
+
def load_all_plugins
|
24
|
+
return if Plugin::Repository.loaded?
|
25
|
+
Plugin::Repository.reload(log, site_dir)
|
26
|
+
end
|
27
|
+
|
28
|
+
def render_whole_site
|
29
|
+
Render::SiteWorker.new(config, version_hash)
|
30
|
+
.all_for(collection)
|
31
|
+
end
|
32
|
+
|
33
|
+
def collection
|
34
|
+
@collection ||= Gallery::Collection.new(photo_dir,
|
35
|
+
qualities_mapped,
|
36
|
+
url)
|
37
|
+
end
|
38
|
+
|
39
|
+
def qualities_mapped
|
40
|
+
qualities.map { |quality| OpenStruct.new(quality) }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -9,6 +9,10 @@ module Photish
|
|
9
9
|
@config ||= RecursiveOpenStruct.new(prioritized_config)
|
10
10
|
end
|
11
11
|
|
12
|
+
def version_hash
|
13
|
+
@version_hash ||= Digest::MD5.hexdigest(sensitive_config.to_json)
|
14
|
+
end
|
15
|
+
|
12
16
|
private
|
13
17
|
|
14
18
|
attr_reader :runtime_config
|
@@ -17,10 +21,21 @@ module Photish
|
|
17
21
|
{}.merge(default_config)
|
18
22
|
.merge(file_config)
|
19
23
|
.merge(runtime_config)
|
24
|
+
.merge(derived_config)
|
25
|
+
end
|
26
|
+
|
27
|
+
def sensitive_config
|
28
|
+
prioritized_config.slice('qualities')
|
29
|
+
end
|
30
|
+
|
31
|
+
def derived_config
|
32
|
+
{
|
33
|
+
config_file_location: config_file_location
|
34
|
+
}
|
20
35
|
end
|
21
36
|
|
22
37
|
def file_config
|
23
|
-
symbolize(FileConfig.new(
|
38
|
+
symbolize(FileConfig.new(config_file_location)
|
24
39
|
.hash)
|
25
40
|
end
|
26
41
|
|
@@ -28,9 +43,9 @@ module Photish
|
|
28
43
|
symbolize(DefaultConfig.new.hash)
|
29
44
|
end
|
30
45
|
|
31
|
-
def
|
32
|
-
FileConfigLocation.new(runtime_config[:
|
33
|
-
|
46
|
+
def config_file_location
|
47
|
+
FileConfigLocation.new(runtime_config[:config_dir])
|
48
|
+
.path
|
34
49
|
end
|
35
50
|
|
36
51
|
def symbolize(hash)
|
@@ -7,7 +7,10 @@ module Photish
|
|
7
7
|
site_dir: File.join(Dir.pwd, 'site'),
|
8
8
|
photo_dir: File.join(Dir.pwd, 'photos'),
|
9
9
|
output_dir: File.join(Dir.pwd, 'output'),
|
10
|
-
|
10
|
+
workers: workers,
|
11
|
+
threads: threads,
|
12
|
+
worker_index: 0,
|
13
|
+
photish_executable: photish_executable,
|
11
14
|
qualities: [
|
12
15
|
{ name: 'Original',
|
13
16
|
params: [] },
|
@@ -26,11 +29,34 @@ module Photish
|
|
26
29
|
level: 'info'
|
27
30
|
},
|
28
31
|
url: {
|
29
|
-
host: '
|
32
|
+
host: '',
|
30
33
|
base: nil
|
31
34
|
}
|
32
35
|
}
|
33
36
|
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def workers
|
41
|
+
processor_count / 2
|
42
|
+
end
|
43
|
+
|
44
|
+
def threads
|
45
|
+
2
|
46
|
+
end
|
47
|
+
|
48
|
+
def processor_count
|
49
|
+
Facter.value('processors')['count']
|
50
|
+
end
|
51
|
+
|
52
|
+
def photish_executable
|
53
|
+
File.join(File.dirname(__FILE__),
|
54
|
+
'..',
|
55
|
+
'..',
|
56
|
+
'..',
|
57
|
+
'exe',
|
58
|
+
'photish')
|
59
|
+
end
|
34
60
|
end
|
35
61
|
end
|
36
62
|
end
|