mugshot 0.1.1 → 0.1.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.
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/features/retrieve_resized_image.feature +3 -3
- data/features/retrieve_resized_image_keeping_aspect_ratio.feature +22 -0
- data/features/step_definitions/general_steps.rb +9 -0
- data/features/step_definitions/retrieve_resized_image_keeping_aspect_ratio_steps.rb +10 -0
- data/features/step_definitions/retrieve_resized_image_steps.rb +5 -9
- data/gems.yml +1 -1
- data/gems_dev.yml +2 -5
- data/lib/mugshot/application.rb +5 -8
- data/lib/mugshot/dimension.rb +6 -4
- data/lib/mugshot/image.rb +5 -8
- data/lib/mugshot/public/crossdomain.xml +4 -0
- data/mugshot.gemspec +13 -13
- data/spec/mugshot/application_spec.rb +6 -9
- data/spec/mugshot/dimension_spec.rb +4 -4
- data/spec/mugshot/image_spec.rb +13 -14
- metadata +8 -15
data/Rakefile
CHANGED
@@ -14,13 +14,13 @@ begin
|
|
14
14
|
gem.homepage = "http://github.com/timebeta/mugshot"
|
15
15
|
gem.authors = ["Cainã Nunes", "Fabrício Lopes", "Fernando Meyer", "Guilherme Cirne", "José Peleteiro"]
|
16
16
|
|
17
|
-
##
|
17
|
+
## dependencies
|
18
18
|
gems = YAML.load_file 'gems.yml'
|
19
19
|
gems.each do |depgem|
|
20
20
|
gem.add_dependency(depgem[:name], depgem[:version])
|
21
21
|
end
|
22
22
|
|
23
|
-
## developments
|
23
|
+
## developments dependencies
|
24
24
|
gems = YAML.load_file 'gems_dev.yml'
|
25
25
|
gems.each do |depgem|
|
26
26
|
gem.add_development_dependency(depgem[:name], depgem[:version])
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
@@ -2,11 +2,11 @@ Feature: Retrieve resized image
|
|
2
2
|
|
3
3
|
Scenario: Successful retrieval of resized image
|
4
4
|
When I upload an image
|
5
|
-
And I ask for the resized image
|
5
|
+
And I ask for the 200x200 resized image
|
6
6
|
|
7
|
-
Then I should get the resized image
|
7
|
+
Then I should get the 200x200 resized image
|
8
8
|
|
9
9
|
Scenario: Image doesn't exist
|
10
|
-
When I ask for a resized image that doesn't exist
|
10
|
+
When I ask for a 200x200 resized image that doesn't exist
|
11
11
|
|
12
12
|
Then I should get a 404 response
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Feature: Retrieve resized image keeping aspect ratio
|
2
|
+
|
3
|
+
Scenario: Successful retrieval of resized image from given width
|
4
|
+
When I upload an image
|
5
|
+
And I ask for the 200x resized image
|
6
|
+
|
7
|
+
Then I should get the 200x resized image keeping the aspect ratio
|
8
|
+
|
9
|
+
Scenario: Successful retrieval of resized image from given height
|
10
|
+
When I upload an image
|
11
|
+
And I ask for the x200 resized image
|
12
|
+
|
13
|
+
Then I should get the x200 resized image keeping the aspect ratio
|
14
|
+
|
15
|
+
Scenario: Image doesn't exist
|
16
|
+
When I ask for a 200x resized image that doesn't exist
|
17
|
+
|
18
|
+
Then I should get a 404 response
|
19
|
+
|
20
|
+
When I ask for a x200 resized image that doesn't exist
|
21
|
+
|
22
|
+
Then I should get a 404 response
|
@@ -3,6 +3,15 @@ When /^I upload an image$/ do
|
|
3
3
|
@image_id = last_response.body
|
4
4
|
end
|
5
5
|
|
6
|
+
When /^I ask for the (.*) resized image$/ do |size|
|
7
|
+
get "/#{size}/#{@image_id}.jpg"
|
8
|
+
@retrieved_image = last_response.body
|
9
|
+
end
|
10
|
+
|
11
|
+
When /^I ask for a (.*) resized image that doesn't exist$/ do |size|
|
12
|
+
get "/#{size}/nonexistant.jpg"
|
13
|
+
end
|
14
|
+
|
6
15
|
Then /^I should get a (\d+) response$/ do |response_code|
|
7
16
|
last_response.status.should == response_code.to_i
|
8
17
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Then /^I should get the (.*) resized image keeping the aspect ratio$/ do |size|
|
2
|
+
dimension = Mugshot::Dimension.parse!(size)
|
3
|
+
|
4
|
+
image = Magick::Image.read('features/support/files/test.jpg').first
|
5
|
+
image.resize_to_fit!(*dimension.size)
|
6
|
+
resized_image = image.to_blob
|
7
|
+
|
8
|
+
@retrieved_image.should == resized_image
|
9
|
+
last_response.status.should == 200
|
10
|
+
end
|
@@ -1,14 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
@retrieved_image = last_response.body
|
4
|
-
end
|
1
|
+
Then /^I should get the (.*) resized image$/ do |size|
|
2
|
+
dimension = Mugshot::Dimension.parse!(size)
|
5
3
|
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
image = Magick::Image.read('features/support/files/test.jpg').first
|
5
|
+
image.resize!(*dimension.size)
|
6
|
+
resized_image = image.to_blob
|
9
7
|
|
10
|
-
Then /^I should get the resized image$/ do
|
11
|
-
resized_image = Magick::Image.read('features/support/files/test.jpg').first.resize!(200, 200).to_blob
|
12
8
|
@retrieved_image.should == resized_image
|
13
9
|
last_response.status.should == 200
|
14
10
|
end
|
data/gems.yml
CHANGED
data/gems_dev.yml
CHANGED
@@ -1,14 +1,11 @@
|
|
1
|
-
- :name: activesupport
|
2
|
-
:version: = 2.3.4
|
3
|
-
|
4
1
|
- :name: rspec
|
5
2
|
:version: = 1.2.9
|
6
3
|
|
7
4
|
- :name: cucumber
|
8
|
-
:version: = 0.4.
|
5
|
+
:version: = 0.4.4
|
9
6
|
|
10
7
|
- :name: rack-test
|
11
|
-
:version: = 0.5.
|
8
|
+
:version: = 0.5.1
|
12
9
|
|
13
10
|
- :name: yard
|
14
11
|
:version: >= 0
|
data/lib/mugshot/application.rb
CHANGED
@@ -2,6 +2,9 @@ require 'sinatra/base'
|
|
2
2
|
|
3
3
|
class Mugshot::Application < Sinatra::Base
|
4
4
|
|
5
|
+
set :static, true
|
6
|
+
set :public, ::File.expand_path(::File.join(::File.dirname(__FILE__), "public"))
|
7
|
+
|
5
8
|
before do
|
6
9
|
content_type :jpg
|
7
10
|
end
|
@@ -13,12 +16,11 @@ class Mugshot::Application < Sinatra::Base
|
|
13
16
|
|
14
17
|
get '/:size/:id.:ext' do |size, id, ext|
|
15
18
|
image = @storage.read(id)
|
19
|
+
|
16
20
|
halt 404 if image.nil?
|
17
21
|
|
18
22
|
dimm = Mugshot::Dimension.parse!(size)
|
19
|
-
|
20
|
-
image.resize_to_fit! *dimm.size if dimm.will_keep_aspect?
|
21
|
-
image.resize! *dimm.size unless dimm.will_keep_aspect?
|
23
|
+
image.resize! dimm
|
22
24
|
image.to_blob
|
23
25
|
end
|
24
26
|
|
@@ -28,11 +30,6 @@ class Mugshot::Application < Sinatra::Base
|
|
28
30
|
image.to_blob
|
29
31
|
end
|
30
32
|
|
31
|
-
get '/_status' do
|
32
|
-
content_type :html
|
33
|
-
"OK"
|
34
|
-
end
|
35
|
-
|
36
33
|
protected
|
37
34
|
|
38
35
|
def initialize(storage)
|
data/lib/mugshot/dimension.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
class Mugshot::Dimension
|
2
2
|
attr_reader :width, :height
|
3
3
|
|
4
|
-
def self.parse!(
|
5
|
-
|
6
|
-
|
4
|
+
def self.parse!(size)
|
5
|
+
size = /(\d*)x(\d*)/.match(size)
|
6
|
+
width = size[1].to_i if size[1].present?
|
7
|
+
height = size[2].to_i if size[2].present?
|
8
|
+
new(width, height)
|
7
9
|
end
|
8
10
|
|
9
11
|
def to_s
|
@@ -15,7 +17,7 @@ class Mugshot::Dimension
|
|
15
17
|
end
|
16
18
|
|
17
19
|
def will_keep_aspect?
|
18
|
-
(@width ==
|
20
|
+
(@width == nil) || (@height == nil)
|
19
21
|
end
|
20
22
|
|
21
23
|
def initialize (width, height)
|
data/lib/mugshot/image.rb
CHANGED
@@ -1,11 +1,7 @@
|
|
1
1
|
class Mugshot::Image
|
2
|
-
def resize!(
|
3
|
-
|
4
|
-
@image.resize! width, height
|
5
|
-
end
|
6
|
-
|
7
|
-
def resize_to_fit!(width, height = nil)
|
8
|
-
@image.resize_to_fit!(width)
|
2
|
+
def resize!(dimension)
|
3
|
+
return @image.resize_to_fit! *dimension.size if dimension.will_keep_aspect?
|
4
|
+
@image.resize! dimension.width, dimension.height
|
9
5
|
end
|
10
6
|
|
11
7
|
def to_blob
|
@@ -13,7 +9,8 @@ class Mugshot::Image
|
|
13
9
|
end
|
14
10
|
|
15
11
|
protected
|
12
|
+
|
16
13
|
def initialize(file)
|
17
14
|
@image = Magick::Image.read(file).first
|
18
15
|
end
|
19
|
-
end
|
16
|
+
end
|
data/mugshot.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Cain\303\243 Nunes", "Fabr\303\255cio Lopes", "Fernando Meyer", "Guilherme Cirne", "Jos\303\251 Peleteiro"]
|
12
|
-
s.date = %q{2009-11-
|
12
|
+
s.date = %q{2009-11-30}
|
13
13
|
s.description = %q{Image server}
|
14
14
|
s.email = ["cainanunes@gmail.com", "fabriciolopesvital@gmail.com", "fmcamargo@gmail.com", "gcirne@gmail.com", "jose@peleteiro.net"]
|
15
15
|
s.extra_rdoc_files = [
|
@@ -26,8 +26,10 @@ Gem::Specification.new do |s|
|
|
26
26
|
"config.ru",
|
27
27
|
"features/retrieve_original_image.feature",
|
28
28
|
"features/retrieve_resized_image.feature",
|
29
|
+
"features/retrieve_resized_image_keeping_aspect_ratio.feature",
|
29
30
|
"features/step_definitions/general_steps.rb",
|
30
31
|
"features/step_definitions/retrieve_original_image_steps.rb",
|
32
|
+
"features/step_definitions/retrieve_resized_image_keeping_aspect_ratio_steps.rb",
|
31
33
|
"features/step_definitions/retrieve_resized_image_steps.rb",
|
32
34
|
"features/support/env.rb",
|
33
35
|
"features/support/files/test.jpg",
|
@@ -40,6 +42,7 @@ Gem::Specification.new do |s|
|
|
40
42
|
"lib/mugshot/image.rb",
|
41
43
|
"lib/mugshot/storage.rb",
|
42
44
|
"mugshot.gemspec",
|
45
|
+
"public/crossdomain.xml",
|
43
46
|
"spec/files/test.jpg",
|
44
47
|
"spec/mugshot/application_spec.rb",
|
45
48
|
"spec/mugshot/dimension_spec.rb",
|
@@ -67,35 +70,32 @@ Gem::Specification.new do |s|
|
|
67
70
|
s.specification_version = 3
|
68
71
|
|
69
72
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
70
|
-
s.add_runtime_dependency(%q<activesupport>, ["= 2.3.
|
73
|
+
s.add_runtime_dependency(%q<activesupport>, ["= 2.3.5"])
|
71
74
|
s.add_runtime_dependency(%q<rmagick>, ["= 2.12.2"])
|
72
75
|
s.add_runtime_dependency(%q<sinatra>, ["= 0.9.4"])
|
73
76
|
s.add_runtime_dependency(%q<uuid>, ["= 2.0.2"])
|
74
|
-
s.add_development_dependency(%q<activesupport>, ["= 2.3.4"])
|
75
77
|
s.add_development_dependency(%q<rspec>, ["= 1.2.9"])
|
76
|
-
s.add_development_dependency(%q<cucumber>, ["= 0.4.
|
77
|
-
s.add_development_dependency(%q<rack-test>, ["= 0.5.
|
78
|
+
s.add_development_dependency(%q<cucumber>, ["= 0.4.4"])
|
79
|
+
s.add_development_dependency(%q<rack-test>, ["= 0.5.1"])
|
78
80
|
s.add_development_dependency(%q<yard>, [">= 0"])
|
79
81
|
else
|
80
|
-
s.add_dependency(%q<activesupport>, ["= 2.3.
|
82
|
+
s.add_dependency(%q<activesupport>, ["= 2.3.5"])
|
81
83
|
s.add_dependency(%q<rmagick>, ["= 2.12.2"])
|
82
84
|
s.add_dependency(%q<sinatra>, ["= 0.9.4"])
|
83
85
|
s.add_dependency(%q<uuid>, ["= 2.0.2"])
|
84
|
-
s.add_dependency(%q<activesupport>, ["= 2.3.4"])
|
85
86
|
s.add_dependency(%q<rspec>, ["= 1.2.9"])
|
86
|
-
s.add_dependency(%q<cucumber>, ["= 0.4.
|
87
|
-
s.add_dependency(%q<rack-test>, ["= 0.5.
|
87
|
+
s.add_dependency(%q<cucumber>, ["= 0.4.4"])
|
88
|
+
s.add_dependency(%q<rack-test>, ["= 0.5.1"])
|
88
89
|
s.add_dependency(%q<yard>, [">= 0"])
|
89
90
|
end
|
90
91
|
else
|
91
|
-
s.add_dependency(%q<activesupport>, ["= 2.3.
|
92
|
+
s.add_dependency(%q<activesupport>, ["= 2.3.5"])
|
92
93
|
s.add_dependency(%q<rmagick>, ["= 2.12.2"])
|
93
94
|
s.add_dependency(%q<sinatra>, ["= 0.9.4"])
|
94
95
|
s.add_dependency(%q<uuid>, ["= 2.0.2"])
|
95
|
-
s.add_dependency(%q<activesupport>, ["= 2.3.4"])
|
96
96
|
s.add_dependency(%q<rspec>, ["= 1.2.9"])
|
97
|
-
s.add_dependency(%q<cucumber>, ["= 0.4.
|
98
|
-
s.add_dependency(%q<rack-test>, ["= 0.5.
|
97
|
+
s.add_dependency(%q<cucumber>, ["= 0.4.4"])
|
98
|
+
s.add_dependency(%q<rack-test>, ["= 0.5.1"])
|
99
99
|
s.add_dependency(%q<yard>, [">= 0"])
|
100
100
|
end
|
101
101
|
end
|
@@ -8,12 +8,6 @@ describe Mugshot::Application do
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
describe 'GET /_status' do
|
12
|
-
get '/_status'
|
13
|
-
last_response.status.should == 200
|
14
|
-
last_response.body.should == 'OK'
|
15
|
-
end
|
16
|
-
|
17
11
|
describe 'POST /' do
|
18
12
|
it "should create image" do
|
19
13
|
file_read = nil
|
@@ -36,9 +30,12 @@ describe Mugshot::Application do
|
|
36
30
|
|
37
31
|
describe 'GET /:size/:id.:ext' do
|
38
32
|
it 'should return resized image' do
|
39
|
-
|
33
|
+
dimension = mock(Mugshot::Dimension)
|
34
|
+
Mugshot::Dimension.stub!(:parse!).with('200x200').and_return(dimension)
|
35
|
+
|
36
|
+
image = mock(Mugshot::Image)
|
40
37
|
image.stub!(:to_blob).and_return('image data')
|
41
|
-
image.should_receive(:resize!).with(
|
38
|
+
image.should_receive(:resize!).with(dimension)
|
42
39
|
@storage.stub!(:read).with('batata').and_return(image)
|
43
40
|
|
44
41
|
get '/200x200/batata.jpg'
|
@@ -60,7 +57,7 @@ describe Mugshot::Application do
|
|
60
57
|
|
61
58
|
describe "GET /:id" do
|
62
59
|
it "should return original image" do
|
63
|
-
image = mock(
|
60
|
+
image = mock(Mugshot::Image)
|
64
61
|
image.stub!(:to_blob).and_return('image data')
|
65
62
|
@storage.stub!(:read).with('batata').and_return(image)
|
66
63
|
|
@@ -6,16 +6,16 @@ describe Mugshot::Dimension do
|
|
6
6
|
end
|
7
7
|
|
8
8
|
it "should parse a single left value" do
|
9
|
-
Mugshot::Dimension.parse!("100x").size.should == [100,
|
9
|
+
Mugshot::Dimension.parse!("100x").size.should == [100, nil]
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should parse a single right value" do
|
13
|
-
Mugshot::Dimension.parse!("x100").size.should == [
|
13
|
+
Mugshot::Dimension.parse!("x100").size.should == [nil, 100]
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should keep aspect" do
|
17
|
-
Mugshot::Dimension.parse!("x100").will_keep_aspect?.should
|
18
|
-
Mugshot::Dimension.parse!("100x").will_keep_aspect?.should
|
17
|
+
Mugshot::Dimension.parse!("x100").will_keep_aspect?.should be_true
|
18
|
+
Mugshot::Dimension.parse!("100x").will_keep_aspect?.should be_true
|
19
19
|
end
|
20
20
|
|
21
21
|
it "should parse and convert" do
|
data/spec/mugshot/image_spec.rb
CHANGED
@@ -13,23 +13,22 @@ describe Mugshot::Image do
|
|
13
13
|
@magick_image.stub!(:to_blob).and_return(blob_data)
|
14
14
|
@image.to_blob.should == blob_data
|
15
15
|
end
|
16
|
-
|
17
|
-
it 'should resize image' do
|
18
|
-
width = 300
|
19
|
-
height = 200
|
20
|
-
@magick_image.should_receive(:resize!).with(width, height)
|
21
|
-
@image.resize! width, height
|
22
|
-
end
|
23
16
|
|
24
|
-
it "should resize image
|
25
|
-
@magick_image.should_receive(:resize!).with(300, 200)
|
17
|
+
it "should resize image to given width and height" do
|
18
|
+
@magick_image.should_receive(:resize!).with(300, 200)
|
26
19
|
dim = Mugshot::Dimension.parse!("300x200")
|
27
|
-
@image.resize!
|
20
|
+
@image.resize! dim
|
28
21
|
end
|
29
22
|
|
30
|
-
it
|
31
|
-
@magick_image.should_receive(:resize_to_fit!).with(300)
|
23
|
+
it 'should resize image to fit given width' do
|
24
|
+
@magick_image.should_receive(:resize_to_fit!).with(300, nil)
|
32
25
|
dim = Mugshot::Dimension.parse!("300x")
|
33
|
-
@image.
|
34
|
-
end
|
26
|
+
@image.resize! dim
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should resize image to fit given height' do
|
30
|
+
@magick_image.should_receive(:resize_to_fit!).with(nil, 200)
|
31
|
+
dim = Mugshot::Dimension.parse!("x200")
|
32
|
+
@image.resize! dim
|
33
|
+
end
|
35
34
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mugshot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Cain\xC3\xA3 Nunes"
|
@@ -13,7 +13,7 @@ autorequire:
|
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
15
|
|
16
|
-
date: 2009-
|
16
|
+
date: 2009-12-04 00:00:00 -02:00
|
17
17
|
default_executable:
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
@@ -24,7 +24,7 @@ dependencies:
|
|
24
24
|
requirements:
|
25
25
|
- - "="
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: 2.3.
|
27
|
+
version: 2.3.5
|
28
28
|
version:
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: rmagick
|
@@ -56,16 +56,6 @@ dependencies:
|
|
56
56
|
- !ruby/object:Gem::Version
|
57
57
|
version: 2.0.2
|
58
58
|
version:
|
59
|
-
- !ruby/object:Gem::Dependency
|
60
|
-
name: activesupport
|
61
|
-
type: :development
|
62
|
-
version_requirement:
|
63
|
-
version_requirements: !ruby/object:Gem::Requirement
|
64
|
-
requirements:
|
65
|
-
- - "="
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version: 2.3.4
|
68
|
-
version:
|
69
59
|
- !ruby/object:Gem::Dependency
|
70
60
|
name: rspec
|
71
61
|
type: :development
|
@@ -84,7 +74,7 @@ dependencies:
|
|
84
74
|
requirements:
|
85
75
|
- - "="
|
86
76
|
- !ruby/object:Gem::Version
|
87
|
-
version: 0.4.
|
77
|
+
version: 0.4.4
|
88
78
|
version:
|
89
79
|
- !ruby/object:Gem::Dependency
|
90
80
|
name: rack-test
|
@@ -94,7 +84,7 @@ dependencies:
|
|
94
84
|
requirements:
|
95
85
|
- - "="
|
96
86
|
- !ruby/object:Gem::Version
|
97
|
-
version: 0.5.
|
87
|
+
version: 0.5.1
|
98
88
|
version:
|
99
89
|
- !ruby/object:Gem::Dependency
|
100
90
|
name: yard
|
@@ -130,8 +120,10 @@ files:
|
|
130
120
|
- config.ru
|
131
121
|
- features/retrieve_original_image.feature
|
132
122
|
- features/retrieve_resized_image.feature
|
123
|
+
- features/retrieve_resized_image_keeping_aspect_ratio.feature
|
133
124
|
- features/step_definitions/general_steps.rb
|
134
125
|
- features/step_definitions/retrieve_original_image_steps.rb
|
126
|
+
- features/step_definitions/retrieve_resized_image_keeping_aspect_ratio_steps.rb
|
135
127
|
- features/step_definitions/retrieve_resized_image_steps.rb
|
136
128
|
- features/support/env.rb
|
137
129
|
- features/support/files/test.jpg
|
@@ -142,6 +134,7 @@ files:
|
|
142
134
|
- lib/mugshot/dimension.rb
|
143
135
|
- lib/mugshot/fs_storage.rb
|
144
136
|
- lib/mugshot/image.rb
|
137
|
+
- lib/mugshot/public/crossdomain.xml
|
145
138
|
- lib/mugshot/storage.rb
|
146
139
|
- mugshot.gemspec
|
147
140
|
- spec/files/test.jpg
|