mirror of
https://github.com/danbee/my-images
synced 2025-03-04 08:49:05 +00:00
Remove Dragonfly and fix up specs
This commit is contained in:
parent
5b2d1d4d17
commit
4d8f516252
1
Gemfile
1
Gemfile
@ -7,7 +7,6 @@ gem "dotenv-rails", groups: %i[development test]
|
|||||||
gem "rails", "5.2.1"
|
gem "rails", "5.2.1"
|
||||||
|
|
||||||
gem "delayed_job_active_record"
|
gem "delayed_job_active_record"
|
||||||
gem "dragonfly"
|
|
||||||
gem "http"
|
gem "http"
|
||||||
gem "mini_magick"
|
gem "mini_magick"
|
||||||
gem "omniauth-github"
|
gem "omniauth-github"
|
||||||
|
|||||||
@ -82,10 +82,6 @@ GEM
|
|||||||
dotenv-rails (2.5.0)
|
dotenv-rails (2.5.0)
|
||||||
dotenv (= 2.5.0)
|
dotenv (= 2.5.0)
|
||||||
railties (>= 3.2, < 6.0)
|
railties (>= 3.2, < 6.0)
|
||||||
dragonfly (1.1.5)
|
|
||||||
addressable (~> 2.3)
|
|
||||||
multi_json (~> 1.0)
|
|
||||||
rack (>= 1.3)
|
|
||||||
erubi (1.7.1)
|
erubi (1.7.1)
|
||||||
execjs (2.7.0)
|
execjs (2.7.0)
|
||||||
faraday (0.12.2)
|
faraday (0.12.2)
|
||||||
@ -267,7 +263,6 @@ DEPENDENCIES
|
|||||||
capybara
|
capybara
|
||||||
delayed_job_active_record
|
delayed_job_active_record
|
||||||
dotenv-rails
|
dotenv-rails
|
||||||
dragonfly
|
|
||||||
geckodriver-helper
|
geckodriver-helper
|
||||||
http
|
http
|
||||||
launchy
|
launchy
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
[ ](https://app.codeship.com/projects/300990)
|
[ ](https://app.codeship.com/projects/300990)
|
||||||
|
|
||||||
A simple DragonFly powered image storage application.
|
A simple Active Storage powered image storage application.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ class TagImageJob < ApplicationJob
|
|||||||
def perform(image_id:)
|
def perform(image_id:)
|
||||||
image = Image.find(image_id)
|
image = Image.find(image_id)
|
||||||
|
|
||||||
tags = Clarifai.new(image.image.file.path).tags
|
tags = Clarifai.new(image.image.download).tags
|
||||||
image.update_attributes(tags: tags)
|
image.update_attributes(tags: tags)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,8 +1,7 @@
|
|||||||
class Image < ActiveRecord::Base
|
class Image < ActiveRecord::Base
|
||||||
dragonfly_accessor :df_image
|
|
||||||
has_one_attached :image
|
has_one_attached :image
|
||||||
|
|
||||||
validates :image, presence: true
|
validates :image, attached: true
|
||||||
|
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,6 +1,4 @@
|
|||||||
class User < ActiveRecord::Base
|
class User < ActiveRecord::Base
|
||||||
dragonfly_accessor :avatar
|
|
||||||
|
|
||||||
has_many :images
|
has_many :images
|
||||||
|
|
||||||
def self.find_or_create_from_auth(auth)
|
def self.find_or_create_from_auth(auth)
|
||||||
@ -13,7 +11,6 @@ class User < ActiveRecord::Base
|
|||||||
uid: auth.uid,
|
uid: auth.uid,
|
||||||
username: auth.info.nickname,
|
username: auth.info.nickname,
|
||||||
name: auth.info.name,
|
name: auth.info.name,
|
||||||
avatar_url: auth.info.image,
|
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
7
app/validators/attached_validator.rb
Normal file
7
app/validators/attached_validator.rb
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
class AttachedValidator < ActiveModel::EachValidator
|
||||||
|
def validate_each(record, attribute, value)
|
||||||
|
if !value.attached?
|
||||||
|
record.errors.add(attribute, :attached, options)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -1,27 +0,0 @@
|
|||||||
require "dragonfly"
|
|
||||||
|
|
||||||
# Configure
|
|
||||||
Dragonfly.app.configure do
|
|
||||||
plugin :imagemagick
|
|
||||||
|
|
||||||
verify_urls true
|
|
||||||
secret "0da375f9754c75707f2a3b4e0c75dffb7ec7d6bb1a4a77e8a8dcfba9037bebce"
|
|
||||||
|
|
||||||
url_format "/media/:job/:name"
|
|
||||||
|
|
||||||
datastore :file,
|
|
||||||
root_path: Rails.root.join("public/system/dragonfly", Rails.env),
|
|
||||||
server_root: Rails.root.join("public")
|
|
||||||
end
|
|
||||||
|
|
||||||
# Logger
|
|
||||||
Dragonfly.logger = Rails.logger
|
|
||||||
|
|
||||||
# Mount as middleware
|
|
||||||
Rails.application.middleware.use Dragonfly::Middleware
|
|
||||||
|
|
||||||
# Add model functionality
|
|
||||||
if defined?(ActiveRecord::Base)
|
|
||||||
ActiveRecord::Base.extend Dragonfly::Model
|
|
||||||
ActiveRecord::Base.extend Dragonfly::Model::Validations
|
|
||||||
end
|
|
||||||
@ -21,3 +21,8 @@
|
|||||||
|
|
||||||
en:
|
en:
|
||||||
hello: "Hello world"
|
hello: "Hello world"
|
||||||
|
|
||||||
|
activerecord:
|
||||||
|
errors:
|
||||||
|
messages:
|
||||||
|
attached: is not attached
|
||||||
|
|||||||
@ -6,8 +6,8 @@ class Clarifai
|
|||||||
API_URL = "https://api.clarifai.com/v2/models/" \
|
API_URL = "https://api.clarifai.com/v2/models/" \
|
||||||
"aaa03c23b3724a16a56b629203edc62c/outputs".freeze
|
"aaa03c23b3724a16a56b629203edc62c/outputs".freeze
|
||||||
|
|
||||||
def initialize(image_path)
|
def initialize(image_data)
|
||||||
@image_path = image_path
|
@image_data = image_data
|
||||||
end
|
end
|
||||||
|
|
||||||
def tags
|
def tags
|
||||||
@ -16,6 +16,8 @@ class Clarifai
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
attr_reader :image_data
|
||||||
|
|
||||||
def extract_tags(response_hash)
|
def extract_tags(response_hash)
|
||||||
response_hash["outputs"][0]["data"]["concepts"].map do |concept|
|
response_hash["outputs"][0]["data"]["concepts"].map do |concept|
|
||||||
concept["name"]
|
concept["name"]
|
||||||
@ -40,10 +42,6 @@ class Clarifai
|
|||||||
end
|
end
|
||||||
|
|
||||||
def image_base64
|
def image_base64
|
||||||
Base64.encode64(image_file)
|
Base64.encode64(image_data)
|
||||||
end
|
|
||||||
|
|
||||||
def image_file
|
|
||||||
File.read(@image_path)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -15,10 +15,14 @@ feature "user manages images" do
|
|||||||
|
|
||||||
it "deletes the image" do
|
it "deletes the image" do
|
||||||
user = User.create(uid: "1")
|
user = User.create(uid: "1")
|
||||||
Image.create(
|
image = Image.new(
|
||||||
user: user,
|
user: user,
|
||||||
image: File.new("#{Rails.root}/spec/fixtures/spectrum.jpg"),
|
|
||||||
)
|
)
|
||||||
|
image.image.attach(
|
||||||
|
io: File.open("#{Rails.root}/spec/fixtures/spectrum.jpg"),
|
||||||
|
filename: "spectrum.jpg",
|
||||||
|
)
|
||||||
|
image.save
|
||||||
|
|
||||||
sign_in(user)
|
sign_in(user)
|
||||||
click_on("Delete")
|
click_on("Delete")
|
||||||
|
|||||||
@ -4,11 +4,15 @@ feature "user manages image tags by visitng images show page" do
|
|||||||
scenario "and can see an X to link for deletion on a tag" do
|
scenario "and can see an X to link for deletion on a tag" do
|
||||||
tags = ["one", "two"]
|
tags = ["one", "two"]
|
||||||
user = User.create(uid: "123")
|
user = User.create(uid: "123")
|
||||||
Image.create(
|
image = Image.new(
|
||||||
user: user,
|
user: user,
|
||||||
tags: tags,
|
tags: tags,
|
||||||
image: File.new("#{Rails.root}/spec/fixtures/spectrum.jpg"),
|
|
||||||
)
|
)
|
||||||
|
image.image.attach(
|
||||||
|
io: File.open("#{Rails.root}/spec/fixtures/spectrum.jpg"),
|
||||||
|
filename: "spectrum.jpg",
|
||||||
|
)
|
||||||
|
image.save
|
||||||
|
|
||||||
sign_in(user)
|
sign_in(user)
|
||||||
page.find(".image").click
|
page.find(".image").click
|
||||||
@ -21,11 +25,15 @@ feature "user manages image tags by visitng images show page" do
|
|||||||
scenario "and can click the link to delete a tag", js: true do
|
scenario "and can click the link to delete a tag", js: true do
|
||||||
tags = ["one", "two"]
|
tags = ["one", "two"]
|
||||||
user = User.create(uid: "123")
|
user = User.create(uid: "123")
|
||||||
Image.create(
|
image = Image.new(
|
||||||
user: user,
|
user: user,
|
||||||
tags: tags,
|
tags: tags,
|
||||||
image: File.new("#{Rails.root}/spec/fixtures/spectrum.jpg"),
|
|
||||||
)
|
)
|
||||||
|
image.image.attach(
|
||||||
|
io: File.open("#{Rails.root}/spec/fixtures/spectrum.jpg"),
|
||||||
|
filename: "spectrum.jpg",
|
||||||
|
)
|
||||||
|
image.save
|
||||||
|
|
||||||
sign_in(user)
|
sign_in(user)
|
||||||
page.find(".image").click
|
page.find(".image").click
|
||||||
@ -41,11 +49,15 @@ feature "user manages image tags by visitng images show page" do
|
|||||||
tags = ["one", "two"]
|
tags = ["one", "two"]
|
||||||
user = User.create(uid: "123")
|
user = User.create(uid: "123")
|
||||||
new_tag = "newtag"
|
new_tag = "newtag"
|
||||||
Image.create(
|
image = Image.new(
|
||||||
user: user,
|
user: user,
|
||||||
tags: tags,
|
tags: tags,
|
||||||
image: File.new("#{Rails.root}/spec/fixtures/spectrum.jpg"),
|
|
||||||
)
|
)
|
||||||
|
image.image.attach(
|
||||||
|
io: File.open("#{Rails.root}/spec/fixtures/spectrum.jpg"),
|
||||||
|
filename: "spectrum.jpg",
|
||||||
|
)
|
||||||
|
image.save
|
||||||
|
|
||||||
sign_in(user)
|
sign_in(user)
|
||||||
page.find(".image").click
|
page.find(".image").click
|
||||||
|
|||||||
@ -4,9 +4,12 @@ describe TagImageJob, type: :job do
|
|||||||
describe ".perform" do
|
describe ".perform" do
|
||||||
it "tags an image" do
|
it "tags an image" do
|
||||||
stub_clarifai(%w[computers technology])
|
stub_clarifai(%w[computers technology])
|
||||||
image = Image.create(
|
image = Image.new
|
||||||
image: "#{Rails.root}/spec/fixtures/spectrum.jpg",
|
image.image.attach(
|
||||||
|
io: File.open("#{Rails.root}/spec/fixtures/spectrum.jpg"),
|
||||||
|
filename: "spectrum.jpg",
|
||||||
)
|
)
|
||||||
|
image.save
|
||||||
|
|
||||||
TagImageJob.perform_now(image_id: image.id)
|
TagImageJob.perform_now(image_id: image.id)
|
||||||
image.reload
|
image.reload
|
||||||
|
|||||||
@ -11,7 +11,7 @@ describe Clarifai do
|
|||||||
it "predicts tags for our image" do
|
it "predicts tags for our image" do
|
||||||
stub_api(%w[computer technology])
|
stub_api(%w[computer technology])
|
||||||
|
|
||||||
clarifai = Clarifai.new("spec/fixtures/spectrum.jpg")
|
clarifai = Clarifai.new(File.read("spec/fixtures/spectrum.jpg"))
|
||||||
|
|
||||||
expect(clarifai.tags).to eq(%w[computer technology])
|
expect(clarifai.tags).to eq(%w[computer technology])
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,11 +1,7 @@
|
|||||||
require "rails_helper"
|
require "rails_helper"
|
||||||
|
|
||||||
describe Image do
|
describe Image do
|
||||||
it { is_expected.to validate_presence_of(:image) }
|
|
||||||
it { is_expected.to belong_to(:user) }
|
it { is_expected.to belong_to(:user) }
|
||||||
|
it { is_expected.to have_attached_file(:image) }
|
||||||
it "should not be valid without an image" do
|
it { is_expected.to validate_attachment_of(:image) }
|
||||||
image = Image.new
|
|
||||||
expect(image).not_to be_valid
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
7
spec/support/matchers/have_attached_file.rb
Normal file
7
spec/support/matchers/have_attached_file.rb
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
RSpec::Matchers.define :have_attached_file do |name|
|
||||||
|
match do |record|
|
||||||
|
file = record.send(name)
|
||||||
|
|
||||||
|
file.respond_to?(:attach)
|
||||||
|
end
|
||||||
|
end
|
||||||
45
spec/support/matchers/validate_attachment_of.rb
Normal file
45
spec/support/matchers/validate_attachment_of.rb
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
require "rspec/expectations"
|
||||||
|
|
||||||
|
RSpec::Matchers.define :validate_attachment_of do |attr_name|
|
||||||
|
match do |record|
|
||||||
|
matcher.matches?(record, attr_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
chain :on do |validation_context|
|
||||||
|
matcher.on(validation_context)
|
||||||
|
end
|
||||||
|
|
||||||
|
chain :with_message do |message|
|
||||||
|
matcher.with_message(message)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def matcher
|
||||||
|
@matcher ||= ValidateAttachmentOfMatcher.new
|
||||||
|
end
|
||||||
|
|
||||||
|
class ValidateAttachmentOfMatcher
|
||||||
|
def on(validation_context)
|
||||||
|
@validation_context = validation_context
|
||||||
|
end
|
||||||
|
|
||||||
|
def with_message(message)
|
||||||
|
@message = message
|
||||||
|
end
|
||||||
|
|
||||||
|
def matches?(record, attr_name)
|
||||||
|
record.send(attr_name).purge
|
||||||
|
record.valid?(validation_context)
|
||||||
|
record.errors[attr_name].include? message
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
attr_reader :validation_context
|
||||||
|
|
||||||
|
def message
|
||||||
|
@message || I18n.translate("activerecord.errors.messages.attached")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Reference in New Issue
Block a user