ob64 0.1.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +20 -4
  3. data/.gitignore +2 -0
  4. data/CHANGELOG.md +18 -1
  5. data/{LICENSE.txt → LICENSE} +1 -1
  6. data/README.md +34 -2
  7. data/benchmark.rb +42 -3
  8. data/ext/ob64/ob64_ext.c +5 -3
  9. data/lib/ob64/core_ext.rb +2 -0
  10. data/lib/ob64/version.rb +1 -1
  11. data/lib/ob64.rb +52 -0
  12. data/ob64.gemspec +12 -6
  13. data/vendor/libbase64/.gitignore +12 -0
  14. data/vendor/libbase64/.travis.yml +71 -0
  15. data/vendor/libbase64/CMakeLists.txt +264 -0
  16. data/vendor/libbase64/LICENSE +28 -0
  17. data/vendor/libbase64/Makefile +93 -0
  18. data/vendor/libbase64/README.md +474 -0
  19. data/vendor/libbase64/base64-benchmarks.png +0 -0
  20. data/vendor/libbase64/bin/base64.c +132 -0
  21. data/vendor/libbase64/cmake/Modules/TargetArch.cmake +29 -0
  22. data/vendor/libbase64/cmake/Modules/TargetSIMDInstructionSet.cmake +34 -0
  23. data/vendor/libbase64/cmake/base64-config.cmake.in +5 -0
  24. data/vendor/libbase64/cmake/config.h.in +25 -0
  25. data/vendor/libbase64/cmake/test-arch.c +35 -0
  26. data/vendor/libbase64/include/libbase64.h +145 -0
  27. data/vendor/libbase64/lib/arch/avx/codec.c +42 -0
  28. data/vendor/libbase64/lib/arch/avx2/codec.c +42 -0
  29. data/vendor/libbase64/lib/arch/avx2/dec_loop.c +110 -0
  30. data/vendor/libbase64/lib/arch/avx2/dec_reshuffle.c +34 -0
  31. data/vendor/libbase64/lib/arch/avx2/enc_loop.c +89 -0
  32. data/vendor/libbase64/lib/arch/avx2/enc_reshuffle.c +83 -0
  33. data/vendor/libbase64/lib/arch/avx2/enc_translate.c +30 -0
  34. data/vendor/libbase64/lib/arch/generic/32/dec_loop.c +86 -0
  35. data/vendor/libbase64/lib/arch/generic/32/enc_loop.c +73 -0
  36. data/vendor/libbase64/lib/arch/generic/64/enc_loop.c +77 -0
  37. data/vendor/libbase64/lib/arch/generic/codec.c +39 -0
  38. data/vendor/libbase64/lib/arch/generic/dec_head.c +37 -0
  39. data/vendor/libbase64/lib/arch/generic/dec_tail.c +91 -0
  40. data/vendor/libbase64/lib/arch/generic/enc_head.c +24 -0
  41. data/vendor/libbase64/lib/arch/generic/enc_tail.c +34 -0
  42. data/vendor/libbase64/lib/arch/neon32/codec.c +72 -0
  43. data/vendor/libbase64/lib/arch/neon32/dec_loop.c +106 -0
  44. data/vendor/libbase64/lib/arch/neon32/enc_loop.c +58 -0
  45. data/vendor/libbase64/lib/arch/neon32/enc_reshuffle.c +54 -0
  46. data/vendor/libbase64/lib/arch/neon32/enc_translate.c +57 -0
  47. data/vendor/libbase64/lib/arch/neon64/codec.c +70 -0
  48. data/vendor/libbase64/lib/arch/neon64/dec_loop.c +129 -0
  49. data/vendor/libbase64/lib/arch/neon64/enc_loop.c +66 -0
  50. data/vendor/libbase64/lib/arch/neon64/enc_reshuffle.c +54 -0
  51. data/vendor/libbase64/lib/arch/sse41/codec.c +42 -0
  52. data/vendor/libbase64/lib/arch/sse42/codec.c +42 -0
  53. data/vendor/libbase64/lib/arch/ssse3/codec.c +42 -0
  54. data/vendor/libbase64/lib/arch/ssse3/dec_loop.c +173 -0
  55. data/vendor/libbase64/lib/arch/ssse3/dec_reshuffle.c +33 -0
  56. data/vendor/libbase64/lib/arch/ssse3/enc_loop.c +67 -0
  57. data/vendor/libbase64/lib/arch/ssse3/enc_reshuffle.c +48 -0
  58. data/vendor/libbase64/lib/arch/ssse3/enc_translate.c +33 -0
  59. data/vendor/libbase64/lib/codec_choose.c +281 -0
  60. data/vendor/libbase64/lib/codecs.h +65 -0
  61. data/vendor/libbase64/lib/env.h +67 -0
  62. data/vendor/libbase64/lib/exports.txt +7 -0
  63. data/vendor/libbase64/lib/lib.c +164 -0
  64. data/vendor/libbase64/lib/lib_openmp.c +149 -0
  65. data/vendor/libbase64/lib/tables/.gitignore +1 -0
  66. data/vendor/libbase64/lib/tables/Makefile +17 -0
  67. data/vendor/libbase64/lib/tables/table_dec_32bit.h +393 -0
  68. data/vendor/libbase64/lib/tables/table_enc_12bit.h +1031 -0
  69. data/vendor/libbase64/lib/tables/table_enc_12bit.py +45 -0
  70. data/vendor/libbase64/lib/tables/table_generator.c +184 -0
  71. data/vendor/libbase64/lib/tables/tables.c +40 -0
  72. data/vendor/libbase64/lib/tables/tables.h +23 -0
  73. metadata +67 -6
  74. data/.byebug_history +0 -72
  75. data/.envrc +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1d1111a285be1731afda3a4b3040eb9150109a6022eaea13d007004e5d51dcfe
