middleman-portfolio 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []