dgw_gallery 0.2.2

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,129 @@
1
+ class GalleryController < ApplicationController
2
+ before_action :set_gallery, only: [:show, :manage, :update, :destroy]
3
+
4
+ def index
5
+ @page = 'gallery'
6
+ @galleries = Gallery.all
7
+ end
8
+
9
+ def manage
10
+ @page = 'manage'
11
+ if params[:id]
12
+ @gallery = Gallery.find(params[:id])
13
+ else
14
+ redirect_to gallery_path and return
15
+ end
16
+
17
+ end
18
+
19
+ def add_to_gallery
20
+ if !params[:id]
21
+ redirect_back(fallback_location: admin_gallery_path) and return
22
+ end
23
+
24
+ ap "adding pfiSet: #{params[:id]} to gallery images"
25
+
26
+ gallery = Gallery.first
27
+ ### get pfiSet and copy to giSet
28
+ pfiSet = PortfolioImage.find(params[:id])
29
+ giSet = GalleryImage.where(gallery_id: gallery.id, portfolio_images_id: pfiSet.id).first_or_create
30
+ giSet.before.attach(io: StringIO.new(pfiSet.before.download), filename: pfiSet.before.filename, content_type: pfiSet.before.content_type)
31
+ giSet.after.attach(io: StringIO.new(pfiSet.after.download), filename: pfiSet.after.filename, content_type: pfiSet.after.content_type)
32
+ giSet.caption = pfiSet.portfolio.user.first_name + " " + pfiSet.portfolio.user.last_name + " | " + pfiSet.portfolio.user.city + ", " + pfiSet.portfolio.user.state
33
+ giSet.portfolio_images_id = pfiSet.id
34
+ giSet.save
35
+
36
+ end
37
+
38
+ def upload_to_gallery
39
+ ### do we have uploaded portfolio images
40
+ if params[:image] && params[:gallery_id]
41
+ image = params[:image]
42
+ caption = params[:caption]
43
+ gallery = Gallery.find(params[:gallery_id])
44
+ gImage = GalleryImage.new
45
+ gImage.gallery_id = gallery.id
46
+
47
+ gImage.image.attach(io: File.open(image.path), filename: image.original_filename, content_type: image.content_type)
48
+ gImage.caption = (caption.blank?)? " " : caption
49
+ gImage.save
50
+
51
+ flash[:success] = "Image was successfully added to the gallery"
52
+ redirect_back(fallback_location: gallery_path) and return
53
+ else
54
+ flash[:error] = "Something went wrong... what did you do?!"
55
+ redirect_back(fallback_location: gallery_path) and return
56
+
57
+ end
58
+
59
+
60
+
61
+ end
62
+
63
+ def remove_gallery
64
+ if !params[:id]
65
+ redirect_to gallery_path and return
66
+ end
67
+
68
+ gallery = Gallery.find(params[:id])
69
+ gallery.destroy
70
+ end
71
+
72
+ def remove_from_gallery
73
+ if !params[:id]
74
+ redirect_back(fallback_location: gallery_path) and return
75
+ end
76
+
77
+ rmImage = GalleryImage.find(params[:id])
78
+ rmImage.destroy
79
+ end
80
+
81
+ def show
82
+
83
+ end
84
+
85
+ # GET /gallery/new
86
+ def new
87
+ @gallery = Gallery.new
88
+ end
89
+
90
+ # POST /gallery
91
+ def create
92
+ @gallery = Gallery.new(gallery_params)
93
+
94
+ if @gallery.save
95
+ redirect_to @gallery, notice: 'Gallery was successfully created.'
96
+ else
97
+ render :new
98
+ end
99
+ end
100
+
101
+ # PATCH/PUT /gallery/1
102
+ def update
103
+ if @gallery.update(gallery_params)
104
+ redirect_to @gallery, notice: 'Gallery was successfully updated.'
105
+ else
106
+ render :edit
107
+ end
108
+ end
109
+
110
+ # DELETE /gallery/1
111
+ def destroy
112
+ @gallery.destroy
113
+ redirect_to gallery_url, notice: 'Gallery was successfully destroyed.'
114
+ end
115
+
116
+ private
117
+ # Use callbacks to share common setup or constraints between actions.
118
+ def set_gallery
119
+ @gallery = Gallery.find(params[:id])
120
+ end
121
+
122
+ # Only allow a list of trusted parameters through.
123
+ def gallery_params
124
+ # params.fetch(:gallery, :title, {})
125
+ params.require(:gallery).permit(:title)
126
+ end
127
+
128
+ end
129
+
@@ -0,0 +1,2 @@
1
+ module GalleryHelper
2
+ end
@@ -0,0 +1,4 @@
1
+ class Gallery < ApplicationRecord
2
+ model_name.instance_variable_set(:@route_key, 'gallery')
3
+ has_many :gallery_images, :dependent => :destroy
4
+ end
@@ -0,0 +1,4 @@
1
+ class GalleryImage < ApplicationRecord
2
+ belongs_to :gallery
3
+ has_one_attached :image
4
+ end
@@ -0,0 +1,27 @@
1
+ <%= form_for @gallery do |form| %>
2
+ <% if gallery.errors.any? %>
3
+ <div id="error_explanation">
4
+ <h2><%= pluralize(gallery.errors.count, "error") %> prohibited this gallery from being saved:</h2>
5
+ <ul>
6
+ <% gallery.errors.each do |error| %>
7
+ <li><%= error.full_message %></li>
8
+ <% end %>
9
+ </ul>
10
+ </div>
11
+ <% end %>
12
+ <section class="py-3 justify-content-center text-center">
13
+ <div class="container">
14
+ <div class="row justify-space-between py-2">
15
+ <div class="col-lg-4 mx-auto">
16
+ <div class="input-group input-group-static mb-4">
17
+ <label>Gallery Name</label>
18
+ <%= form.text_field :title, class: 'form-control' %>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ <div class="actions ">
24
+ <%= form.submit 'Create Gallery', class: 'btn btn-info border-radius-md' %>
25
+ </div>
26
+ </section>
27
+ <% end %>
@@ -0,0 +1,83 @@
1
+ <%= stylesheet_link_tag "dgw_gallery/dgw_gallery_style.css" %>
2
+ <script src="https://kit.fontawesome.com/42d5adcbca.js" crossorigin="anonymous"></script>
3
+ <div class="container mt-3">
4
+ <div class="row mb-4">
5
+ <div class="card card-body bg-gradient-gallery border-radius-xl shadow-lg border-top-0 col-12">
6
+ <div class="row justify-content-center">
7
+ <div class="col-6 justify-content-center d-flex align-items-center">
8
+ <div class="col-2 d-flex align-items-center">
9
+ <%= image_tag "dgw_logo.png", class: 'align-items-center', height: "100px" %>
10
+ </div>
11
+ <div class="col-8 d-flex align-items-center h-100">
12
+ <h2 class="text-active">DevGW Gallery <span class="fs-5">(v <%= DgwGallery::VERSION %>)</span></h2>
13
+ </div>
14
+ </div>
15
+ </div>
16
+ <div class="row text-center justify-content-center">
17
+ <div class="col-12">
18
+ <div class="btn-group mt-2 mb-3" role="toolbar" aria-label="Basic example">
19
+ <span class="text-active">Gallery Home</span>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ </div>
25
+ <div class="row mt-5">
26
+ <div class="card card-body shadow-lg border-1 border-radius-xl col-12">
27
+ <div class="row">
28
+ <% if @galleries.count > 0 %>
29
+ <div class="row justify-space-between py-2 text-center">
30
+ <h4 class="text-center">Existing Galleries</h4>
31
+ <hr class="">
32
+ <%= link_to gallery_new_path, class: 'text-end text-info' do %>
33
+ <span class="mb-5 text-end"><i class="fa fa-plus"></i> New Gallery</span>
34
+ <% end %>
35
+ <% @galleries.each do |gallery| %>
36
+ <div class="col-12 col-md-3 mt-3 mx-auto mb-5 move-on-hover d-flex align-items-stretch" id="<%= gallery.id.to_s %>">
37
+ <div class="card border-1 shadow-lg mt-3 border-radius-xl">
38
+ <div class="card-header mt-n3 mx-3 p-0 bg-transparent position-relative z-index-2">
39
+ <span class="d-block blur-shadow-image">
40
+ <%= image_tag ((!gallery.gallery_images.blank? && gallery.gallery_images.first.image.attached?)? gallery.gallery_images.first.image.variant(resize_to_fill: [300, 300]) : "no_gallery_images.png"), class: "img-fluid border-radius-xl" %>
41
+ </span>
42
+ </div>
43
+ <div class="card-body p-1 text-center">
44
+ <div class="row">
45
+ <div class="col-12">
46
+ <p class="text-black"><%= gallery.title %></p>
47
+ </div>
48
+ <div class="col-12 text-center">
49
+ <%= button_tag "Remove", class: 'btn btn-danger btn-sm', onclick: "removeGallery(#{gallery.id})", data: {confirm: "Are you sure?\n\nThis will permanently remove the gallery and all attached images."} %>
50
+ <%= link_to "/gallery/manage/#{gallery.id}", class: "text-decoration-none" do %>
51
+ <%= button_tag "Manage", class: 'btn btn-info btn-sm' %>
52
+ <% end %>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ </div>
57
+ </div>
58
+ <% end %>
59
+ </div>
60
+ <% else %>
61
+ <div class="col-12 text-center">
62
+ <h3>You currently have no galleries</h3>
63
+ <%= link_to gallery_new_path do %>
64
+ <%= button_tag "Create a Gallery", class: 'btn btn-info border-radius-lg mt-2' %>
65
+ <% end %>
66
+ </div>
67
+ <% end %>
68
+ </div>
69
+ </div>
70
+ </div>
71
+ </div>
72
+ <script>
73
+ function removeGallery(id){
74
+ $.ajax({
75
+ type: 'put',
76
+ url: '/gallery/remove/' + id,
77
+ success: function(){
78
+ $("#"+id).hide('slow', function(){ $target.remove(); });
79
+ }
80
+ });
81
+
82
+ }
83
+ </script>
@@ -0,0 +1,136 @@
1
+ <%= stylesheet_link_tag "dgw_gallery/dgw_gallery_style.css" %>
2
+ <script src="https://kit.fontawesome.com/42d5adcbca.js" crossorigin="anonymous"></script>
3
+ <div class="container mt-3">
4
+ <div class="row mb-4">
5
+ <div class="card card-body bg-gradient-gallery border-radius-xl shadow-lg border-top-0 col-12">
6
+ <div class="row justify-content-center">
7
+ <div class="col-6 justify-content-center d-flex align-items-center">
8
+ <div class="col-2 d-flex align-items-center">
9
+ <%= image_tag "dgw_logo.png", class: 'align-items-center', height: "100px" %>
10
+ </div>
11
+ <div class="col-8 d-flex align-items-center h-100">
12
+ <h2 class="text-active">DevGW Gallery <span class="fs-5">(v <%= DgwGallery::VERSION %>)</span></h2>
13
+ </div>
14
+ </div>
15
+ </div>
16
+ <div class="row text-center justify-content-center">
17
+ <div class="col-12">
18
+ <div class="btn-group" role="toolbar" aria-label="Basic example">
19
+ <%= link_to gallery_path do %>
20
+ <%= button_tag "Back to Gallery Home", type: 'button', class: 'btn btn-primary btn-small' %>
21
+ <% end %>
22
+ </div>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ <div class="row">
28
+ <div class="card card-body border-1 shadow-xl border-radius-xl col-12">
29
+ <div class="row text-center justify-content-center">
30
+ <h4>Add Image to Gallery</h4>
31
+ </div>
32
+ <div class="row text-center mt-1 d-flex align-items-stretch">
33
+ <div class="col-12 mx-auto">
34
+ <div class="card-header mt-1 mx-auto border-radius-xl p-2 bg-transparent position-relative z-index-2 blur-shadow-image dark-shadow ">
35
+ <%= form_tag gallery_upload_path, id: "gallery_upload_form", name: "gallery_upload_form", method:"PUT", multipart: true do %>
36
+ <%= hidden_field_tag "gallery_id", @gallery.id %>
37
+ <div class="row justify-content-center align-items-center">
38
+ <div class="col-2">
39
+ <figure>
40
+ <%= image_tag "no_image_selected.png", class: "img-fluid border-radius-xl mt-1", width: "150px", height: "150px", id: "g_image" %>
41
+ <figcaption>
42
+ <div class="text-center mt-1 text-black">
43
+ <span class="btn-file">
44
+ <%= file_field_tag "image", id: "image" %>
45
+ <label for="image">
46
+ <i class="fs-4 fa fa-camera-retro"></i>
47
+ <p>upload</p>
48
+ </label>
49
+ </span>
50
+ </div>
51
+ </figcaption>
52
+ </figure>
53
+ </div>
54
+ <div class="col-2">
55
+ <div class="input-group input-group-static mb-2">
56
+ <%= text_field_tag "caption", nil, class: "form-control text-center", placeholder: "Enter caption for image", required: false %><br>
57
+ </div>
58
+ <p>
59
+ <button type="submit" class="w-auto mt-2 btn btn-sm btn-primary">Add to Gallery</button>
60
+ </p>
61
+ </div>
62
+ </div>
63
+ <% end %>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ <div class="row mt-2">
70
+ <div class="card card-body border-1 shadow-xl border-radius-xl col-12">
71
+ <% if @gallery.gallery_images.count > 0 %>
72
+ <div class="row justify-space-between py-2 text-center">
73
+ <h4 class="text-center">Images in gallery: <%= @gallery.title %></h4>
74
+ <hr class="">
75
+ <% @gallery.gallery_images.each do |gImage| %>
76
+ <div class="col-12 col-md-3 mx-auto mb-5 move-on-hover d-flex align-items-stretch" id="<%= gImage.id %>">
77
+ <div class="card border-1 shadow-lg mt-3 border-radius-xl">
78
+ <div class="card-header mt-n3 mx-3 p-0 bg-transparent position-relative z-index-2">
79
+ <span class="d-block blur-shadow-image">
80
+ <%= image_tag gImage.image.variant(resize_to_fill: [300, 300]), class: "img-fluid border-radius-xl" %>
81
+ </span>
82
+ </div>
83
+ <div class="card-body p-1 text-center">
84
+ <div class="row">
85
+ <div class="text-black inline-block"><%= gImage.caption %></div>
86
+ <div class="col-12 text-center">
87
+ <%= button_tag "Remove Image", class: 'btn btn-danger btn-sm', onclick: "removeFromGallery(#{gImage.id})", data: {confirm: "Are you sure?\n\nThis will permanently remove the image."} %>
88
+ </div>
89
+ </div>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ <% end %>
94
+ </div>
95
+ <% else %>
96
+ <div class="col-12 text-center">
97
+ <h3>You currently have no gallery images</h3>
98
+ </div>
99
+ <% end %>
100
+ </div>
101
+ </div>
102
+ </div>
103
+ <script>
104
+ $(document).ready(function() {
105
+
106
+ function readURL(input, targetTag) {
107
+
108
+ if (input.files && input.files[0]) {
109
+ var reader = new FileReader();
110
+
111
+ reader.onload = function (e) {
112
+ $(targetTag).attr('src', e.target.result);
113
+ }
114
+
115
+ reader.readAsDataURL(input.files[0]);
116
+ }
117
+ }
118
+
119
+
120
+ $("#image").change(function(){
121
+ readURL(this, "#g_image");
122
+ });
123
+ });
124
+ </script>
125
+ <script>
126
+ function removeFromGallery(id){
127
+ $.ajax({
128
+ type: 'PUT',
129
+ url: '/gallery/remove_from_gallery/' + id,
130
+ success: function(){
131
+ $("#"+id).hide('slow', function(){ $target.remove(); });
132
+ }
133
+ });
134
+
135
+ }
136
+ </script>
@@ -0,0 +1,35 @@
1
+ <%= stylesheet_link_tag "dgw_gallery/dgw_gallery_style.css" %>
2
+ <script src="https://kit.fontawesome.com/42d5adcbca.js" crossorigin="anonymous"></script>
3
+ <div class="container mt-3">
4
+ <div class="row mb-4">
5
+ <div class="card card-body bg-gradient-gallery border-radius-xl shadow-lg border-top-0 col-12">
6
+ <div class="row justify-content-center">
7
+ <div class="col-6 justify-content-center d-flex align-items-center">
8
+ <div class="col-2 d-flex align-items-center">
9
+ <%= image_tag "dgw_logo.png", class: 'align-items-center', height: "100px" %>
10
+ </div>
11
+ <div class="col-8 d-flex align-items-center h-100">
12
+ <h2 class="text-active">DevGW Gallery <span class="fs-5">(v <%= DgwGallery::VERSION %>)</span></h2>
13
+ </div>
14
+ </div>
15
+ </div>
16
+ <div class="row text-center justify-content-center">
17
+ <div class="col-12">
18
+ <div class="btn-group" role="toolbar" aria-label="Basic example">
19
+ <%= link_to gallery_path do%>
20
+ <%= button_tag "Back to Gallery Home", type: 'button', class: 'btn btn-primary btn-small' %>
21
+ <% end %>
22
+ </div>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ <div class="row mt-5">
28
+ <div class="card card-body shadow-lg border-1 border-radius-xl col-12">
29
+ <div class="row">
30
+ <%= render 'form', gallery: @gallery %>
31
+ </div>
32
+ <%= link_to 'Cancel', gallery_path %>
33
+ </div>
34
+ </div>
35
+ </div>
data/config/routes.rb ADDED
@@ -0,0 +1,12 @@
1
+ Rails.application.routes.draw do
2
+ # resources :gallery
3
+ get 'gallery/new'
4
+ get 'gallery', controller: 'gallery', action: 'index'
5
+ post 'gallery', controller: 'gallery', action: 'create'
6
+ get 'gallery/manage/:id', controller: 'gallery', action: 'manage'
7
+ put "gallery/add_to_gallery/:id", controller: 'gallery', action: 'add_to_gallery'
8
+ put "gallery/remove_from_gallery/:id", controller: 'gallery', action: 'remove_from_gallery'
9
+ put "gallery/remove/:id", controller: 'gallery', action: 'remove_gallery'
10
+ put "gallery/upload", controller: 'gallery', action: 'upload_to_gallery'
11
+ # root to: 'gallery#index'
12
+ end
@@ -0,0 +1,9 @@
1
+ class CreateGalleries < ActiveRecord::Migration[6.1]
2
+ def change
3
+ create_table :galleries do |t|
4
+ t.string :title
5
+
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ class CreateGalleryImages < ActiveRecord::Migration[6.1]
2
+ def change
3
+ create_table :gallery_images do |t|
4
+ t.references :gallery, null: false, foreign_key: true
5
+ t.string :caption
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module DgwGallery
2
+ class Engine < ::Rails::Engine
3
+ initializer "dgw_gallery.assets.precompile" do |app|
4
+ app.config.assets.precompile << "dgw_gallery_manifest.js"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module DgwGallery
2
+ VERSION = '0.2.2'
3
+ end
@@ -0,0 +1,6 @@
1
+ require "dgw_gallery/version"
2
+ require "dgw_gallery/engine"
3
+
4
+ module DgwGallery
5
+ # Your code goes here...
6
+ end
@@ -0,0 +1,26 @@
1
+ # desc "Explaining what the task does"
2
+ # task :dgw_gallery do
3
+ # # Task goes here
4
+ # end
5
+
6
+ namespace :dgw_gallery do
7
+ desc "Install Gallery Views"
8
+
9
+ task 'install:views' do
10
+ source = File.join(DgwGallery::Engine.root, "app", "views", "gallery")
11
+ target = File.join(Rails.root, "app", "views", "gallery")
12
+ FileUtils.copy_entry source, target
13
+ end
14
+
15
+
16
+ end
17
+
18
+ namespace :dgw_gallery do
19
+ desc "Install Gallery Controller"
20
+
21
+ task 'install:controller' do
22
+ source = File.join(DgwGallery::Engine.root, "app", "controllers", "gallery_controller.rb")
23
+ target = File.join(Rails.root, "app", "controllers", "gallery_controller.rb")
24
+ FileUtils.cp_r source, target
25
+ end
26
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dgw_gallery
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.2
5
+ platform: ruby
6
+ authors:
7
+ - Dev Ghost Writers
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-02-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 6.1.4
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 6.1.4.4
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: 6.1.4
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 6.1.4.4
33
+ - !ruby/object:Gem::Dependency
34
+ name: image_processing
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.2'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.2'
47
+ description: A simple gallery for ruby on rails sites that includes a layout for either
48
+ a bootstrap carousel or responsive image page
49
+ email:
50
+ - ruby-gems@devghostwriters.com
51
+ executables: []
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - MIT-LICENSE
56
+ - README.md
57
+ - Rakefile
58
+ - app/assets/config/dgw_gallery_manifest.js
59
+ - app/assets/images/dgw_logo.png
60
+ - app/assets/images/no_gallery_images.png
61
+ - app/assets/images/no_image_selected.png
62
+ - app/assets/stylesheets/dgw_gallery/dgw_gallery_style.css
63
+ - app/controllers/gallery_controller.rb
64
+ - app/helpers/gallery_helper.rb
65
+ - app/models/gallery.rb
66
+ - app/models/gallery_image.rb
67
+ - app/views/gallery/_form.html.erb
68
+ - app/views/gallery/index.html.erb
69
+ - app/views/gallery/manage.html.erb
70
+ - app/views/gallery/new.html.erb
71
+ - config/routes.rb
72
+ - db/migrate/20220205184903_create_galleries.rb
73
+ - db/migrate/20220205185008_create_gallery_images.rb
74
+ - lib/dgw_gallery.rb
75
+ - lib/dgw_gallery/engine.rb
76
+ - lib/dgw_gallery/version.rb
77
+ - lib/tasks/dgw_gallery_tasks.rake
78
+ homepage: https://github.com/DevGW/dgw_gallery
79
+ licenses:
80
+ - MIT
81
+ metadata: {}
82
+ post_install_message:
83
+ rdoc_options: []
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ requirements: []
97
+ rubygems_version: 3.2.15
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: A simple gallery for ruby on rails sites
101
+ test_files: []