4
- data.tar.gz: e3a298f4286ac95e6656cd0ba0fdebefa1e7f180eec6f4ca0b3f7def4de64122
3
+ metadata.gz: cf866c04fac9e6cf9d4f8c98741f17e2109e0bd5fd545d2d0482b4c28a6dd61a
4
+ data.tar.gz: e6ee12aebbece01e6e1ce8181aafdfe9b32b7fbd2d1307c07d7af02d46b73f4e
5
5
  SHA512:
6
- metadata.gz: b5992c541b3d46c846bb3e22f8e7e01aed89b8a8760ce3ca401263ebfebbd9130cfba69eacee46e288fdba44ed5319ee1086ff55e9e0b0b6791254def2577632
7
- data.tar.gz: 3e77098bab5a772fdab9cf3cc0d987ee18e7a64748dd3fda9bc970cc29b15e48f2fa6b2f24d1ba9b8bb4e41c24bea9fac4041834214d638a17bf0b7c2776fe5b
6
+ metadata.gz: 280e35ae08985662cc05a26c5f30ef5e9897b8d7a641a83e7a0bc8bf91a1790dbf8c36f5129ff7dface1e5eeb8d286ef43387688202b26a254a6bad860faa65d
7
+ data.tar.gz: f246fed35467cce900ffb7664ca62012c6d0e7bda5c2180a99814fba558331f83ab33d21a1868a0d850fa39b59eec223e39445584703f0302f339e159ce9be83
@@ -10,9 +10,25 @@ jobs:
10
10
  ruby: ['2.5', '2.6', '2.7', '3.0']
11
11
  runs-on: ubuntu-latest
12
12
  steps:
13
- - uses: actions/checkout@v2
14
- - uses: ruby/setup-ruby@v1
13
+ - name: repository checkout
14
+ uses: actions/checkout@v2
15
+ with:
16
+ submodules: true
17
+
18
+ - name: load ruby
19
+ uses: ruby/setup-ruby@v1
15
20
  with:
