pushizo 0.1.0 → 0.2.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.
@@ -1,96 +1,96 @@
1
- # frozen_string_literal: true
2
-
3
- module Pushizo
4
- # API hata zarfındaki error.code değerleri (HS_ önekli katalog).
5
- module ErrorCode
6
- VALIDATION_ERROR = "HS_VALIDATION_ERROR"
7
- BAD_REQUEST = "HS_BAD_REQUEST"
8
- UNAUTHENTICATED = "HS_UNAUTHENTICATED"
9
- FORBIDDEN = "HS_FORBIDDEN"
10
- TENANT_MISMATCH = "HS_TENANT_MISMATCH"
11
- NOT_FOUND = "HS_NOT_FOUND"
12
- CONFLICT = "HS_CONFLICT"
13
- IDEMPOTENCY_CONFLICT = "HS_IDEMPOTENCY_CONFLICT"
14
- IDEMPOTENCY_IN_PROGRESS = "HS_IDEMPOTENCY_IN_PROGRESS"
15
- NO_RECIPIENTS = "HS_NO_RECIPIENTS"
16
- CHANNEL_NOT_CONFIGURED = "HS_CHANNEL_NOT_CONFIGURED"
17
- CONTENT_INVALID = "HS_CONTENT_INVALID"
18
- SUBSCRIPTION_INVALID = "HS_SUBSCRIPTION_INVALID"
19
- UNPROCESSABLE = "HS_UNPROCESSABLE"
20
- RATE_LIMITED = "HS_RATE_LIMITED"
21
- QUOTA_EXCEEDED = "HS_QUOTA_EXCEEDED"
22
- INTERNAL = "HS_INTERNAL"
23
- NOT_IMPLEMENTED = "HS_NOT_IMPLEMENTED"
24
- PROVIDER_UNAVAILABLE = "HS_PROVIDER_UNAVAILABLE"
25
- SERVICE_UNAVAILABLE = "HS_SERVICE_UNAVAILABLE"
26
- # İstemci tarafı: bağlantı kurulamadı veya zaman aşımı (status 0).
27
- NETWORK = "NETWORK"
28
- end
29
-
30
- # API hata zarfından ({"error": {"code", "message", "request_id", "details"}}) türetilen istisna.
31
- # HTTP durumuna göre alt sınıflar fırlatılır (NotFoundError, RateLimitError …).
32
- class Error < StandardError
33
- attr_reader :status, :code, :request_id, :details, :retry_after
34
-
35
- def initialize(status, code, message, request_id: nil, details: nil, retry_after: nil)
36
- super(message)
37
- @status = status
38
- @code = code
39
- @request_id = request_id
40
- @details = details
41
- @retry_after = retry_after
42
- end
43
-
44
- # 429, 5xx veya ağ hatası: yeniden denenebilir.
45
- def retryable?
46
- status.zero? || status == 429 || status >= 500
47
- end
48
-
49
- def to_s
50
- suffix = request_id ? " (request_id=#{request_id})" : ""
51
- "[#{status} #{code}] #{super}#{suffix}"
52
- end
53
-
54
- # HTTP durumuna karşılık gelen sınıf.
55
- def self.class_for(status)
56
- case status
57
- when 0 then NetworkError
58
- when 400, 422 then InvalidRequestError
59
- when 401 then AuthenticationError
60
- when 403 then PermissionDeniedError
61
- when 404 then NotFoundError
62
- when 409 then ConflictError
63
- when 429 then RateLimitError
64
- else status >= 500 ? ServerError : Error
65
- end
66
- end
67
- end
68
-
69
- # Bağlantı kurulamadı veya zaman aşımı (status 0).
70
- class NetworkError < Error; end
71
- # 400 / 422: istek doğrulanamadı veya işlenemedi (details alan hatalarını içerir).
72
- class InvalidRequestError < Error; end
73
- # 401: API anahtarı eksik veya geçersiz.
74
- class AuthenticationError < Error; end
75
- # 403: anahtarın kapsamı yetersiz, IP izin listesi dışı veya kaynak başka kiracıya ait.
76
- class PermissionDeniedError < Error; end
77
- # 404: kaynak bulunamadı.
78
- class NotFoundError < Error; end
79
- # 409: kaynak çakışması veya idempotency anahtarı çakışması.
80
- class ConflictError < Error; end
81
- # 429: hız sınırı veya plan kotası aşıldı.
82
- class RateLimitError < Error; end
83
- # 5xx: sunucu veya sağlayıcı geçici olarak kullanılamıyor.
84
- class ServerError < Error; end
85
-
86
- # Webhook imzası geçersiz. reason: missing_header, malformed_header, timestamp_out_of_tolerance,
87
- # signature_mismatch veya malformed_body.
88
- class WebhookSignatureError < StandardError
89
- attr_reader :reason
90
-
91
- def initialize(reason)
92
- super("Pushizo webhook imzası geçersiz: #{reason}")
93
- @reason = reason
94
- end
95
- end
96
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Pushizo
4
+ # API hata zarfındaki error.code değerleri (HS_ önekli katalog).
5
+ module ErrorCode
6
+ VALIDATION_ERROR = "HS_VALIDATION_ERROR"
7
+ BAD_REQUEST = "HS_BAD_REQUEST"
8
+ UNAUTHENTICATED = "HS_UNAUTHENTICATED"
9
+ FORBIDDEN = "HS_FORBIDDEN"
10
+ TENANT_MISMATCH = "HS_TENANT_MISMATCH"
11
+ NOT_FOUND = "HS_NOT_FOUND"
12
+ CONFLICT = "HS_CONFLICT"
13
+ IDEMPOTENCY_CONFLICT = "HS_IDEMPOTENCY_CONFLICT"
14
+ IDEMPOTENCY_IN_PROGRESS = "HS_IDEMPOTENCY_IN_PROGRESS"
15
+ NO_RECIPIENTS = "HS_NO_RECIPIENTS"
16
+ CHANNEL_NOT_CONFIGURED = "HS_CHANNEL_NOT_CONFIGURED"
17
+ CONTENT_INVALID = "HS_CONTENT_INVALID"
18
+ SUBSCRIPTION_INVALID = "HS_SUBSCRIPTION_INVALID"
19
+ UNPROCESSABLE = "HS_UNPROCESSABLE"
20
+ RATE_LIMITED = "HS_RATE_LIMITED"
21
+ QUOTA_EXCEEDED = "HS_QUOTA_EXCEEDED"
22
+ INTERNAL = "HS_INTERNAL"
23
+ NOT_IMPLEMENTED = "HS_NOT_IMPLEMENTED"
24
+ PROVIDER_UNAVAILABLE = "HS_PROVIDER_UNAVAILABLE"
25
+ SERVICE_UNAVAILABLE = "HS_SERVICE_UNAVAILABLE"
26
+ # İstemci tarafı: bağlantı kurulamadı veya zaman aşımı (status 0).
27
+ NETWORK = "NETWORK"
28
+ end
29
+
30
+ # API hata zarfından ({"error": {"code", "message", "request_id", "details"}}) türetilen istisna.
31
+ # HTTP durumuna göre alt sınıflar fırlatılır (NotFoundError, RateLimitError …).
32
+ class Error < StandardError
33
+ attr_reader :status, :code, :request_id, :details, :retry_after
34
+
35
+ def initialize(status, code, message, request_id: nil, details: nil, retry_after: nil)
36
+ super(message)
37
+ @status = status
38
+ @code = code
39
+ @request_id = request_id
40
+ @details = details
41
+ @retry_after = retry_after
42
+ end
43
+
44
+ # 429, 5xx veya ağ hatası: yeniden denenebilir.
45
+ def retryable?
46
+ status.zero? || status == 429 || status >= 500
47
+ end
48
+
49
+ def to_s
50
+ suffix = request_id ? " (request_id=#{request_id})" : ""
51
+ "[#{status} #{code}] #{super}#{suffix}"
52
+ end
53
+
54
+ # HTTP durumuna karşılık gelen sınıf.
55
+ def self.class_for(status)
56
+ case status
57
+ when 0 then NetworkError
58
+ when 400, 422 then InvalidRequestError
59
+ when 401 then AuthenticationError
60
+ when 403 then PermissionDeniedError
61
+ when 404 then NotFoundError
62
+ when 409 then ConflictError
63
+ when 429 then RateLimitError
64
+ else status >= 500 ? ServerError : Error
65
+ end
66
+ end
67
+ end
68
+
69
+ # Bağlantı kurulamadı veya zaman aşımı (status 0).
70
+ class NetworkError < Error; end
71
+ # 400 / 422: istek doğrulanamadı veya işlenemedi (details alan hatalarını içerir).
72
+ class InvalidRequestError < Error; end
73
+ # 401: API anahtarı eksik veya geçersiz.
74
+ class AuthenticationError < Error; end
75
+ # 403: anahtarın kapsamı yetersiz, IP izin listesi dışı veya kaynak başka kiracıya ait.
76
+ class PermissionDeniedError < Error; end
77
+ # 404: kaynak bulunamadı.
78
+ class NotFoundError < Error; end
79
+ # 409: kaynak çakışması veya idempotency anahtarı çakışması.
80
+ class ConflictError < Error; end
81
+ # 429: hız sınırı veya plan kotası aşıldı.
82
+ class RateLimitError < Error; end
83
+ # 5xx: sunucu veya sağlayıcı geçici olarak kullanılamıyor.
84
+ class ServerError < Error; end
85
+
86
+ # Webhook imzası geçersiz. reason: missing_header, malformed_header, timestamp_out_of_tolerance,
87
+ # signature_mismatch veya malformed_body.
88
+ class WebhookSignatureError < StandardError
89
+ attr_reader :reason
90
+
91
+ def initialize(reason)
92
+ super("Pushizo webhook imzası geçersiz: #{reason}")
93
+ @reason = reason
94
+ end
95
+ end
96
+ end
@@ -1,30 +1,30 @@
1
- # frozen_string_literal: true
2
-
3
- module Pushizo
4
- # Multipart dosya alanı. İçerik bellekte tutulur ki yeniden denemeler aynı gövdeyi göndersin.
5
- class FileUpload
6
- attr_reader :filename, :content, :content_type
7
-
8
- def initialize(content, filename: "upload", content_type: nil)
9
- @content = content.to_s.b
10
- @filename = filename.to_s.empty? ? "upload" : filename.to_s
11
- @content_type = content_type || (@filename.end_with?(".csv") ? "text/csv" : "application/octet-stream")
12
- end
13
-
14
- # Diskteki dosyayı okur.
15
- def self.from_path(path, content_type: nil)
16
- new(File.binread(path), filename: File.basename(path), content_type: content_type)
17
- end
18
-
19
- # FileUpload, IO (ör. File.open(path, "rb")) veya String içeriği FileUpload'a çevirir.
20
- def self.wrap(value)
21
- case value
22
- when FileUpload then value
23
- when String then new(value)
24
- else
25
- name = value.respond_to?(:path) && value.path ? File.basename(value.path) : "upload"
26
- new(value.read, filename: name)
27
- end
28
- end
29
- end
30
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Pushizo
4
+ # Multipart dosya alanı. İçerik bellekte tutulur ki yeniden denemeler aynı gövdeyi göndersin.
5
+ class FileUpload
6
+ attr_reader :filename, :content, :content_type
7
+
8
+ def initialize(content, filename: "upload", content_type: nil)
9
+ @content = content.to_s.b
10
+ @filename = filename.to_s.empty? ? "upload" : filename.to_s
11
+ @content_type = content_type || (@filename.end_with?(".csv") ? "text/csv" : "application/octet-stream")
12
+ end
13
+
14
+ # Diskteki dosyayı okur.
15
+ def self.from_path(path, content_type: nil)
16
+ new(File.binread(path), filename: File.basename(path), content_type: content_type)
17
+ end
18
+
19
+ # FileUpload, IO (ör. File.open(path, "rb")) veya String içeriği FileUpload'a çevirir.
20
+ def self.wrap(value)
21
+ case value
22
+ when FileUpload then value
23
+ when String then new(value)
24
+ else
25
+ name = value.respond_to?(:path) && value.path ? File.basename(value.path) : "upload"
26
+ new(value.read, filename: name)
27
+ end
28
+ end
29
+ end
30
+ end