openactive 0.1.0.rc1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 93c227814f9139f11ffc43555c7d667fdc100e04110de9d70612811c6fb22aaa
4
- data.tar.gz: 2ec12d6038256e74a7f01ba2ac38139fec37dd0dd0d61bdaa72b5b191eb1dd8a
3
+ metadata.gz: c88ea62add4f15cd402a29d350d7186717da3c8c0b7feb3eb080f08156c0a792
4
+ data.tar.gz: 0b72d6feb18932a711e2a390038aac95c6e0e028bd0b68efe61162b94d5a7939
5
5
  SHA512:
6
- metadata.gz: e8ed3a7f93fca01494ed42d8e9acfe256a6297f9e273f42b5bcd7bfd1fcafeeeb4820248104fbfeecb68f0ea59413360d19e88404ceadb94dd4f94c1e19146e0
7
- data.tar.gz: c48c618544c7be88f31adec42443ab9067acd440842bc07b0b045b875a7184b32d34a016d26a5ce0ebca40aea9159091b846d556cf59c457f4e4bd4332c16992
6
+ metadata.gz: b60135e0c0aa90f25f80a90219a3690fc6899886f638f0940e14a3d44d1c9f1a2204a5f654b119c9164878ed016054398690587f3232978ef49ae45db9748998
7
+ data.tar.gz: 2151a398e7907a1a7f8395c547f7d2acad88c888753c121bef946306afb0052eee52c32e8e2ff909a1c33cc61d95f35c507504fd6c0798d67870c60014901fd5
data/README.md CHANGED
@@ -22,8 +22,146 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- TODO: Write usage instructions here
25
+ This package provides Ruby models for the OpenActive specifications.
26
26
 
