tebako-runtime 0.8.1 → 0.8.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6ba52d9e206dd564fbe88cf079186d2dbfe06fad5b842cf4163230f9871c3b07
4
- data.tar.gz: 7850d54601ade1c550764b32707b37ba79aeb607b40ebb9ac47e9bb5c37a76a5
3
+ metadata.gz: d01b14a31f3d1da626501ec645ab1a8610029d326377e57e3f52addb5c0daef7
4
+ data.tar.gz: f98483c9334708b22e9a41b436a170b544b5c61fb7c146d3d5346b6243a34e56
5
5
  SHA512:
6
- metadata.gz: 9df00fb7bd933634a0348458be54624f701b3106b12c0a358c8e4603c53a309508a28cad0bfdd00cc4e761f2a346676f24d3f1ab55bd4a0d1196c7cdb2b34842
7
- data.tar.gz: 2e1c99b83a6c9b763378afc693c994d3b8b527f4a78c70de656a2709c279d5b71e4c00f81e7188edd1e15c3d2190c8690381b40b7b4281cfdc1492f1be228a9f
6
+ metadata.gz: a126bed280710c51fc9d75c40abc23a405294f73abe4b9e9427e6f9862c30dfdd5d011bcdb0755f49ec91ed2f0d7c6d646fe4bd8f032349334097bedff1946de
7
+ data.tar.gz: 4946c5291223a108a69c57fac4e916d14e87bcda175a0d288edba1962cbdd154430dd1b688b6fcdebd043f803dfff3d14fb615bd11898f2af2ac6530bd717565
data/README.adoc CHANGED
@@ -24,8 +24,6 @@ tebako-runtime (this Gem) provides support for known Gems that use system calls
24
24
  == Supported Gems
25
25
 
26
26
  * https://rubygems.org/gems/excavate/[excavate]
27
- * https://rubygems.org/gems/fiddle[fiddle]
28
- * https://rubygems.org/gems/ffi[ffi]
29
27
  * https://rubygems.org/gems/jing[jing]
30
28
  * https://rubygems.org/gems/mn2pdf[mn2pdf]
31
29
  * https://rubygems.org/gems/mnconvert[mnconvert]
@@ -1,7 +1,7 @@
1
1
  ##
2
2
  ## Bundle of CA Root Certificates
3
3
  ##
4
- ## Certificate data from Mozilla as of: Thu Jul 16 03:12:01 2026 GMT
4
+ ## Certificate data from Mozilla as of: Thu Aug 13 03:12:01 2026 GMT
5
5
  ##
6
6
  ## Find updated versions here: https://curl.se/docs/caextract.html
7
7
  ##
@@ -16,7 +16,7 @@
16
16
  ## Configure this file as the SSLCACertificateFile.
17
17
  ##
18
18
  ## Conversion done with mk-ca-bundle.pl version 1.33.
19
- ## SHA256: e57912808daef7b2b0fa4df2ccf17e47aeaf26c839a38f85c76003ebafd866bd
19
+ ## SHA256: 81b7f2576333a2e360e673f912d7b0b7a765d836c731003e348a46cac5d37198
20
20
  ##
21
21
 
22
22
 
@@ -37,37 +37,6 @@ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
37
37
  U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
38
38
  -----END CERTIFICATE-----
39
39
 
40
- ePKI Root Certification Authority
41
- =================================
42
- -----BEGIN CERTIFICATE-----
43
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
59
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
69
- -----END CERTIFICATE-----
70
-
71
40
  NetLock Arany (Class Gold) Főtanúsítvány
72
41
  ========================================
73
42
  -----BEGIN CERTIFICATE-----
@@ -585,27 +554,6 @@ vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
585
554
  9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
586
555
  -----END CERTIFICATE-----
587
556
 
588
- Atos TrustedRoot 2011
589
- =====================
590
- -----BEGIN CERTIFICATE-----
591
- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
592
- cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
593
- MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
594
- A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
595
- hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
596
- 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
597
- DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
598
- HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
599
- z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
600
- l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
601
- bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
602
- CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
603
- k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
604
- TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
605
- 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
606
- 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
607
- -----END CERTIFICATE-----
608
-
609
557
  QuoVadis Root CA 1 G3
610
558
  =====================
