cloud_events 0.1.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.
@@ -0,0 +1,158 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "base64"
4
+ require "json"
5
+
6
+ module CloudEvents
7
+ ##
8
+ # An implementation of JSON format and JSON batch format.
9
+ #
10
+ # Supports the CloudEvents 0.3 and CloudEvents 1.0 variants of this format.
11
+ # See https://github.com/cloudevents/spec/blob/v0.3/json-format.md and
12
+ # https://github.com/cloudevents/spec/blob/v1.0/json-format.md.
13
+ #
14
+ class JsonFormat
15
+ ##
16
+ # Decode an event from the given input JSON string.
17
+ #
18
+ # @param json [String] A JSON-formatted string
19
+ # @return [CloudEvents::Event]
20
+ #
21
+ def decode json, **_other_kwargs
22
+ structure = ::JSON.parse json
23
+ decode_hash_structure structure
24
+ end
25
+
26
+ ##
27
+ # Encode an event to a JSON string.
28
+ #
29
+ # @param event [CloudEvents::Event] An input event.
30
+ # @param sort [boolean] Whether to sort keys of the JSON output.
31
+ # @return [String] The JSON representation.
32
+ #
33
+ def encode event, sort: false, **_other_kwargs
34
+ structure = encode_hash_structure event
35
+ structure = sort_keys structure if sort
36
+ ::JSON.dump structure
37
+ end
38
+
39
+ ##
40
+ # Decode a batch of events from the given input string.
41
+ #
42
+ # @param json [String] A JSON-formatted string
43
+ # @return [Array<CloudEvents::Event>]
44
+ #
45
+ def decode_batch json, **_other_kwargs
46
+ structure_array = Array(::JSON.parse(json))
47
+ structure_array.map do |structure|
48
+ decode_hash_structure structure
49
+ end
50
+ end
51
+
52
+ ##
53
+ # Encode a batch of event to a JSON string.
54
+ #
55
+ # @param events [Array<CloudEvents::Event>] An array of input events.
56
+ # @param sort [boolean] Whether to sort keys of the JSON output.
57
+ # @return [String] The JSON representation.
58
+ #
59
+ def encode_batch events, sort: false, **_other_kwargs
60
+ structure_array = Array(events).map do |event|
61
+ structure = encode_hash_structure event
62
+ sort ? sort_keys(structure) : structure
63
+ end
64
+ ::JSON.dump structure_array
65
+ end
66
+
67
+ ##
68
+ # Decode a single event from a hash data structure with keys and types
69
+ # conforming to the JSON envelope.
70
+ #
71
+ # @param structure [Hash] An input hash.
72
+ # @return [CloudEvents::Event]
73
+ #
74
+ def decode_hash_structure structure
75
+ spec_version = structure["specversion"].to_s
76
+ case spec_version
77
+ when "0.3"
78
+ decode_hash_structure_v0 structure
79
+ when /^1(\.|$)/
80
+ decode_hash_structure_v1 structure
81
+ else
82
+ raise SpecVersionError, "Unrecognized specversion: #{spec_version}"
83
+ end
84
+ end
85
+
86
+ ##
87
+ # Encode a single event to a hash data structure with keys and types
88
+ # conforming to the JSON envelope.
89
+ #
90
+ # @param event [CloudEvents::Event] An input event.
91
+ # @return [String] The hash structure.
92
+ #
93
+ def encode_hash_structure event
94
+ case event
95
+ when Event::V0
96
+ encode_hash_structure_v0 event
97
+ when Event::V1
98
+ encode_hash_structure_v1 event
99
+ else
100
+ raise SpecVersionError, "Unrecognized specversion: #{event.spec_version}"
101
+ end
102
+ end
103
+
104
+ private
105
+
106
+ def sort_keys hash
107
+ result = {}
108
+ hash.keys.sort.each do |key|
109
+ result[key] = hash[key]
110
+ end
111
+ result
112
+ end
113
+
114
+ def decode_hash_structure_v0 structure
115
+ data = structure["data"]
116
+ content_type = structure["datacontenttype"]
117
+ if data.is_a?(::String) && content_type.is_a?(::String)
118
+ content_type = ContentType.new content_type
119
+ if content_type.subtype == "json" || content_type.subtype_format == "json"
120
+ structure = structure.dup
121
+ structure["data"] = ::JSON.parse data rescue data
122
+ structure["datacontenttype"] = content_type
123
+ end
124
+ end
125
+ Event::V0.new attributes: structure
126
+ end
127
+
128
+ def decode_hash_structure_v1 structure
129
+ if structure.key? "data_base64"
130
+ structure = structure.dup
131
+ structure["data"] = ::Base64.decode64 structure.delete "data_base64"
132
+ end
133
+ Event::V1.new attributes: structure
134
+ end
135
+
136
+ def encode_hash_structure_v0 event
137
+ structure = event.to_h
138
+ data = event.data
139
+ content_type = event.data_content_type
140
+ if data.is_a?(::String) && !content_type.nil?
141
+ if content_type.subtype == "json" || content_type.subtype_format == "json"
142
+ structure["data"] = ::JSON.parse data rescue data
143
+ end
144
+ end
145
+ structure
146
+ end
147
+
148
+ def encode_hash_structure_v1 event
149
+ structure = event.to_h
150
+ data = structure["data"]
151
+ if data.is_a?(::String) && data.encoding == ::Encoding::ASCII_8BIT
152
+ structure.delete "data"
153
+ structure["data_base64"] = ::Base64.encode64 data
154
+ end
155
+ structure
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CloudEvents
4
+ ##
5
+ # Version of the Ruby CloudEvents SDK
6
+ # @return [String]
7
+ #
8
+ VERSION = "0.1.0"
9
+ end
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cloud_events
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Azuma
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-07-08 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: The official Ruby implementation of the CloudEvents Specification. Provides
14
+ data types for events, and HTTP/JSON bindings for marshalling and unmarshalling
15
+ event data.
16
+ email:
17
+ - dazuma@gmail.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - ".yardopts"
23
+ - CHANGELOG.md
24
+ - LICENSE.md
25
+ - README.md
26
+ - lib/cloud_events.rb
27
+ - lib/cloud_events/content_type.rb
28
+ - lib/cloud_events/errors.rb
29
+ - lib/cloud_events/event.rb
30
+ - lib/cloud_events/event/field_interpreter.rb
31
+ - lib/cloud_events/event/v0.rb
32
+ - lib/cloud_events/event/v1.rb
33
+ - lib/cloud_events/http_binding.rb
34
+ - lib/cloud_events/json_format.rb
35
+ - lib/cloud_events/version.rb
36
+ homepage: https://github.com/cloudevents/sdk-ruby
37
+ licenses:
38
+ - Apache-2.0
39
+ metadata:
40
+ changelog_uri: https://github.com/cloudevents/sdk-ruby/blob/master/CHANGELOG.md
41
+ source_code_uri: https://github.com/cloudevents/sdk-ruby
42
+ bug_tracker_uri: https://github.com/cloudevents/sdk-ruby/issues
43
+ documentation_uri: https://rubydoc.info/gems/cloud_events/0.1.0
44
+ post_install_message:
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 2.4.0
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ requirements: []
59
+ rubygems_version: 3.1.2
60
+ signing_key:
61
+ specification_version: 4
62
+ summary: Ruby SDK for CloudEvents
63
+ test_files: []