ob64 0.1.0 → 0.5.0

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.
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