16
21
  ruby-version: ${{ matrix.ruby }}
17
- bundler-cache: false
18
- - run: bundle exec rake spec
22
+
23
+ - name: RubyGems, Bundler Update
24
+ run: gem update --system --no-document --conservative
25
+
26
+ - name: bundle install
27
+ run: bundle install --path .bundle/gems --without development
28
+
29
+ - name: compile
30
+ run: bundle exec rake compile
31
+
32
+ - name: test
33
+ run: bundle exec rake spec
34
+ timeout-minutes: 10
data/.gitignore CHANGED
@@ -12,6 +12,8 @@
12
12
  *.a
13
13
  mkmf.log
14
14
  Gemfile.lock
15
+ .envrc
16
+ .byebug_history
15
17
 
16
18
  # rspec failure tracking
17
19
  .rspec_status
data/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  ## [Unreleased]
2
2
 
3
- ## [0.1.0] - 2021-09-21
3
+ # [0.5.0] - 2021-09-29
4
+
5
+ - Ignore all previous versions as they weren't including libbase64 (:
6
+
7
+ # [0.4.0] - 2021-09-28
8
+
9
+ - Detail gemspec. Ignore.
10
+
11
+ ## [0.3.0] - 2021-09-28
12
+
13
+ - Raise error when attempting to get the base64-decoded length of an invalid (in
14
+ length) base64-encoded payload.
15
+
16
+ ## [0.2.0] - 2021-09-26
17
+
18
+ - Add yard documention
19
+
20
+ ## [0.1.0] - 2021-09-25
4
21
 
