imagesite 1.0.0.pre

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 661a146b20c466fab9d7465057a75ceccf256a05
4
+ data.tar.gz: fb6c1ec0e6cc189288a0ca9d6bbe920d12720e07
5
+ SHA512:
6
+ metadata.gz: f2a8865a3e34cf46384d88d56f83bca30310a6831ea497a949d2ab473c3efdc81a0c4e39b5d7d77e733e89f27f5d6a24621b43d395dda497d8be2ffffe990f16
7
+ data.tar.gz: 29e0ab6de03653d3fae7e0969c4e61402900ac929a5363e1beb175eeb8887a035f2dbed6e71831619e3738cd16fbfbcaeadb30e97a98e3872d82729ad776399e
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ source 'https://rubygems.org/'
3
+
4
+ gemspec
@@ -0,0 +1,74 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ imagesite (1.0.0.pre)
5
+ erubis (>= 2.7.0)
6
+ exifr (>= 1.2.4)
7
+ image_science (>= 1.3.0)
8
+ xmp (>= 0.2.0)
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ RubyInline (3.12.4)
14
+ ZenTest (~> 4.3)
15
+ ZenTest (4.11.1)
16
+ addressable (2.4.0)
17
+ capybara (2.7.1)
18
+ addressable
19
+ mime-types (>= 1.16)
20
+ nokogiri (>= 1.3.3)
21
+ rack (>= 1.0.0)
22
+ rack-test (>= 0.5.4)
23
+ xpath (~> 2.0)
24
+ diff-lcs (1.2.5)
25
+ docile (1.1.5)
26
+ erubis (2.7.0)
27
+ exifr (1.2.4)
28
+ image_science (1.3.0)
29
+ RubyInline (~> 3.9)
30
+ json (1.8.3)
31
+ mime-types (3.1)
32
+ mime-types-data (~> 3.2015)
33
+ mime-types-data (3.2016.0521)
34
+ nokogiri (1.5.11)
35
+ rack (1.5.5)
36
+ rack-test (0.6.3)
37
+ rack (>= 1.0)
38
+ rake (0.9.6)
39
+ rspec (3.5.0)
40
+ rspec-core (~> 3.5.0)
41
+ rspec-expectations (~> 3.5.0)
42
+ rspec-mocks (~> 3.5.0)
43
+ rspec-core (3.5.2)
44
+ rspec-support (~> 3.5.0)
45
+ rspec-expectations (3.5.0)
46
+ diff-lcs (>= 1.2.0, < 2.0)
47
+ rspec-support (~> 3.5.0)
48
+ rspec-mocks (3.5.0)
49
+ diff-lcs (>= 1.2.0, < 2.0)
50
+ rspec-support (~> 3.5.0)
51
+ rspec-support (3.5.0)
52
+ simplecov (0.11.2)
53
+ docile (~> 1.1.0)
54
+ json (~> 1.8)
55
+ simplecov-html (~> 0.10.0)
56
+ simplecov-html (0.10.0)
57
+ xmp (0.2.0)
58
+ nokogiri (~> 1.5.0)
59
+ xpath (2.0.0)
60
+ nokogiri (~> 1.3)
61
+
62
+ PLATFORMS
63
+ ruby
64
+
65
+ DEPENDENCIES
66
+ bundler (>= 1.12.5)
67
+ capybara (>= 2.7.1)
68
+ imagesite!
69
+ rake (>= 0.9.6)
70
+ rspec (>= 3.5.0)
71
+ simplecov (>= 0.11.2)
72
+
73
+ BUNDLED WITH
74
+ 1.12.5
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Dave Schweisguth
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,61 @@
1
+ # imagesite
2
+
3
+ OS X's iPhoto software had a feature that exported photos to a static web site.
4
+ iPhoto was discontinued in 2015. Its replacement, Photos, does not have that
5
+ feature. imagesite approximates that feature.
6
+
7
+ imagesite HTML is similar, but not identical, to iPhoto's.
8
+ imagesite's HTML is amateurishly styled, although somewhat less so than iPhoto's.
9
+ On the bright side, imagesite's output includes an image's tags as well as
10
+ its title and description.
11
+
12
+ ## Requirements
13
+
14
+ imagesite works with Ruby 2.0.0p648, which comes with OS X 10.11 (El Capitan),
15
+ and with later versions of Ruby.
16
+ If your Mac has an older OS X, imagesite may or may not work with its built-in Ruby.
17
+ If not, you may be able to install a newer Ruby on your Mac to use with imagesite.
18
+
19
+ ## Installation
20
+
21
+ If you're using the Ruby that comes with OS X,
22
+
23
+ $ sudo gem install imagesite
24
+
25
+ If you're using a Ruby that you installed yourself, `sudo` may or may not be appropriate.
26
+
27
+ ## Usage
28
+
29
+ - Edit and annotate your images in Photos as usual.
30
+ - Export your images from Photos (select them and choose
31
+ File ▶ Export ▶ Export Photos…, or type ⇧⌘E).
32
+ - Run imagesite in Terminal:
33
+
34
+ $ imagesite -t 'Images' -o ~/Desktop/images ~/Desktop/images-export/*
35
+
36
+ Replace `'Images'` with whatever you'd like the title of the image set to be,
37
+ `~/Desktop/images` with whatever you'd like the output directory to be, and
38
+ `~/Desktop/images-export` with the directory into which you exported your
39
+ images from Photos.
40
+
41
+ imagesite puts photos in its output in the order in which they're given to it
42
+ on the command line. Unix, unlike Finder, sorts files whose names begin with
43
+ numbers (such as those created by Photos' Sequential filename export option)
44
+ in a way that requires leading zeros. You may, therefore, need to add
45
+ leading zeros to your exported image filenames for `*` to list them in the order
46
+ you want.
47
+
48
+ ### Customizing the output
49
+
50
+ Run `imagesite -h` to see more options.
51
+
52
+ imagesite's HTML is largely determined by two template files. To change them,
53
+ run the following command to see where they are
54
+
55
+ $ gem contents imagesite
56
+
57
+ and edit them to your liking.
58
+
59
+ ## License
60
+
61
+ imagesite is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../lib/image_site/image_site'
3
+
4
+ ImageSite::ImageSite.new.run
@@ -0,0 +1,29 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = 'imagesite'
3
+ spec.version = '1.0.0.pre'
4
+ spec.author = 'Dave Schweisguth'
5
+ spec.email = 'dave@schweisguth.org'
6
+
7
+ spec.summary = %q{iPhoto-style web export for Photos}
8
+ spec.description = %q{OS X's iPhoto software had a feature that exported photos to a static web site. iPhoto was discontinued in 2015. Its replacement, Photos, does not have that feature. imagesite approximates that feature.}
9
+ spec.homepage = 'https://github.com/dschweisguth/imagesite'
10
+ spec.license = 'MIT'
11
+
12
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(.gitignore|.idea/|.rspec|spec/)}) }
13
+ spec.bindir = 'bin'
14
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
15
+
16
+ spec.required_ruby_version = '~> 2.0'
17
+
18
+ spec.add_runtime_dependency 'exifr', '>= 1.2.4'
19
+ spec.add_runtime_dependency 'xmp', '>= 0.2.0'
20
+ spec.add_runtime_dependency 'image_science', '>= 1.3.0'
21
+ spec.add_runtime_dependency 'erubis', '>= 2.7.0'
22
+
23
+ spec.add_development_dependency 'bundler', '>= 1.12.5'
24
+ spec.add_development_dependency 'rake', '>= 0.9.6'
25
+ spec.add_development_dependency 'rspec', '>= 3.5.0'
26
+ spec.add_development_dependency 'capybara', '>= 2.7.1'
27
+ spec.add_development_dependency 'simplecov', '>= 0.11.2'
28
+
29
+ end
@@ -0,0 +1,90 @@
1
+ require 'fileutils'
2
+ require 'image_science'
3
+ require 'xmp'
4
+ require 'exifr'
5
+ require_relative 'model'
6
+
7
+ module ImageSite
8
+ class Image < Model
9
+ def self.all(options)
10
+ images = options.files.map.with_index(1) do |file, i|
11
+ Image.new i, file, options
12
+ end
13
+ images.each.with_index do |image, i|
14
+ if i > 0
15
+ image.previous = images[i - 1]
16
+ end
17
+ if i < images.length - 1
18
+ image.next = images[i + 1]
19
+ end
20
+ end
21
+ end
22
+
23
+ def self.template_name
24
+ 'Page.html.erb'
25
+ end
26
+ private_class_method :template_name
27
+
28
+ attr_accessor :next, :previous, :index
29
+
30
+ def initialize(number, file, options)
31
+ super number, options
32
+ @file = file
33
+ end
34
+
35
+ def write
36
+ write_scaled_image relative_image, 912
37
+ write_html image: self
38
+ end
39
+
40
+ def relative_image
41
+ "Images/#{@number}.jpeg"
42
+ end
43
+
44
+ def title
45
+ xmp && xmp.dc && xmp.dc.title && xmp.dc.title.first
46
+ end
47
+
48
+ NEWLINE = "\xE2\x80\xA8".force_encoding('ASCII-8BIT')
49
+
50
+ def description
51
+ exif && exif.image_description && exif.image_description.gsub(NEWLINE, "<br/>\n")
52
+ end
53
+
54
+ def tags
55
+ xmp && xmp.dc && xmp.dc.subject || []
56
+ end
57
+
58
+ def relative_html
59
+ "Pages/#{@number}.html"
60
+ end
61
+
62
+ def write_thumbnail
63
+ write_scaled_image relative_thumbnail, 240
64
+ end
65
+
66
+ def relative_thumbnail
67
+ "Thumbnails/#{@number}.jpeg"
68
+ end
69
+
70
+ private
71
+
72
+ def write_scaled_image(unqualified_name, size)
73
+ make_subdir File.dirname(unqualified_name)
74
+ ImageScience.with_image @file do |image|
75
+ image.thumbnail size do |thumbnail|
76
+ thumbnail.save "#{@options.output_dir}/#{unqualified_name}"
77
+ end
78
+ end
79
+ end
80
+
81
+ def xmp
82
+ @xmp ||= XMP.parse exif
83
+ end
84
+
85
+ def exif
86
+ @exif ||= EXIFR::JPEG.new @file
87
+ end
88
+
89
+ end
90
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'options'
2
+ require_relative 'index'
3
+
4
+ module ImageSite
5
+ class ImageSite
6
+ def run
7
+ options = Options.new
8
+ options.parse!
9
+ Index.write_all(options)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,48 @@
1
+ require_relative 'image'
2
+
3
+ module ImageSite
4
+ class Index < Model
5
+ def self.write_all(options)
6
+ images = Image.all options
7
+ indexes = all images, options
8
+ images.each(&:write)
9
+ indexes.each(&:write)
10
+ end
11
+
12
+ def self.all(images, options)
13
+ indexes =
14
+ images.
15
+ each_slice(options.columns * options.rows).
16
+ with_index(1).
17
+ map { |images_for_index, i| Index.new(i, images_for_index, options) }
18
+ indexes.each do |index|
19
+ index.indexes = indexes
20
+ index.images.each { |image| image.index = index }
21
+ end
22
+ end
23
+ private_class_method :all
24
+
25
+ def self.template_name
26
+ 'index.html.erb'
27
+ end
28
+ private_class_method :template_name
29
+
30
+ attr_reader :images
31
+ attr_accessor :indexes
32
+
33
+ def initialize(number, images, options)
34
+ super number, options
35
+ @images = images
36
+ end
37
+
38
+ def write
39
+ images.each(&:write_thumbnail)
40
+ write_html index: self
41
+ end
42
+
43
+ def relative_html
44
+ "index#{if @number > 1 then @number end}.html"
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,28 @@
1
+ require 'erubis'
2
+
3
+ module ImageSite
4
+ class Model
5
+ attr_reader :number
6
+
7
+ def self.template
8
+ @template ||= IO.read "template/#{template_name}"
9
+ end
10
+
11
+ def initialize(number, options)
12
+ @number = number
13
+ @options = options
14
+ end
15
+
16
+ def make_subdir(subdir)
17
+ FileUtils.mkdir_p "#{@options.output_dir}/#{subdir}"
18
+ end
19
+
20
+ def write_html(bindings)
21
+ make_subdir File.dirname(relative_html)
22
+ bindings = { options: @options }.merge bindings
23
+ page = Erubis::Eruby.new(self.class.template).result(bindings)
24
+ IO.write "#{@options.output_dir}/#{relative_html}", page
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,68 @@
1
+ require 'optparse'
2
+
3
+ module ImageSite
4
+ class Options
5
+ DEFAULT_COLUMNS = 4
6
+ DEFAULT_ROWS = 10
7
+
8
+ attr_reader :title, :columns, :rows, :parent_link_text, :output_dir, :files
9
+
10
+ def initialize
11
+ @title = nil
12
+ @columns = DEFAULT_COLUMNS
13
+ @rows = DEFAULT_ROWS
14
+ @parent_link_text = nil
15
+ @output_dir = nil
16
+ end
17
+
18
+ def parse!
19
+ parser = OptionParser.new do |op|
20
+ op.banner = "Usage: #{$0} -t TITLE -o OUTPUT_DIR [other options] file [...]"
21
+
22
+ op.on('-t TITLE', "Title of the set of images") do |title|
23
+ @title = title
24
+ end
25
+ op.on('-c COLUMNS', "The number of columns of thumbnails on each index page (default #{DEFAULT_COLUMNS})") do |columns|
26
+ @columns = columns.to_i
27
+ end
28
+ op.on('-r ROWS', "The number of rows of photos on each index page (default #{DEFAULT_ROWS})") do |rows|
29
+ @rows = rows.to_i
30
+ end
31
+ op.on('-p PARENT_LINK_TEXT', "The text of the link to ../ on the last index page") do |parent_link_text|
32
+ @parent_link_text = parent_link_text
33
+ end
34
+ op.on('-o OUTPUT_DIR', "Output directory") do |output_dir|
35
+ @output_dir = output_dir
36
+ end
37
+
38
+ # -h and --help work by default, but implement them explicitly so they're
39
+ # documented
40
+ op.on("-h", "--help", "Prints this help") do
41
+ warn op.to_s
42
+ exit
43
+ end
44
+
45
+ end
46
+ begin
47
+ parser.parse!
48
+ rescue OptionParser::ParseError
49
+ abort parser.to_s
50
+ end
51
+ if !@title
52
+ abort_with_help parser, "Please specify a title with -t."
53
+ end
54
+ if !@output_dir
55
+ abort_with_help parser, "Please specify an output directory with -o."
56
+ end
57
+ if ARGV.empty?
58
+ abort_with_help parser, "Please specify one or more image files."
59
+ end
60
+ @files = ARGV
61
+ end
62
+
63
+ def abort_with_help(parser, message)
64
+ abort "#{message}\n#{parser}"
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +1,40 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title><%= image.title %></title>
6
+ <style>
7
+ body {
8
+ background-color: white;
9
+ color: black;
10
+ }
11
+ </style>
12
+ </head>
13
+ <body>
14
+ <p>
15
+ <% if image.previous %>
16
+ <a href="<%= image.previous.number %>.html">&lt;--Previous</a>
17
+ &nbsp;&nbsp;
18
+ <% end %>
19
+ <a href="../<%= image.index.relative_html %>">Up</a>
20
+ <% if image.next %>
21
+ &nbsp;&nbsp;
22
+ <a href="<%= image.next.number %>.html">Next--&gt;</a>
23
+ <% end %>
24
+ </p>
25
+ <p><img alt="<%= image.title %>" src="../<%= image.relative_image %>"/></p>
26
+ <% if image.title %>
27
+ <h1><%= image.title %></h1>
28
+ <% end %>
29
+ <% if image.description %>
30
+ <p><%= image.description %></p>
31
+ <% end %>
32
+ <% if image.tags.any? %>
33
+ <p>
34
+ <% image.tags.each do |tag| %>
35
+ <b><%= tag %></b>&nbsp;&nbsp;&nbsp;
36
+ <% end %>
37
+ </p>
38
+ <% end %>
39
+ </body>
40
+ </html>
@@ -0,0 +1,68 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title><%= options.title %></title>
6
+ <style>
7
+ body {
8
+ background-color: white;
9
+ color: black;
10
+ }
11
+
12
+ h1 {
13
+ text-align: center;
14
+ }
15
+
16
+ table {
17
+ width: 100%;
18
+ border-spacing: 2px;
19
+ border-collapse: separate;
20
+ }
21
+
22
+ td {
23
+ text-align: center;
24
+ width: <%= 100 / options.columns %>%;
25
+ padding: 2px;
26
+ }
27
+
28
+ img {
29
+ border: 0;
30
+ vertical-align: text-top;
31
+ }
32
+
33
+ .parent-link {
34
+ text-align: center;
35
+ }
36
+ </style>
37
+ </head>
38
+ <body>
39
+ <h1><%= options.title %></h1>
40
+ <% if index.indexes.length > 1 %>
41
+ <p>
42
+ <% index.indexes.each do |other_index| %>
43
+ <% if other_index == index %>
44
+ Page <%= other_index.number %>
45
+ <% else %>
46
+ <a href="<%= other_index.relative_html %>">Page <%= other_index.number %></a>
47
+ <% end %>
48
+ <% if other_index != index.indexes.last %>|<% end %>
49
+ <% end %>
50
+ </p>
51
+ <% end %>
52
+ <table>
53
+ <% index.images.each_slice options.columns do |row| %>
54
+ <tr>
55
+ <% row.each do |image| %>
56
+ <td>
57
+ <a href="<%= image.relative_html %>"><img alt="<%= image.title %>" src="<%= image.relative_thumbnail %>"></a><br/>
58
+ <%= image.title %>
59
+ </td>
60
+ <% end %>
61
+ </tr>
62
+ <% end %>
63
+ </table>
64
+ <% if index == index.indexes.last && options.parent_link_text %>
65
+ <p class="parent-link"><a href="../"><%= options.parent_link_text %></a></p>
66
+ <% end %>
67
+ </body>
68
+ </html>
metadata ADDED
@@ -0,0 +1,186 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: imagesite
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.pre
5
+ platform: ruby
6
+ authors:
7
+ - Dave Schweisguth
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-08-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: exifr
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.2.4
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.2.4
27
+ - !ruby/object:Gem::Dependency
28
+ name: xmp
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: image_science
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.3.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.3.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: erubis
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 2.7.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: 2.7.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: 1.12.5
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: 1.12.5
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: 0.9.6
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: 0.9.6
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: 3.5.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: 3.5.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: capybara
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: 2.7.1
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: 2.7.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: simplecov
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: 0.11.2
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: 0.11.2
139
+ description: OS X's iPhoto software had a feature that exported photos to a static
140
+ web site. iPhoto was discontinued in 2015. Its replacement, Photos, does not have
141
+ that feature. imagesite approximates that feature.
142
+ email: dave@schweisguth.org
143
+ executables:
144
+ - imagesite
145
+ extensions: []
146
+ extra_rdoc_files: []
147
+ files:
148
+ - Gemfile
149
+ - Gemfile.lock
150
+ - LICENSE.txt
151
+ - README.md
152
+ - Rakefile
153
+ - bin/imagesite
154
+ - imagesite.gemspec
155
+ - lib/image_site/image.rb
156
+ - lib/image_site/image_site.rb
157
+ - lib/image_site/index.rb
158
+ - lib/image_site/model.rb
159
+ - lib/image_site/options.rb
160
+ - template/Page.html.erb
161
+ - template/index.html.erb
162
+ homepage: https://github.com/dschweisguth/imagesite
163
+ licenses:
164
+ - MIT
165
+ metadata: {}
166
+ post_install_message:
167
+ rdoc_options: []
168
+ require_paths:
169
+ - lib
170
+ required_ruby_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ~>
173
+ - !ruby/object:Gem::Version
174
+ version: '2.0'
175
+ required_rubygems_version: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - '>'
178
+ - !ruby/object:Gem::Version
179
+ version: 1.3.1
180
+ requirements: []
181
+ rubyforge_project:
182
+ rubygems_version: 2.0.14.1
183
+ signing_key:
184
+ specification_version: 4
185
+ summary: iPhoto-style web export for Photos
186
+ test_files: []