611
559
  -----BEGIN CERTIFICATE-----
@@ -2908,3 +2856,95 @@ CgYIKoZIzj0EAwQDgYsAMIGHAkIBLdqu9S54tma4n7Zwf2Z0z+yOfP7AAXmazlIC58PRDHpty7Ve
2908
2856
  7hekm9sEdu4pKeiv+62sUvTXK9Z3hBC9xdIoaDQCQTV2WnXzkoYI9bIeCvZlC9p2x1L/Cx6AcCIw
2909
2857
  wzPbGO2E14vs7dOoY4G1VnxHx1YwlGhza9IuqbnZLBwpvQy6uWWL
2910
2858
  -----END CERTIFICATE-----
2859
+
2860
+ SECOM TLS RSA Root CA 2024
2861
+ ==========================
2862
+ -----BEGIN CERTIFICATE-----
2863
+ MIIFmjCCA4KgAwIBAgIJAO6JNNDLgOCyMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAkpQMSYw
2864
+ JAYDVQQKEx1TRUNPTSBUcnVzdCBTeXN0ZW1zIENvLiwgTHRkLjEjMCEGA1UEAxMaU0VDT00gVExT
2865
+ IFJTQSBSb290IENBIDIwMjQwHhcNMjQwMTMxMDUxMTU1WhcNNDkwMTE0MDUxMTU1WjBaMQswCQYD
2866
+ VQQGEwJKUDEmMCQGA1UEChMdU0VDT00gVHJ1c3QgU3lzdGVtcyBDby4sIEx0ZC4xIzAhBgNVBAMT
2867
+ GlNFQ09NIFRMUyBSU0EgUm9vdCBDQSAyMDI0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC
2868
+ AgEA4TjizUwzxbInq8Tx11gaFYNk5fO+34y7TyM4neh0UgL5JIZbJNLTz2x//L/B71+5m6X6nGIr
2869
+ 7d4lFJBGtjO677hXOz93zkcWaUTm3VbOAjBlt4YWxlcccBHXuZ7o3Q+4R+ormrBdHeJ1CTUEG8tt
2870
+ QbKIl3G7OZYbnH8/pP8cjPub/0kDVNuMzp7xsVRROOisQt53fMoJLlYgoebbuMphOqMCtjkJ7R6e
2871
+ fEMfLp8UAVi9ZaLRn76ET/CJkk925nduuufC4BatS4mnXFmxN0vUXb0ij9B8O/D8gixQEsVSD4GK
2872
+ 8FWRPh3bVd/6bzdkHGJjy21XI0yejVomZUbRrOfNuz0boPGV1pt18fFC39IHQEth3OFqb5NDO3L+
2873
+ A9bNqTgAyUgRmIn4ucgDc/Ri/Km3V51ueZjy1/yk0qwJVadAVVrCt56iNeXOyEvzJADGgDQ8E1Pd
2874
+ aqct8Cynz/47ReQM62vFYO08wcQkrjmX/tesiko1V1yyaf6EfPzUFzmaGy9xvkCwdbm15EdTolOj
2875
+ E0H2Vb5/APDOyCFEokiYGmXTLdAUl0wKZ4IyjkHGzy0jhpaXEXE/GJcEvI6VzEchjaBL03EJ0h9p
2876
+ G4OqeIOycKvAo3A+TbetyfsrgYyHzU0a7/qUjGat1AAq1nVljMpKqpinPTsf/d9H39FTUeJL7Tpz
2877
+ zjUCAwEAAaNjMGEwHQYDVR0OBBYEFCzrchKOWHdkNRVWNQFXB6l9DTbmMB8GA1UdIwQYMBaAFCzr
2878
+ chKOWHdkNRVWNQFXB6l9DTbmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
2879
+ SIb3DQEBDAUAA4ICAQAVwsvluSafaez5tFPR/hRTBzRxEyMMQF3XJXCVi3yegZyKoec7hmE6jx2Z
2880
+ M8KgM1kn2yJRwFXHX8zUW9nBLEDWc4wuE8LrlZqhGZM9pJQXGmGzResDJV6JgRBna+j4sA1M7yId
2881
+ lvL0sAfFXFCTRaWTD4E1V99RLrFzWfTcC+e180hDuNMpqOEo46+lMeW/Wvh7ifOQs+kiK0O2gHxQ
2882
+ DNxslSavnCs4V7l8HRDJ2La10o70Bo7VLzf1W8MBvv0VTnxB+NjT5qTAbhGFh9Gvp4BaJpmdUf0C
2883
+ 5CEP6dbQlfgxWfzYr69yVT6dPQB+GFEaY03IMY+AcBCs+om1fNxrQXt9zoofMBNFbLhvpNH/JsXW
2884
+ dGUzfNbO12uswTa5wah8LB18FTQN2/zPHYmvBEoLuyUgZ09VNLJo5YA0kXItVYkLjMe2SixzK4sc
2885
+ UHv81IK99I91DWx7FwMVKw2xgFp+ZLYB2dnpQQrqwlW64glHUcK2N9BDsnjLSxeZ+UPECh9RxH4W
2886
+ AcKiZW+cqaKMmhP2WBfR4IcR7NOL32ml11ds87hhV1CZWWFCJAcCidYZz6CZa8exzHojP9SB5RH0
2887
+ /v1KdHAisqhSjtJl/UIAHIQ48elOn8wrTdFap4Yb5aHglmMeNx+fAIhDluWVfxTO7H4dTPU+SFVR
2888
+ MLAh+wwKZfqb94nMeQ==
2889
+ -----END CERTIFICATE-----
2890
+
2891
+ SECOM TLS ECC Root CA 2024
2892
+ ==========================
2893
+ -----BEGIN CERTIFICATE-----
2894
+ MIICTDCCAdGgAwIBAgIJAIF6LO+PI3pEMAoGCCqGSM49BAMDMFoxCzAJBgNVBAYTAkpQMSYwJAYD
2895
+ VQQKEx1TRUNPTSBUcnVzdCBTeXN0ZW1zIENvLiwgTHRkLjEjMCEGA1UEAxMaU0VDT00gVExTIEVD
2896
+ QyBSb290IENBIDIwMjQwHhcNMjQwMTMxMDU1MjM0WhcNNDkwMTE0MDU1MjM0WjBaMQswCQYDVQQG
2897
+ EwJKUDEmMCQGA1UEChMdU0VDT00gVHJ1c3QgU3lzdGVtcyBDby4sIEx0ZC4xIzAhBgNVBAMTGlNF
2898
+ Q09NIFRMUyBFQ0MgUm9vdCBDQSAyMDI0MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE7NzFMtu9dzQX
2899
+ SNC12fabk0+GlC5finB3R7XaZonRUd20aFiWObtuNBCLUZSfk6QXAE55BjEXsXQ/NG8yUqicXjsu
2900
+ 9ksDK3JZBgCwLOVh6+nwJXTvso/dEj/GUYH5mBdoo2MwYTAdBgNVHQ4EFgQUO3YReyl04k4GTFaC
2901
+ QNAhL3qzydUwHwYDVR0jBBgwFoAUO3YReyl04k4GTFaCQNAhL3qzydUwDgYDVR0PAQH/BAQDAgEG
2902
+ MA8GA1UdEwEB/wQFMAMBAf8wCgYIKoZIzj0EAwMDaQAwZgIxAN3ib8fi1pMYtAPjMilB5e5/H+t5
2903
+ CL0xPL+cZ5oTTZuSCjpAn1v7F/VAr8bFxQXAowIxAKsBVO1ACFp7skwzPvdv1EUY5a897WGLT4lb
2904
+ +bjxFAWyl8wDcZJdwGZ/pAHxt1AJ1g==
2905
+ -----END CERTIFICATE-----
2906
+
2907
+ Telia EC TLS Root CA v3
2908
+ =======================
2909
+ -----BEGIN CERTIFICATE-----
2910
+ MIICMjCCAbegAwIBAgIPAYvSIlRjTQSLbOVHH9K1MAoGCCqGSM49BAMDMEoxCzAJBgNVBAYTAlNF
2911
+ MRkwFwYDVQQKDBBUZWxpYSBDb21wYW55IEFCMSAwHgYDVQQDDBdUZWxpYSBFQyBUTFMgUm9vdCBD
2912
+ QSB2MzAeFw0yMzExMTUwODU1MjZaFw00ODA1MjMxMTAwMDBaMEoxCzAJBgNVBAYTAlNFMRkwFwYD
2913
+ VQQKDBBUZWxpYSBDb21wYW55IEFCMSAwHgYDVQQDDBdUZWxpYSBFQyBUTFMgUm9vdCBDQSB2MzB2
2914
+ MBAGByqGSM49AgEGBSuBBAAiA2IABMHIlhVDLbmFKUpW0iK4dpryT6emYOeS31JPwWnWPmkWRrAk
2915
+ TbPX40sQfHI9mpR7Rbktu3ngg6W+BBSXSechtMCnBmWXj/EaVlmV5cY1jD2HoTfhBQ3AacpCNMLJ
2916
+ K4NpZaNjMGEwHwYDVR0jBBgwFoAU1GToQ4g6cy/QGnGCNgtehd7H3kMwHQYDVR0OBBYEFNRk6EOI
2917
+ OnMv0BpxgjYLXoXex95DMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49
2918
+ BAMDA2kAMGYCMQCXAUdS/9bbJ8A1JYaGf/bWt/s7Ta0ot5Ulno8OjSNYRWQIlS4tVWldvTAVA7he
2919
+ OFgCMQCvKr8+Z2Rn+OBr5UHzlgBObpad1LuwNTRcdNgUJxIWadcki+UBLEi1/AURKV5md2M=
2920
+ -----END CERTIFICATE-----
2921
+
2922
+ Telia RSA TLS Root CA v3
2923
+ ========================
2924
+ -----BEGIN CERTIFICATE-----
2925
+ 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
2950
+ -----END CERTIFICATE-----
@@ -26,5 +26,5 @@
26
26
  # POSSIBILITY OF SUCH DAMAGE.