5
22
  - Initial release
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2021 Joao Fernandes
3
+ Copyright (c) 2021 João Fernandes
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Ob64 gem
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/ob64.svg)](http://rubygems.org/gems/ob64)
4
+ [![Build Status](https://github.com/jcmfernandes/ob64/workflows/Test/badge.svg?branch=master&event=push)](https://github.com/jcmfernandes/ob64/actions?query=workflow:Test)
5
+ [![Yard Docs](https://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/gems/ob64/0.5.0)
6
+
3
7
  A *fast* Base64 encoder and decoder as a Ruby gem.
4
8
 
5
9
  How fast? Try it yourself, execute:
@@ -39,7 +43,6 @@ require "ob64"
39
43
 
40
44
  bin1 = "This is data!"
41
45
  string = Ob64.encode(bin1)
42
-
43
46
  # string = "VGhpcyBpcyBkYXRhIQ=="
44
47
 
45
48
  bin2 = Ob64.decode(string)
@@ -82,7 +85,36 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/jcmfer
82
85
 
83
86
  ## License
84
87
 
85
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
88
+ Released under the MIT License. See [{file:LICENSE}](LICENSE).
89
+
90
+ Copyright (c) 2021, João Fernandes
91
+
92
+ Permission is hereby granted, free of charge, to any person obtaining a copy
93
+ of this software and associated documentation files (the "Software"), to deal
94
+ in the Software without restriction, including without limitation the rights
95
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
96
+ copies of the Software, and to permit persons to whom the Software is
97
+ furnished to do so, subject to the following conditions:
98
+
99
+ The above copyright notice and this permission notice shall be included in
100
+ all copies or substantial portions of the Software.
101
+
102
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
103
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
104
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
105
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
106
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
107
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
108
+ THE SOFTWARE.
109
+
110
+ ### libbase64
111
+
112
+ Released under the BSD 2-clause License. See [LICENSE](https://github.com/jcmfernandes/base64-cmake/blob/feature/cmake/LICENSE).
113
+
114
+ Copyright (c) 2005-2007, Nick Galbreath
115
+ Copyright (c) 2013-2019, Alfred Klomp
116
+ Copyright (c) 2015-2017, Wojciech Mula
117
+ Copyright (c) 2016-2017, Matthieu Darbois
86
118
 
87
119
  ## Code of Conduct
88
120
 
data/benchmark.rb CHANGED
@@ -4,6 +4,11 @@ require "securerandom"
4
4
  require "ob64"
5
5
  require "base64"
6
6
 
7
+ $run_encode_benchmark = true
8
+ $run_decode_benchmark = true
9
+ $run_urlsafe_encode_benchmark = true
10
+ $run_urlsafe_decode_benchmark = true
11
+
7
12
  def to_size(bytes)
8
13
  bytes >= 2**20 ? "#{bytes / 2**20} MB" : "#{bytes / 2**10} kB"
9
14
  end
@@ -59,7 +64,7 @@ encode_benchmark do
59
64
 
60
65
  x.compare!
61
66
  end
62
- end
67
+ end if $run_encode_benchmark
63
68
 
64
69
  decode_benchmark do
65
70
  Benchmark.ips do |x|
@@ -71,9 +76,43 @@ decode_benchmark do
71
76
  end
72
77
 
73
78
  x.report("ob64 .decode") do
74
- Ob64.encode($encoded)
79
+ Ob64.decode($encoded)
75
80
  end
76
81
 
77
82
  x.compare!
78
83
  end
79
- end
84
+ end if $run_decode_benchmark
85
+
86
+ encode_benchmark do
87
+ Benchmark.ips do |x|
88
+ x.time = 5
89
+ x.warmup = 2
90
+
91
+ x.report("base64 .urlsafe_encode64") do
92
+ Base64.urlsafe_encode64($unencoded)
93
+ end
94
+
95
+ x.report("ob64 .urlsafe_encode") do
96
+ Ob64.urlsafe_encode($unencoded)
97
+ end
98
+
99
+ x.compare!
100
+ end
101
+ end if $run_urlsafe_encode_benchmark
102
+
103
+ decode_benchmark do
104
+ Benchmark.ips do |x|
105
+ x.time = 5
106
+ x.warmup = 2
107
+
108
+ x.report("base64 .urlsafe_decode64") do
109
+ Base64.urlsafe_decode64($encoded)
110
+ end
111
+
112
+ x.report("ob64 .urlsafe_decode") do
113
+ Ob64.urlsafe_decode($encoded)
114
+ end
115
+
116
+ x.compare!
117
+ end
118
+ end if $run_urlsafe_decode_benchmark
data/ext/ob64/ob64_ext.c CHANGED
@@ -69,13 +69,15 @@ size_t __encoded_length_of(VALUE bin, bool withPadding)
69
69
 
70
70
  size_t __decoded_length_of(VALUE string)
71
71
  {
72
+ char *string_ptr = StringValuePtr(string);
72
73
  size_t string_len = RSTRING_LEN(string);
73
- if (string_len < 2) return 0;
74
-
75
74
  size_t padding = 0;
76
- char* string_ptr = StringValuePtr(string);
77
75
  if (string_ptr[string_len - 1] == '=') padding++;
78
76
  if (string_ptr[string_len - 2] == '=') padding++;
79
77
 
78
+ if ((string_len - padding) % 4 == 1) {
79
+ rb_raise(rb_eArgError, "invalid base64");
80
+ }
81
+
80
82
  return (3 * (string_len - padding)) / 4;
81
83
  }
data/lib/ob64/core_ext.rb CHANGED
@@ -24,4 +24,6 @@ module Ob64
24
24
 
25
25
  ::Base64.prepend(CoreExt)
26
26
  ::Base64.singleton_class.prepend(CoreExt)
27
+
28
+ private_constant :CoreExt
27
29
  end
data/lib/ob64/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ob64
4
- VERSION = "0.1.0"
4
+ VERSION = "0.5.0"
5
5
  end
data/lib/ob64.rb CHANGED
@@ -3,20 +3,48 @@
3
3
  require_relative "ob64/version"
4
4
  require_relative "ob64_ext"
5
5
 
6
+ # Methods for base64-encoding and -decoding strings.
6
7
  module Ob64
8
+ # The glue between Ruby and libbase64. See +../ext/libbase64/ob64/ob64_ext.c+.
9
+ module LibBase64; end
10
+
7
11
  include LibBase64
8
12
  extend LibBase64
9
13
 
10
14
  module_function
11
15
 
16
+ # Returns the Base64-encoded version of +bin+.
17
+ # This method complies with RFC 4648.
18
+ # No line feeds are added.
19
+ #
20
+ # @param bin [String]
21
+ # @return [String]
12
22
  def encode(bin)
13
23
  __encode(bin)
14
24
  end
15
25
 
26
+ # Returns the Base64-decoded version of +string+.
27
+ # This method complies with RFC 4648.
28
+ # ArgumentError is raised if +string+ is incorrectly padded or contains
29
+ # non-alphabet characters. Note that CR or LF are also rejected.
30
+ #
31
+ # @param string [String]
32
+ # @return [String]
33
+ # @raise [ArgumentError] if +string+ cannot be decoded
16
34
  def decode(string)
17
35
  __decode(string)
18
36
  end
19
37
 
38
+ # Returns the Base64-encoded version of +bin+.
39
+ # This method complies with ``Base 64 Encoding with URL and Filename Safe
40
+ # Alphabet'' in RFC 4648.
41
+ # The alphabet uses '-' instead of '+' and '_' instead of '/'.
42
+ # Note that the result can still contain '='.
43
+ # You can remove the padding by setting +padding+ as false.
44
+ #
45
+ # @param bin [String]
46
+ # @param padding [Boolean] - if the output must be padded
47
+ # @return [String]
20
48
  def urlsafe_encode(bin, padding: true)
21
49
  string = __encode(bin)
22
50
  string.chomp!("==") || string.chomp!("=") unless padding
@@ -24,6 +52,18 @@ module Ob64
24
52
  string
25
53
  end
26
54
 
55
+ # Returns the Base64-decoded version of +string+.
56
+ # This method complies with ``Base 64 Encoding with URL and Filename Safe
57
+ # Alphabet'' in RFC 4648.
58
+ # The alphabet uses '-' instead of '+' and '_' instead of '/'.
59
+ #
60
+ # The padding character is optional.
61
+ # This method accepts both correctly-padded and unpadded input.
62
+ # Note that it still rejects incorrectly-padded input.
63
+ #
64
+ # @param string [String]
65
+ # @return [String]
66
+ # @raise [ArgumentError] if +string+ cannot be decoded
27
67
  def urlsafe_decode(string)
28
68
  if !string.end_with?("=") && string.length % 4 != 0
29
69
  string = string.ljust((string.length + 3) & ~3, "=")
@@ -34,10 +74,22 @@ module Ob64
34
74
  __decode(string)
35
75
  end
36
76
 
77
+ # Returns the length of the Base64-encoded version of +bin+.
78
+ #
79
+ # @param bin [String]
80
+ # @param padding [Boolean] - if the Base64-encoded version of +bin+ will be padded
81
+ # @return [Integer]
37
82
  def encoded_length_of(bin, padding: true)
38
83
  __encoded_length_of(bin, padding)
39
84
  end
40
85
 
86
+ # Returns the length of the Base64-decoded version of +string+.
87
+ #
88
+ # ArgumentError is raised if +string+ has an invalid length.
89
+ #
90
+ # @param string [String]
91
+ # @return [Integer]
92
+ # @raise [ArgumentError] if +string+ has an invalid length
41
93
  def decoded_length_of(string)
42
94
  __decoded_length_of(string)
43
95
  end
data/ob64.gemspec CHANGED
@@ -9,20 +9,26 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["João Fernandes"]
10
10
  spec.email = ["joao.fernandes@ist.utl.pt"]
11
11
  spec.homepage = "https://github.com/jcmfernandes/ob64"
12
-
12
+ spec.license = "MIT"
13
13
  spec.summary = "A fast Base64 encoder and decoder."
14
14
  spec.description = "A fast Base64 encoder and decoder that makes use of SIMD extensions."
15
15
 
16
- spec.license = "MIT"
17
- spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
18
-
19
- spec.metadata["homepage_uri"] = spec.homepage
20
-
21
16
  # Specify which files should be added to the gem when it is released.
22
17
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
18
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
19
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
20
+ end + Dir.chdir(File.join(File.expand_path(__dir__), "vendor", "libbase64")) do
21
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }.map! { |f| "vendor/libbase64/#{f}" }
25
22
  end
26
23
  spec.require_paths = ["lib"]
27
24
  spec.extensions = ["ext/ob64/extconf.rb"]
25
+
26
+ spec.metadata = {
27
+ "homepage_uri" => spec.homepage,
28
+ "changelog_uri" => spec.homepage + "/blob/master/CHANGELOG.md",
29
+ "documentation_uri" => "https://www.rubydoc.info/gems/ob64/#{spec.version}",
30
+ "source_code_uri" => spec.homepage + "/tree/v#{spec.version}"
31
+ }
32
+
33
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
28
34
  end
@@ -0,0 +1,12 @@
1
+ *.o
2
+ bin/base64
3
+ lib/config.h
4
+ test/benchmark
5
+ test/test_base64
6
+
7
+ # visual studio symbol db, etc.
8
+ .vs/
9
+ # build directory used by CMakePresets
10
+ out/
11
+ # private cmake presets
12
+ CMakeUserPresets.json
@@ -0,0 +1,71 @@
1
+ language: c
2
+ services: docker
3
+
4
+ jobs:
5
+ allow_failures:
6
+ - os: osx
7
+ - arch: ppc64le
8
+
9
+ include:
10
+ - name: linux-amd64-gcc
11
+ os: linux
12
+ arch: amd64
13
+ compiler: gcc
14
+ script: test/ci/amd64.sh
15
+
16
+ - name: linux-amd64-gcc +openmp
17
+ os: linux
18
+ arch: amd64
19
+ compiler: gcc
20
+ env: OPENMP=1 OMP_NUM_THREADS=4
21
+ script: test/ci/amd64.sh
22
+
23
+ - name: linux-amd64-clang
24
+ os: linux
25
+ arch: amd64
26
+ compiler: clang
27
+ script: test/ci/amd64.sh
28
+
29
+ - name: linux-arm32-gcc
30
+ compiler: gcc
31
+ script: test/ci/docker-arm32.sh
32
+
33
+ - name: linux-arm32-clang
34
+ compiler: clang
35
+ script: test/ci/docker-arm32.sh
36
+
37
+ - name: linux-powerpc-gcc
38
+ compiler: gcc
39
+ script: test/ci/docker-powerpc.sh
40
+
41
+ - name: linux-arm64-gcc
42
+ os: linux
43
+ arch: arm64
44
+ compiler: gcc
45
+ env: NEON64_CFLAGS="-march=armv8-a"
46
+ script: test/ci/generic.sh
47
+
48
+ - name: linux-arm64-clang
49
+ os: linux
50
+ arch: arm64
51
+ compiler: clang
52
+ env: NEON64_CFLAGS="-march=armv8-a"
53
+ script: test/ci/generic.sh
54
+
55
+ - name: linux-s390x-gcc
56
+ os: linux
57
+ arch: s390x
58
+ compiler: gcc
59
+ script: test/ci/generic.sh
60
+
61
+ - name: linux-ppc64le-gcc
62
+ os: linux
63
+ arch: ppc64le
64
+ compiler: gcc
65
+ script: test/ci/generic.sh
66
+
67
+ - name: osx-amd64-clang
68
+ os: osx
69
+ arch: amd64
70
+ compiler: clang
71
+ script: test/ci/amd64.sh