middleman-portfolio 1.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 78258eb595b3e291a9a00adcdc5fe2a0d66f2983
4
+ data.tar.gz: fd7a671381e7f53b89e7b41f3951a1db40334af1
5
+ SHA512:
6
+ metadata.gz: 3149c6d803dcf84a72ececbd0fc43f8140b938253e15a76c8698ae95cdfe07f32cb7c741af5b64d0408004db7780a794cfea82f422d244ff623f926b13a12b48
7
+ data.tar.gz: 815438f24e1d84ff4411ba17c265c4ccdbce5b21607c3e4b5c73602413485d2b1f062f833c0f2f1c9dec8ba892a6ef3b6727e27699c972ed4d92e05cbd7c10b4
data/Gemfile ADDED
@@ -0,0 +1,19 @@
1
+ # If you do not have OpenSSL installed, update
2
+ # the following line to use "http://" instead
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'mini_magick', '~> 4.2.10'
6
+
7
+ group :development do
8
+ gem 'rake'
9
+ gem 'rdoc'
10
+ gem 'yard'
11
+ gem 'jeweler'
12
+ end
13
+
14
+ group :test do
15
+ gem 'cucumber'
16
+ gem 'fivemat'
17
+ gem 'aruba'
18
+ gem 'rspec'
19
+ end
data/README.md ADDED
@@ -0,0 +1,95 @@
1
+ # middleman-portfolio
2
+
3
+ A low-drama portfolio generator for your [middleman](https://github.com/middleman/middleman) site. Place images in `source/portfolio/[project]/`, and build. That's it.
4
+
5
+ ![Screenshot](https://raw.githubusercontent.com/dhulihan/middleman-portfolio/master/screenshot.jpg)
6
+
7
+ ## Setup
8
+
9
+ Add this to `Gemfile`
10
+
11
+ ```rb
12
+ gem "middleman-portfolio"
13
+ ```
14
+
15
+ and
16
+
17
+ ```sh
18
+ bundle install
19
+ ```
20
+
21
+ Add to `config.rb`
22
+
23
+ ```rb
24
+ activate :portfolio
25
+ ```
26
+
27
+ Add projects to portfolio dir
28
+
29
+ ```sh
30
+ cp -r project-a/ source/portfolio/
31
+ cp -r project-b/ source/portfolio/
32
+ ```
33
+
34
+ Run `middleman server`
35
+
36
+ * [`http://localhost:4567/portfolio`](http://localhost:4567/portfolio) (if you're using `directory_indexes`)
37
+
38
+ * [`http://localhost:4567/portfolio/index.html`](http://localhost:4567/portfolio/index.html) (vanilla middleman)
39
+
40
+ or `middleman build` if you're ready to roll.
41
+
42
+
43
+ ## Configuration (optional)
44
+
45
+ ```rb
46
+ activate :portfolio do |f|
47
+ # Looks in source/portfolio/ for projects and builds to build/portfolio/
48
+ f.portfolio_dir = 'portfolio'
49
+
50
+ # thumbnail width (px)
51
+ f.thumbnail_width = 200
52
+
53
+ # thumbnail height (px)
54
+ f.thumbnail_height = 150
55
+
56
+ # class added to thumbnail <img> tag
57
+ f.thumbnail_class, "thumbnail"
58
+
59
+ # class added to thumbnail <a> tag
60
+ f.thumbnail_link_class ""
61
+
62
+ # override default portfolio template (must be located in source/)
63
+ f.portfolio_template "portfolio.html.erb"
64
+
65
+ # override default project template (also must be in source/)
66
+ f.project_template "project.html.erb"
67
+ end
68
+ ```
69
+
70
+ ### Custom Templates
71
+
72
+ You can create your own custom portfolio and project template pages by using the `portfolio_template` or `project_tamplate` options (see above).
73
+
74
+ Place your template anywhere in your `source/` dir. Take a look at the default [portfolio](https://github.com/dhulihan/middleman-portfolio/blob/master/lib/template/source/portfolio.html.erb) or [project](https://github.com/dhulihan/middleman-portfolio/blob/master/lib/template/source/project.html.erb) template for a good starting point. Here's an example portfolio page:
75
+
76
+ ```erb
77
+ <!-- source/portfolio.html.erb -->
78
+ <% for project in project_resources %>
79
+ <% link_to project.path, class: "thumbnail" do %>
80
+ <%= image_tag project.metadata[:locals][:thumbnail_resources].first.path %>
81
+ <% end %>
82
+ <% end %>
83
+ ```
84
+
85
+ ## Additional Notes
86
+
87
+ * You can mix and match image types (`.jpg`, `.png`, `.gif`)
88
+ * [minimagick](https://github.com/minimagick/minimagick) is used for thumbnail generation. Make sure imagemagick is installed on your machine.
89
+
90
+
91
+ ## TODO
92
+
93
+ * Page content from `data/`
94
+ * Non-project images (stored directly in portfolio/)
95
+ * FileWatcher monitor for new images
data/Rakefile ADDED
@@ -0,0 +1,56 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ task default: :test
6
+ # encoding: utf-8
7
+
8
+ begin
9
+ Bundler.setup(:default, :development)
10
+ rescue Bundler::BundlerError => e
11
+ $stderr.puts e.message
12
+ $stderr.puts "Run `bundle install` to install missing gems"
13
+ exit e.status_code
14
+ end
15
+ require 'rake'
16
+
17
+ require 'jeweler'
18
+
19
+ Jeweler::Tasks.new do |gem|
20
+ # gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
21
+ gem.name = "middleman-portfolio"
22
+ gem.homepage = "http://github.com/dhulihan/middleman-portfolio"
23
+ gem.license = "MIT"
24
+ gem.summary = %Q{A low-drama portfolio generator for your middleman site.}
25
+ gem.description = %Q{A low-drama portfolio generator for your middleman site.}
26
+ gem.email = "dhulihan@gmail.com"
27
+ gem.authors = ["Dave Hulihan"]
28
+ # dependencies defined in Gemfile
29
+ end
30
+
31
+ Jeweler::RubygemsDotOrgTasks.new
32
+
33
+ require 'rake/testtask'
34
+ Rake::TestTask.new(:test) do |test|
35
+ test.libs << 'lib' << 'test'
36
+ test.pattern = 'test/**/test_*.rb'
37
+ test.verbose = true
38
+ end
39
+
40
+ desc "Code coverage detail"
41
+ task :simplecov do
42
+ ENV['COVERAGE'] = "true"
43
+ Rake::Task['test'].execute
44
+ end
45
+
46
+ task :default => :test
47
+
48
+ require 'rdoc/task'
49
+ Rake::RDocTask.new do |rdoc|
50
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
51
+
52
+ rdoc.rdoc_dir = 'rdoc'
53
+ rdoc.title = "middleman-portfolio #{version}"
54
+ rdoc.rdoc_files.include('README*')
55
+ rdoc.rdoc_files.include('lib/**/*.rb')
56
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -0,0 +1,4 @@
1
+ PROJECT_ROOT_PATH = File.dirname(File.dirname(File.dirname(__FILE__)))
2
+ require 'middleman-core'
3
+ require 'middleman-core/step_definitions'
4
+ require File.join(PROJECT_ROOT_PATH, 'lib', 'middleman-portfolio')
@@ -0,0 +1,252 @@
1
+ class Portfolio < ::Middleman::Extension
2
+ TEMPLATES_DIR = File.expand_path('../template/source/', __FILE__)
3
+
4
+ option :portfolio_dir, 'portfolio', 'Default portfolio directory inside your source'
5
+ option :generate_thumbnails, true, 'Do you want thumbnails?'
6
+ option :thumbnail_width, 200, "Width (in px) for thumbnails"
7
+ option :thumbnail_height, 150, "Height (in px) for thumbnails"
8
+ option :thumbnail_class, "thumbnail", "class for thumbnail <img>"
9
+ option :thumbnail_link_class, "", "class for thumbnail <a> "
10
+ option :portfolio_template, nil, "path to portfolio index page template"
11
+ option :project_template, nil, "path to portfolio project page template"
12
+
13
+ attr_accessor :sitemap
14
+ #alias :included :registered
15
+
16
+ class << self
17
+ def cleanup
18
+ # Delete tmp files
19
+ tmp_files = Dir.glob(File.join(tmp_dir, "*")).select {|f| File.file?(f)}
20
+ tmp_files.each {|f|
21
+ File.delete(f)
22
+ debug "#{f} not deleted" if File.exist?(f)
23
+ }
24
+ Dir.rmdir(tmp_dir)
25
+ end
26
+
27
+ # path to temp dir for storing intermediate files
28
+ def tmp_dir
29
+ File.join(Dir.tmpdir, "middleman-portfolio")
30
+ end
31
+ end
32
+
33
+ def initialize(app, options_hash={}, &block)
34
+ # Call super to build options from the options_hash
35
+ super
36
+
37
+ # Create tmp dir
38
+ Dir.mkdir(Portfolio.tmp_dir) unless Dir.exist?(Portfolio.tmp_dir)
39
+
40
+ # set up your extension
41
+ app.after_build do
42
+ Portfolio.cleanup
43
+ end
44
+ end
45
+
46
+ def after_configuration
47
+ register_extension_templates
48
+ end
49
+
50
+ # generate thumbnail OUTSIDE of build dir
51
+ def generate_thumbnail(image)
52
+ debug "Generating thumbnail of #{image}"
53
+ dst = File.join(Portfolio.tmp_dir, thumbnail_name(image))
54
+ if !File.exist?(dst)
55
+ img = ::MiniMagick::Image.open(image)
56
+ #img.resize "#{options.thumbnail_width}x#{options.thumbnail_height}"
57
+ img = resize_to_fill(img, options.thumbnail_width, options.thumbnail_height)
58
+ img.write(dst)
59
+ raise "Thumbnail not generated at #{dst}" unless File.exist?(dst)
60
+ else
61
+ debug "#{dst} already exists"
62
+ end
63
+ return dst
64
+ end
65
+
66
+ # Resize to fill target dims. Crop any excess. Will upscale.
67
+ def resize_to_fill(img, width, height, gravity = 'Center')
68
+ cols, rows = img[:dimensions]
69
+ img.combine_options do |cmd|
70
+ if width != cols || height != rows
71
+ scale_x = width/cols.to_f
72
+ scale_y = height/rows.to_f
73
+ if scale_x >= scale_y
74
+ cols = (scale_x * (cols + 0.5)).round
75
+ rows = (scale_x * (rows + 0.5)).round
76
+ cmd.resize "#{cols}"
77
+ else
78
+ cols = (scale_y * (cols + 0.5)).round
79
+ rows = (scale_y * (rows + 0.5)).round
80
+ cmd.resize "x#{rows}"
81
+ end
82
+ end
83
+ cmd.gravity gravity
84
+ cmd.background "rgba(255,255,255,0.0)"
85
+ cmd.extent "#{width}x#{height}" if cols != width || rows != height
86
+ end
87
+ img = yield(img) if block_given?
88
+ img
89
+ end
90
+
91
+ def register_extension_templates
92
+ # We call reload_path to register the templates directory with Middleman.
93
+ # The path given to app.files must be relative to the Middleman site's root.
94
+ templates_dir_relative_from_root = Pathname(TEMPLATES_DIR).relative_path_from(Pathname(app.root))
95
+ app.files.reload_path(templates_dir_relative_from_root)
96
+ end
97
+
98
+ def template(path)
99
+ full_path = File.join(TEMPLATES_DIR, path)
100
+ raise "Template #{full_path} not found" if !File.exist?(full_path)
101
+ full_path
102
+ end
103
+
104
+ def manipulate_resource_list(resources)
105
+ # Load in reverse order for easier building
106
+ proj_resources = projects.collect {|project|
107
+ thumbs = project_thumbnail_resources(project)
108
+ resources += thumbs
109
+ project_resource(project, thumbs)
110
+ }
111
+
112
+ # Add project resources to main array
113
+ resources += proj_resources
114
+ # resources += project_thumbnail_resources(project)
115
+ resources << portfolio_index_resource(proj_resources)
116
+ return resources
117
+ end
118
+
119
+ # get abs path to portfolio dir
120
+ def portfolio_path
121
+ File.join(app.source_dir, options.portfolio_dir)
122
+ end
123
+
124
+ def portfolio_index_path
125
+ "#{options.portfolio_dir}.html"
126
+ end
127
+
128
+ def portfolio_index_resource(project_resources)
129
+ Middleman::Sitemap::Resource.new(app.sitemap, portfolio_index_path, source_file(:portfolio)).tap do |resource|
130
+ resource.add_metadata(
131
+ # options: { layout: false },
132
+ locals: {
133
+ projects: projects,
134
+ options: options,
135
+ project_resources: project_resources
136
+ }
137
+ )
138
+ end
139
+ end
140
+
141
+ # get absolute path to project directory, eg: /path/to/site/portfolio/example-project/
142
+ def project_dir(project)
143
+ File.join(portfolio_path, project)
144
+ end
145
+
146
+ # array of images for a project
147
+ def project_images(project)
148
+ Dir.glob(File.join(project_dir(project), '*'))
149
+ end
150
+
151
+ # project_resource_path("/path/to/image.png") => "portfolio/project/image.png"
152
+ def project_image_resource_path(project, image)
153
+ File.join(options.portfolio_dir, project, File.basename(image))
154
+ end
155
+
156
+ # Get all projects located in options.portfolio_dir
157
+ def project_dirs
158
+ #debug "Looking in #{options.portfolio_dir} for project subdirectories"
159
+ Dir.glob(File.join(portfolio_path, '*')).select {|f| File.directory? f}
160
+ end
161
+
162
+ def projects
163
+ # Look for project directories
164
+ projects = project_dirs.collect {|d| File.basename(d) }
165
+ end
166
+
167
+ # portfolio/example-project.html
168
+ def project_resource_path(project)
169
+ File.join(options.portfolio_dir, "#{project}.html")
170
+ end
171
+
172
+ def project_resource(project, thumbnail_resources)
173
+
174
+ Middleman::Sitemap::Resource.new(app.sitemap, project_resource_path(project), source_file(:project)).tap do |resource|
175
+ resource.add_metadata(
176
+ locals: {
177
+ name: project,
178
+ options: options,
179
+ thumbnail_resources: thumbnail_resources,
180
+ }
181
+ )
182
+ end
183
+ end
184
+
185
+ # create a resource for each portfolio project
186
+ def project_resources(thumbnail_resources)
187
+ projects.collect {|project| project_resource(project, thumbnail_resources)}
188
+ end
189
+
190
+ # generate thumbnail and resource for an image in a project
191
+ def project_thumbnail_resource(project, image)
192
+ debug "Generating thumbnail of #{project}/#{image}"
193
+ tmp_image = generate_thumbnail(image)
194
+
195
+ # Add image to sitemap
196
+ path = project_thumbnail_resource_path(project, File.basename(tmp_image))
197
+ debug "Adding #{path} to #{project}"
198
+ Middleman::Sitemap::Resource.new(app.sitemap, path, tmp_image).tap do |resource|
199
+ resource.add_metadata(
200
+ locals: {
201
+ project: project,
202
+ image: File.basename(image)
203
+ }
204
+ )
205
+ end
206
+ end
207
+
208
+ # generate thumbnail resource for each image in project dir
209
+ def project_thumbnail_resources(project)
210
+ resources = Array.new
211
+ for image in project_images(project)
212
+ resources << project_thumbnail_resource(project, image)
213
+ end
214
+
215
+ return resources
216
+ end
217
+
218
+ # Generate resource path to project thumbnail, eg: "portfolio/example-project/1-thumbnail.jpg"
219
+ def project_thumbnail_resource_path(project, thumbnail)
220
+ File.join(options.portfolio_dir, project, thumbnail)
221
+ end
222
+
223
+ # get path to source file for page, use default if not set, freak out if missing
224
+ def source_file(page)
225
+ # Load custom template or default
226
+ opt = options.send("#{page}_template")
227
+
228
+ if opt
229
+ path = File.join(app.source_dir, opt)
230
+ raise "#{path} doesn't exist" unless File.exist?(path)
231
+ return path
232
+ else
233
+ return template("#{page}.html.erb")
234
+ end
235
+ end
236
+
237
+ # thumbnail_name("1.jpg") => "1-200x150.jpg"
238
+ def thumbnail_name(image)
239
+ name = "#{File.basename(image, '.*')}-#{options.thumbnail_width}x#{options.thumbnail_height}#{File.extname(image)}"
240
+ name.gsub!(/ /, "-")
241
+ return name
242
+ end
243
+
244
+ def debug(str)
245
+ #puts str
246
+ end
247
+
248
+ helpers do
249
+ end
250
+ end
251
+
252
+ ::Middleman::Extensions.register(:portfolio, Portfolio)
@@ -0,0 +1 @@
1
+ require 'middleman-portfolio'
@@ -0,0 +1,9 @@
1
+ <% for project in project_resources %>
2
+ <% if project.metadata[:locals][:thumbnail_resources] %>
3
+ <% link_to project.path, title: project.metadata[:locals][:name], class: "#{options.thumbnail_link_class}" do %>
4
+ <%= image_tag project.metadata[:locals][:thumbnail_resources].first.path, class: "#{options.thumbnail_class}" %>
5
+ <% end %>
6
+ <% else %>
7
+ <!-- No thumbnails found for <%= project.metadata[:locals][:name] %> -->
8
+ <% end %>
9
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <% for thumb in thumbnail_resources %>
2
+ <% link_to thumb.metadata[:locals][:image], class: "#{options.thumbnail_link_class}" do %>
3
+ <%= image_tag thumb.path, class: "#{options.thumbnail_class}" %>
4
+ <% end %>
5
+ <% end %>
@@ -0,0 +1,65 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+ # stub: middleman-portfolio 1.0.0 ruby lib
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "middleman-portfolio"
9
+ s.version = "1.0.0"
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib"]
13
+ s.authors = ["Dave Hulihan"]
14
+ s.date = "2015-08-14"
15
+ s.description = "A low-drama portfolio generator for your middleman site."
16
+ s.email = "dhulihan@gmail.com"
17
+ s.extra_rdoc_files = [
18
+ "README.md"
19
+ ]
20
+ s.files = [
21
+ "Gemfile",
22
+ "README.md",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "features/support/env.rb",
26
+ "lib/middleman-portfolio.rb",
27
+ "lib/middleman_extension.rb",
28
+ "lib/template/source/portfolio.html.erb",
29
+ "lib/template/source/project.html.erb",
30
+ "middleman-portfolio.gemspec",
31
+ "screenshot.jpg"
32
+ ]
33
+ s.homepage = "http://github.com/dhulihan/middleman-portfolio"
34
+ s.licenses = ["MIT"]
35
+ s.rubygems_version = "2.4.5"
36
+ s.summary = "A low-drama portfolio generator for your middleman site."
37
+
38
+ if s.respond_to? :specification_version then
39
+ s.specification_version = 4
40
+
41
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
42
+ s.add_runtime_dependency(%q<middleman-portfolio>, [">= 0"])
43
+ s.add_runtime_dependency(%q<mini_magick>, [">= 0"])
44
+ s.add_development_dependency(%q<rake>, [">= 0"])
45
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
46
+ s.add_development_dependency(%q<yard>, [">= 0"])
47
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
48
+ else
49
+ s.add_dependency(%q<middleman-portfolio>, [">= 0"])
50
+ s.add_dependency(%q<mini_magick>, [">= 0"])
51
+ s.add_dependency(%q<rake>, [">= 0"])
52
+ s.add_dependency(%q<rdoc>, [">= 0"])
53
+ s.add_dependency(%q<yard>, [">= 0"])
54
+ s.add_dependency(%q<jeweler>, [">= 0"])
55
+ end
56
+ else
57
+ s.add_dependency(%q<middleman-portfolio>, [">= 0"])
58
+ s.add_dependency(%q<mini_magick>, [">= 0"])
59
+ s.add_dependency(%q<rake>, [">= 0"])
60
+ s.add_dependency(%q<rdoc>, [">= 0"])
61
+ s.add_dependency(%q<yard>, [">= 0"])
62
+ s.add_dependency(%q<jeweler>, [">= 0"])
63
+ end
64
+ end
65
+
data/screenshot.jpg ADDED
Binary file
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: middleman-portfolio
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Dave Hulihan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-08-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mini_magick
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 4.2.10
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 4.2.10
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rdoc
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: yard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: jeweler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: A low-drama portfolio generator for your middleman site.
84
+ email: dhulihan@gmail.com
85
+ executables: []
86
+ extensions: []
87
+ extra_rdoc_files:
88
+ - README.md
89
+ files:
90
+ - Gemfile
91
+ - README.md
92
+ - Rakefile
93
+ - VERSION
94
+ - features/support/env.rb
95
+ - lib/middleman-portfolio.rb
96
+ - lib/middleman_extension.rb
97
+ - lib/template/source/portfolio.html.erb
98
+ - lib/template/source/project.html.erb
99
+ - middleman-portfolio.gemspec
100
+ - screenshot.jpg
101
+ homepage: http://github.com/dhulihan/middleman-portfolio
102
+ licenses:
103
+ - MIT
104
+ metadata: {}
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubyforge_project:
121
+ rubygems_version: 2.4.5
122
+ signing_key:
123
+ specification_version: 4
124
+ summary: A low-drama portfolio generator for your middleman site.
125
+ test_files: []