Skip to content

Commit bb688d0

Browse files
author
Suszyński Krzysztof
committed
Support for encoding of README to valid UTF-8
1 parent 42f120d commit bb688d0

File tree

5 files changed

+86
-1
lines changed

5 files changed

+86
-1
lines changed

lib/puppet_forge_server.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ module Utils
6161
autoload :Buffer, 'puppet_forge_server/utils/buffer'
6262
autoload :Http, 'puppet_forge_server/utils/http'
6363
autoload :MarkdownRenderer, 'puppet_forge_server/utils/md_renderer'
64+
autoload :Encoding, 'puppet_forge_server/utils/encoding'
6465
end
6566

6667
module Http

lib/puppet_forge_server/api/v3/releases.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
module PuppetForgeServer::Api::V3
1818
module Releases
19+
include PuppetForgeServer::Utils::Encoding
1920
def get_releases(metadata)
2021
metadata.map do |element|
2122
author, name = element.metadata.name.split('-')
@@ -36,7 +37,7 @@ def get_releases(metadata)
3637
:file_uri => "/v3/files#{element.path}",
3738
:file_md5 => element.checksum,
3839
:deleted_at => element.deleted_at,
39-
:readme => element.readme
40+
:readme => to_utf8(element.readme)
4041
}
4142
end.uniq{|r| r[:version]}.sort_by { |r| Gem::Version.new(r[:version]) }
4243
end
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# -*- encoding: utf-8 -*-
2+
#
3+
# Copyright 2015 Centralny Osroder Informatyki (gov.pl)
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
17+
require 'iconv'
18+
19+
module PuppetForgeServer::Utils
20+
module Encoding
21+
22+
@@ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
23+
24+
# Converts give text to valid UTF-8
25+
# @param [string] text given string, can be null
26+
# @return [string] output string in utf-8
27+
def to_utf8(text)
28+
replaced = text
29+
unless replaced.nil?
30+
replaced = replaced.force_encoding("UTF-8") if is_ascii_8bit?(replaced)
31+
replaced = cleanup_utf8(replaced)
32+
end
33+
replaced
34+
end
35+
36+
private
37+
38+
def is_ascii_8bit?(text)
39+
text.encoding.name == 'ASCII-8BIT'
40+
end
41+
42+
def cleanup_utf8(text)
43+
@@ic.iconv(text)
44+
end
45+
end
46+
end

puppet-forge-server.gemspec

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,15 @@ Gem::Specification.new do |spec|
4646
spec.add_dependency 'multipart-post', '~> 2.0.0'
4747
spec.add_dependency 'redcarpet', '~> 3.3.0'
4848
spec.add_dependency 'lrucache', '~> 0.1.4'
49+
spec.add_dependency 'iconv', '~> 1.0.4'
4950

5051
spec.add_development_dependency 'rake', '~> 10.3'
5152
spec.add_development_dependency 'rspec', '~> 3.1'
5253
spec.add_development_dependency 'rspec-core', '~> 3.1'
5354
spec.add_development_dependency 'simplecov', '~> 0.11.0'
5455
spec.add_development_dependency 'rspec-stopwatch', '~> 0.1.3'
56+
spec.add_development_dependency 'pry'
57+
spec.add_development_dependency 'pry-byebug'
5558

5659
spec.required_ruby_version = '>= 1.9.3'
5760
end

spec/unit/utils/encoding_spec.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
require 'spec_helper'
2+
3+
describe 'PuppetForgeServer::Utils::Encoding' do
4+
let(:dummy_class) { Class.new { include PuppetForgeServer::Utils::Encoding } }
5+
let(:dummy) { dummy_class.new }
6+
describe '#to_utf8' do
7+
subject { dummy.to_utf8(input_text) }
8+
context 'for nil' do
9+
let(:input_text) { nil }
10+
it { expect(subject).to be_nil }
11+
end
12+
13+
context 'for valid ascii text' do
14+
let(:input_text) { 'a simple ascii text!' }
15+
it { expect(subject).to eq('a simple ascii text!') }
16+
end
17+
18+
context 'for valid utf-8 text' do
19+
let(:input_text) { 'Zażółć gęślą jażń' }
20+
it { expect(subject).to eq('Zażółć gęślą jażń') }
21+
end
22+
23+
context 'for text with ISO-8859-1 encoded as UTF-8' do
24+
let(:input_text) { "Co\xE2te d'Azur" }
25+
it { expect(subject).to eq('Cote d\'Azur') }
26+
end
27+
28+
context 'for text with UTF-8 not replaced characters' do
29+
let(:multidot) { [0xE2, 0x80, 0xA6].pack("c*") }
30+
let(:input_text) { "Read more#{multidot}" }
31+
it { expect(subject).to eq('Read more…') }
32+
end
33+
end
34+
end

0 commit comments

Comments
 (0)