27
+ It also provide a set of models for the [schema.org](https://schema.org) specifications.
28
+
29
+ Finally it provides a set of classes to handle OpenActive's [RPDE](https://developer.openactive.io/publishing-data/data-feeds/how-a-data-feed-works) data feeds.
30
+
31
+ ### Models
32
+ OpenActive includes OpenActive.io objects as objects for use in Ruby. All classes can be serialized into JSON-LD, to provide easy conformance with the [Modelling Specification](https://www.openactive.io/modelling-opportunity-data/) and [Open Booking API Specification](https://www.openactive.io/open-booking-api/).
33
+
34
+
35
+ Please note that type enforcement is in place for both class construction and attribute assignment, providing an invalid type will result in a OpenActive::Exception::InvalidArgumentException being thrown.
36
+
37
+ ### OpenActive
38
+ Classes for all OpenActive classes are available in the `OpenActive::Models` and `OpenActive::Enums` namespaces, and can be easily serialized to JSON-LD, as follows. Enumerations are available as `enum`s for properties that require their use.
39
+
40
+ ```ruby
41
+ event = OpenActive::Models::Event.new(
42
+ name: "Virtual BODYPUMP",
43
+ event_status: OpenActive::Enums::Schema::EventStatusType::EventScheduled
44
+ )
45
+ json_ld = event.to_json
46
+ ```
47
+
48
+ Value of `jsonLd`:
49
+ ```JSON
50
+ {
51
+ "@context": "https://openactive.io/",
52
+ "@type": "Event",
53
+ "name": "Virtual BODYPUMP",
54
+ "eventStatus": "https://schema.org/EventScheduled"
55
+ }
56
+ ```
57
+
58
+ ### Schema
59
+ The OpenActive data model builds on top of Schema.org, which means that you are free to use additional schema.org properties within OpenActive published data.
60
+
61
+ To reflect this, OpenActive uses inheritance to build ontop of a copy of Schema.org, these are available within the OpenActive::Models::Schema and OpenActive::Enums::Schema namespaces. And so makes it easy to use additional properties from schema.org on any given type.
62
+
63
+ ## RPDE Feed Publishing
64
+
65
+ To publish an OpenActive data feed (see this [video explainer](https://developer.openactive.io/publishing-data/data-feeds/how-a-data-feed-works)), The OpenActive gem provides a drop-in solution to render the feed pages. This also includes validation for the underlying feed query.
66
+
67
+ ### Modified Timestamp and ID Ordering Strategy
68
+
69
+ `OpenActive::Rpde::RpdeBody.create_from_modified_id(feedBaseUrl, afterTimestamp, afterId, items)`
70
+
71
+ Creates a new RPDE Page based on the RPDE Items provided using the [Modified Timestamp and ID Ordering Strategy](https://www.w3.org/2017/08/realtime-paged-data-exchange/#modified-timestamp-and-id), given the `afterTimestamp` and `afterId` parameters of the current query. Also validates that the items are in the correct order, throwing a `SerializationException` if this is not the case.
72
+
73
+ ```ruby
74
+ items = [
75
+ OpenActive::Rpde::RpdeItem.new(
76
+ Id: "1",
77
+ Modified: 3,
78
+ State: OpenActive::Rpde::RpdeState::Updated,
79
+ Kind: OpenActive::Rpde::RpdeKind::SessionSeries,
80
+ Data: @event
81
+ ),
82
+ OpenActive::Rpde::RpdeItem.new(
83
+ Id: "2",
84
+ Modified: 4,
85
+ State: OpenActive::Rpde::RpdeState::Deleted,
86
+ Kind: OpenActive::Rpde::RpdeKind::SessionSeries,
87
+ Data: nil
88
+ )
89
+ ]
90
+
91
+ json_ld = OpenActive::Rpde::RpdeBody.new("https://www.example.com/feed", 1, "1", items).to_json
92
+ ```
93
+
94
+
95
+ ### Incrementing Unique Change Number Ordering Strategy
96
+
97
+ `OpenActive::Rpde::RpdeBody.create_from_next_change_number(feedBaseUrl, afterChangeNumber, items)`
98
+
99
+ Creates a new RPDE Page based on the RPDE Items provided using the [Incrementing Unique Change Number Ordering Strategy](https://www.w3.org/2017/08/realtime-paged-data-exchange/#incrementing-unique-change-number), given the `afterChangeNumber` parameter of the current query. Also validates that the items are in the correct order, throwing a `SerializationException` if this is not the case.
100
+
101
+ ```ruby
102
+ items = [
103
+ OpenActive::Rpde::RpdeItem.new(
104
+ Id: "1",
105
+ Modified: 3,
106
+ State: OpenActive::Rpde::RpdeState::Updated,
107
+ Kind: OpenActive::Rpde::RpdeKind::SessionSeries,
108
+ Data: @event
109
+ ),
110
+ OpenActive::Rpde::RpdeItem.new(
111
+ Id: "2",
112
+ Modified: 4,
113
+ State: OpenActive::Rpde::RpdeState::Deleted,
114
+ Kind: OpenActive::Rpde::RpdeKind::SessionSeries,
115
+ Data: nil
116
+ )
117
+ ]
118
+
119
+ json_ld = OpenActive::Rpde::RpdeBody.create_from_next_change_number("https://www.example.com/feed", 2, items).to_json
120
+ ```
121
+
122
+ ## Serialization
123
+
124
+ ### `obj.serialize`
125
+ Returns the serialized object in hash form complying to json-ld structure (unlike .to_h this serializes everything all the way down.)
126
+ ```
127
+ event.serialize
128
+ ```
129
+ ```
130
+ {"@type"=>"Event", "name"=>"Virtual BODYPUMP", "eventStatus"=>"https://schema.org/EventScheduled", "@context"=>["https://openactive.io/", "https://openactive.io/ns-beta"]}
131
+ ```
132
+ ### `obj.to_json`
133
+ Serializes down to a json-ld string.
134
+ ```ruby
135
+ event.to_json
136
+ ```
137
+ returns
138
+ ```ruby
139
+ "{\"@type\":\"Event\",\"name\":\"Virtual BODYPUMP\",\"eventStatus\":\"https://schema.org/EventScheduled\",\"@context\":[\"https://openactive.io/\",\"https://openactive.io/ns-beta\"]}"
140
+ ```
141
+
142
+ ## Deserialization
143
+ ```ruby
144
+
145
+ data = JSON.parse('{"@context": ["https:\/\/openactive.io\/","https:\/\/openactive.io\/ns-beta"],"type": "Action","name": "Book","target": {"type": "EntryPoint","encodingType": "application\/vnd.openactive.v1.0+json","httpMethod": "POST","type": "EntryPoint","url": "https:\/\/example.com\/orders"}}')
146
+
147
+ deserialized = OpenActive::BaseModel.deserialize(data)
148
+
149
+ pp deserialized
150
+ ```
151
+
152
+ will result in
153
+ ```ruby
154
+ #<OpenActive::Models::Action:0x00007ff6fd0966d0
155
+ @name="Book",
156
+ @target=
157
+ #<OpenActive::Models::EntryPoint:0x00007ff6fd095fa0
158
+ @encoding_type="application/vnd.openactive.v1.0+json",
159
+ @http_method="POST",
160
+ @url=#<URI::HTTPS https://example.com/orders>>>
161
+ => #<OpenActive::Models::Action:0x00007ff6fd0966d0
162
+ @name="Book",
163
+ @target=#<OpenActive::Models::EntryPoint:0x00007ff6fd095fa0 @encoding_type="application/vnd.openactive.v1.0+json", @http_method="POST", @url=#<URI::HTTPS https://example.com/orders>>>
164
+ ```
27
165
  ## Development
28
166
 
29
167
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -35,7 +35,7 @@ module OpenActive
35
35
 
36
36
  val = value
37
37
 
38
- val = deserialize_value(value) if value.is_a?(Array) || value.is_a?(Hash)
38
+ val = deserialize(value) if value.is_a?(Array) || value.is_a?(Hash)
39
39
 
40
40
  return if ["context", "type"].include?(attr_name)
41
41
 
@@ -49,10 +49,7 @@ module OpenActive
49
49
  # @param data [string,Array] If a string is provided, we attempt JSON-decoding first
50
50
  # @return [object]
51
51
  #
52
- def self.deserialize(data)
53
- # If a string is provided, we attempt JSON-decoding first
54
- data = JSON.parse(data) if data.is_a?(String)
55
-
52
+ def self.deserialize_class(data)
56
53
  inst = new
57
54
 
58
55
  # If data provided is not an array, return an empty class
@@ -65,15 +62,11 @@ module OpenActive
65
62
  inst
66
63
  end
67
64
 
68
- def deserialize(*data)
69
- self.class.deserialize(data)
70
- end
71
-
72
65
  # Returns a value from a given JSON-LD deserialized array.
73
66
  #
74
67
  # @param value [mixed] If an array is provided, we recursively deserialize it
75
68
  # @return [mixed]
76
- def deserialize_value(value)
69
+ def self.deserialize(value)
77
70
  if value.is_a?(Hash)
78
71
  # If an associative array with a type, return its deserialization form,
79
72
  # so that it gets converted from array to object
@@ -87,7 +80,7 @@ module OpenActive
87
80
 
88
81
  klass = ::OpenActive::Models.const_get(type)
89
82
 
90
- inst = klass.deserialize(value)
83
+ inst = klass.deserialize_class(value)
91
84
 
92
85
  return inst
93
86
  end
@@ -96,12 +89,16 @@ module OpenActive
96
89
  # If providing a non-associative array
97
90
  # Loop through it and serialize each item if needed
98
91
  value = value.map do |item|
99
- deserialize_value(item)
92
+ deserialize(item)
100
93
  end
101
94
  end
102
95
  value
103
96
  end
104
97
 
98
+ def deserialize(*data)
99
+ self.class.deserialize(*data)
100
+ end
101
+
105
102
  # Returns the JSON-LD representation of the given instance.
106
103
  #
107
104
  # @param obj [::OpenActive::BaseModel] The given instance to convert to JSON-LD
@@ -1,3 +1,3 @@
1
1
  module OpenActive
2
- VERSION = "0.1.0.rc1".freeze
2
+ VERSION = "0.1.0".freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openactive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.rc1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenActive Community
@@ -1022,11 +1022,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
1022
1022
  version: '0'
1023
1023
  required_rubygems_version: !ruby/object:Gem::Requirement
1024
1024
  requirements:
1025
- - - ">"
1025
+ - - ">="
1026
1026
  - !ruby/object:Gem::Version
1027
- version: 1.3.1
1027
+ version: '0'
1028
1028
  requirements: []
1029
- rubygems_version: 3.0.6
1029
+ rubygems_version: 3.0.3
1030
1030
  signing_key:
1031
1031
  specification_version: 4
1032
1032
  summary: OpenActive.io objects turned into strongly typed classes for use in Ruby.