27
27
 
28
28
  module TebakoRuntime
29
- VERSION = "0.8.1"
29
+ VERSION = "0.8.2"
30
30
  end
@@ -42,11 +42,6 @@ module TebakoRuntime
42
42
  }.freeze
43
43
 
44
44
  POST_REQUIRE_MAP = {
45
- "ffi" => "tebako-runtime/adapters/ffi",
46
- "fiddle" => "tebako-runtime/adapters/fiddle",
47
- "jing" => "tebako-runtime/adapters/jing",
48
- "mn2pdf" => "tebako-runtime/adapters/mn2pdf",
49
- "mnconvert" => "tebako-runtime/adapters/mnconvert",
50
45
  "net/http" => "tebako-runtime/adapters/net-http",
51
46
  "sassc" => "tebako-runtime/adapters/sassc",
52
47
  "sinatra" => "tebako-runtime/adapters/sinatra"
@@ -62,9 +62,6 @@ Gem::Specification.new do |spec|
62
62
 
63
63
  spec.add_development_dependency "ffi", "~> 1.15"
64
64
  spec.add_development_dependency "fiddle", "~> 1.0"
65
- spec.add_development_dependency "mn2pdf", "~> 1.79"
66
- spec.add_development_dependency "mnconvert", "~> 1.54"
67
- spec.add_development_dependency "ruby-jing", "~> 0.0.3"
68
65
  spec.add_development_dependency "sassc", "~> 2.4"
69
66
  spec.add_development_dependency "simplecov"
70
67
  spec.add_development_dependency "simplecov-cobertura"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tebako-runtime
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
@@ -93,48 +93,6 @@ dependencies:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
95
  version: '1.0'
96
- - !ruby/object:Gem::Dependency
97
- name: mn2pdf
98
- requirement: !ruby/object:Gem::Requirement
99
- requirements:
100
- - - "~>"
101
- - !ruby/object:Gem::Version
102
- version: '1.79'
103
- type: :development
104
- prerelease: false
105
- version_requirements: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - "~>"
108
- - !ruby/object:Gem::Version
109
- version: '1.79'
110
- - !ruby/object:Gem::Dependency
111
- name: mnconvert
112
- requirement: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - "~>"
115
- - !ruby/object:Gem::Version
116
- version: '1.54'
117
- type: :development
118
- prerelease: false
119
- version_requirements: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - "~>"
122
- - !ruby/object:Gem::Version
123
- version: '1.54'
124
- - !ruby/object:Gem::Dependency
125
- name: ruby-jing
126
- requirement: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - "~>"
129
- - !ruby/object:Gem::Version
130
- version: 0.0.3
131
- type: :development
132
- prerelease: false
133
- version_requirements: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - "~>"
136
- - !ruby/object:Gem::Version
137
- version: 0.0.3
138
96
  - !ruby/object:Gem::Dependency
139
97
  name: sassc
140
98
  requirement: !ruby/object:Gem::Requirement
@@ -208,11 +166,6 @@ files:
208
166
  - bin/setup
209
167
  - lib/cert/cacert.pem.mozilla
210
168
  - lib/tebako-runtime.rb
211
- - lib/tebako-runtime/adapters/ffi.rb
212
- - lib/tebako-runtime/adapters/fiddle.rb
213
- - lib/tebako-runtime/adapters/jing.rb
214
- - lib/tebako-runtime/adapters/mn2pdf.rb
215
- - lib/tebako-runtime/adapters/mnconvert.rb
216
169
  - lib/tebako-runtime/adapters/net-http.rb
217
170
  - lib/tebako-runtime/adapters/sassc.rb
218
171
  - lib/tebako-runtime/adapters/sinatra.rb
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright (c) 2023 [Ribose Inc](https://www.ribose.com).
4
- # All rights reserved.
5
- # This file is a part of the Tebako project.
6
- #
7
- # Redistribution and use in source and binary forms, with or without
8
- # modification, are permitted provided that the following conditions
9
- # are met:
10
- # 1. Redistributions of source code must retain the above copyright
11
- # notice, this list of conditions and the following disclaimer.
12
- # 2. Redistributions in binary form must reproduce the above copyright
13
- # notice, this list of conditions and the following disclaimer in the
14
- # documentation and/or other materials provided with the distribution.
15
- #
16
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
- # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18
- # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
- # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
20
- # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
- # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
- # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
- # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
- # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
- # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
- # POSSIBILITY OF SUCH DAMAGE.
27
-
28
- require_relative "../memfs"
29
-
30
- # Wrapper for FFI.map_library_name method
31
- # If the library file to be mapped to is within memfs it is extracted to tmp folder
32
- module FFI
33
- # https://stackoverflow.com/questions/29907157/how-to-alias-a-class-method-in-rails-model/29907207
34
- singleton_class.send(:alias_method, :map_library_name_orig, :map_library_name)
35
-
36
- # http://tech.tulentsev.com/2012/02/ruby-how-to-override-class-method-with-a-module/
37
- def self.map_library_name(lib)
38
- map_library_name_orig(TebakoRuntime.extract_memfs(lib))
39
- end
40
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright (c) 2024 [Ribose Inc](https://www.ribose.com).
4
- # All rights reserved.
5
- # This file is a part of the Tebako project.
6
- #
7
- # Redistribution and use in source and binary forms, with or without
8
- # modification, are permitted provided that the following conditions
9
- # are met:
10
- # 1. Redistributions of source code must retain the above copyright
11
- # notice, this list of conditions and the following disclaimer.
12
- # 2. Redistributions in binary form must reproduce the above copyright
13
- # notice, this list of conditions and the following disclaimer in the
14
- # documentation and/or other materials provided with the distribution.
15
- #
16
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
- # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18
- # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
- # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
20
- # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
- # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
- # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
- # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
- # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
- # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
- # POSSIBILITY OF SUCH DAMAGE.
27
-
28
- require_relative "../memfs"
29
-
30
- # Wrapper for Fiddle.dlopen method
31
- # If the library file to be mapped to is within memfs it is extracted to tmp folder
32
- module Fiddle
33
- singleton_class.send(:alias_method, :dlopen_orig, :dlopen)
34
-
35
- def self.dlopen(lib)
36
- dlopen_orig(TebakoRuntime.extract_memfs(lib))
37
- end
38
- end
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright (c) 2023 [Ribose Inc](https://www.ribose.com).
4
- # All rights reserved.
5
- # This file is a part of the Tebako project.
6
- #
7
- # Redistribution and use in source and binary forms, with or without
8
- # modification, are permitted provided that the following conditions
9
- # are met:
10
- # 1. Redistributions of source code must retain the above copyright
11
- # notice, this list of conditions and the following disclaimer.
12
- # 2. Redistributions in binary form must reproduce the above copyright
13
- # notice, this list of conditions and the following disclaimer in the
14
- # documentation and/or other materials provided with the distribution.
15
- #
16
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
- # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18
- # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
- # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
20
- # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
- # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
- # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
- # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
- # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
- # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
- # POSSIBILITY OF SUCH DAMAGE.
27
-
28
- # Unpack jing.jar
29
- class Jing
30
- tmp = DEFAULT_JAR
31
- remove_const("DEFAULT_JAR") if const_defined?("DEFAULT_JAR")
32
- DEFAULT_JAR = TebakoRuntime.extract_memfs(tmp)
33
-
34
- alias original_initialize initialize
35
- alias original_validate validate
36
-
37
- def initialize(schema, options = nil)
38
- original_initialize(TebakoRuntime.extract_memfs(schema, wild: true), options)
39
- # ruby-jing captures `:default => DEFAULT_JAR` at class-load time —
40
- # before this adapter replaced the constant with the extracted host
41
- # path. Force the extracted path per-instance (a nil option hash
42
- # leaves @options empty, and the builder's stale default would win).
43
- @options[:jar] = DEFAULT_JAR
44
- # The mounted openjdk toolkit payload's java wins over PATH (the
45
- # memfs-binary exec path; the bare "java" keeps the PATH answer).
46
- @options[:java] = TebakoRuntime.mounted_exe("openjdk", "java")
47
- end
48
-
49
- def validate(xml)
50
- original_validate(TebakoRuntime.extract_memfs(xml))
51
- end
52
-
53
- # The spawn shape, array form (the stock execute() backticks a shell
54
- # string, which the tebako spawn hook deliberately skips; the mounted
55
- # java only execs through the hook from an absolute-path array spawn).
56
- def execute(options) # rubocop:disable Metrics/AbcSize
57
- cmd = [options[:java]]
58
- cmd += options[:java_opts].split if options[:java_opts]
59
- cmd += ["-jar", options[:jar].to_s]
60
- cmd << "-c" if options[:compact]
61
- cmd += ["-e", options[:encoding]] if options[:encoding]
62
- cmd << "-i" if options[:id_check]
63
- cmd += [options[:schema].to_s, options[:xmlfile].to_s]
64
- IO.popen(cmd, err: %i[child out], &:read)
65
- rescue SystemCallError => e
66
- raise ExecutionError, "jing execution failed: #{e}"
67
- end
68
- end
@@ -1,104 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright (c) 2023 [Ribose Inc](https://www.ribose.com).
4
- # All rights reserved.
5
- # This file is a part of the Tebako project.
6
- #
7
- # Redistribution and use in source and binary forms, with or without
8
- # modification, are permitted provided that the following conditions
9
- # are met:
10
- # 1. Redistributions of source code must retain the above copyright
11
- # notice, this list of conditions and the following disclaimer.
12
- # 2. Redistributions in binary form must reproduce the above copyright
13
- # notice, this list of conditions and the following disclaimer in the
14
- # documentation and/or other materials provided with the distribution.
15
- #
16
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
- # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18
- # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
- # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
20
- # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
- # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
- # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
- # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
- # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
- # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
- # POSSIBILITY OF SUCH DAMAGE.
27
-
28
- # Unpack mn2pdf.jar
29
-
30
- module TebakoRuntime
31
- MN2PDF_J_PATH = TebakoRuntime.extract_memfs(File.join(TebakoRuntime.full_gem_path("mn2pdf"), "bin",
32
- "mn2pdf.jar"))
33
- end
34
-
35
- if Mn2pdf.const_defined?("MN2PDF_JAR_PATH")
36
- module Mn2pdf
37
- remove_const("MN2PDF_JAR_PATH")
38
- MN2PDF_JAR_PATH = TebakoRuntime::MN2PDF_J_PATH
39
- end
40
- end
41
-
42
- if Jvm.const_defined?("MN2PDF_JAR_PATH")
43
- module Jvm
44
- remove_const("MN2PDF_JAR_PATH")
45
- MN2PDF_JAR_PATH = TebakoRuntime::MN2PDF_J_PATH
46
- end
47
- end
48
-
49
- module Mn2pdf
50
- singleton_class.send(:alias_method, :convert_orig, :convert)
51
- singleton_class.send(:remove_method, :convert)
52
-
53
- def self.convert(url_path, output_path, xsl_stylesheet, options)
54
- convert_orig(TebakoRuntime.extract_memfs(url_path), output_path, TebakoRuntime.extract_memfs(xsl_stylesheet),
55
- options)
56
- end
57
- end
58
-
59
- # The java resolution + the spawn shape (the memfs-binary exec path):
60
- # when the openjdk toolkit payload is mounted, its /opt/openjdk/bin/java
61
- # wins over PATH; the spawn is the ARRAY form — the shell form
62
- # (`Open3.capture3(string)`) goes through /bin/sh, which the tebako
63
- # spawn hook deliberately skips.
64
- module Jvm
65
- singleton_class.send(:alias_method, :run_orig, :run)
66
- singleton_class.send(:remove_method, :run)
67
-
68
- def self.run(args = [])
69
- java = TebakoRuntime.mounted_exe("openjdk", "java")
70
- return run_orig(args) if java == "java"
71
-
72
- # The stock form joins everything into a SHELL string: values ride
73
- # shell-quoted (whole-value and inner forms), and legacy callers pass
74
- # whole fragments in one element (`--param baseassetpath="/dir"`).
75
- # The array spawn needs shell-word rules applied — split on unquoted
76
- # spaces, shed the quotes — exactly what the shell did with the
77
- # stock string.
78
- clean = args.flat_map { |a| TebakoRuntime.shell_split(a.to_s) }
79
- cmd = [java, *options, "-jar", MN2PDF_JAR_PATH.to_s, *clean]
80
- puts cmd.join(" ")
81
- Open3.capture3(*cmd).then { |stdout, stderr, status| [stdout, stderr, status] }
82
- end
83
- end
84
-
85
- # options_to_cmd's joined form (`--param "k=v"` in ONE shell word) is
86
- # shell-string machinery; the array spawn takes flag and value as
87
- # separate elements with the shell quotes removed. Stock behavior
88
- # stands for the PATH java.
89
- module Mn2pdf
90
- singleton_class.send(:alias_method, :options_to_cmd_orig, :options_to_cmd)
91
- singleton_class.send(:remove_method, :options_to_cmd)
92
-
93
- def self.options_to_cmd(options, cmd)
94
- return options_to_cmd_orig(options, cmd) if TebakoRuntime.mounted_exe("openjdk", "java") == "java"
95
-
96
- options.each do |k, v|
97
- if k.to_s.end_with?("=")
98
- cmd << "#{k}#{v.to_s.delete('"')}"
99
- else
100
- cmd << k.to_s << v.to_s.delete('"')
101
- end
102
- end
103
- end
104
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright (c) 2023 [Ribose Inc](https://www.ribose.com).
4
- # All rights reserved.
5
- # This file is a part of the Tebako project.
6
- #
7
- # Redistribution and use in source and binary forms, with or without
8
- # modification, are permitted provided that the following conditions
9
- # are met:
10
- # 1. Redistributions of source code must retain the above copyright
11
- # notice, this list of conditions and the following disclaimer.
12
- # 2. Redistributions in binary form must reproduce the above copyright
13
- # notice, this list of conditions and the following disclaimer in the
14
- # documentation and/or other materials provided with the distribution.
15
- #
16
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
- # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18
- # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
- # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
20
- # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
- # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
- # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23
- # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24
- # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
- # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
- # POSSIBILITY OF SUCH DAMAGE.
27
-
28
- # Unpack mn2pdf.jar
29
- module MnConvert
30
- remove_const("MNCONVERT_JAR_PATH") if const_defined?("MNCONVERT_JAR_PATH")
31
- MNCONVERT_JAR_PATH = TebakoRuntime.extract_memfs(File.join(TebakoRuntime.full_gem_path("mnconvert"), "bin",
32
- "mnconvert.jar"))
33
-
34
- singleton_class.send(:alias_method, :convert_orig, :convert)
35
- singleton_class.send(:remove_method, :convert)
36
-
37
- def self.convert(input_file, opts = {})
38
- opts[:xsl_file] = TebakoRuntime.extract_memfs(opts[:xsl_file]) if opts[:xsl_file]
39
- convert_orig(TebakoRuntime.extract_memfs(input_file), opts)
40
- end
41
- end