openactive-dataset_site 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,91 @@
1
+ module OpenActive
2
+ module DatasetSite
3
+ class FeedType < TypesafeEnum::Base
4
+ new :COURSE, "Course" do
5
+ @name = "Course"
6
+ @same_as = "https://openactive.io/Course"
7
+ @default_feed_path = "courses"
8
+ @possible_kinds = ["Course"]
9
+ @display_name = "Courses"
10
+ end
11
+ new :COURSE_INSTANCE, "CourseInstance" do
12
+ @name = "CourseInstance"
13
+ @same_as = "https://openactive.io/CourseInstance"
14
+ @default_feed_path = "course-instances"
15
+ @possible_kinds = ["CourseInstance", "CourseInstance.Event"]
16
+ @display_name = "Courses"
17
+ end
18
+ new :EVENT, "Event" do
19
+ @name = "Event"
20
+ @same_as = "https://schema.org/Event"
21
+ @possible_kinds = ["Event"]
22
+ @display_name = "Events"
23
+ end
24
+ new :EVENT_SERIES, "EventSeries" do
25
+ @name = "EventSeries"
26
+ @same_as = "https://schema.org/EventSeries"
27
+ @default_feed_path = "event-series"
28
+ @possible_kinds = ["EventSeries"]
29
+ @display_name = "undefined"
30
+ end
31
+ new :FACILITY_USE, "FacilityUse" do
32
+ @name = "FacilityUse"
33
+ @same_as = "https://openactive.io/FacilityUse"
34
+ @default_feed_path = "facility-uses"
35
+ @possible_kinds = ["FacilityUse"]
36
+ @display_name = "Facilities"
37
+ end
38
+ new :HEADLINE_EVENT, "HeadlineEvent" do
39
+ @name = "HeadlineEvent"
40
+ @same_as = "https://openactive.io/HeadlineEvent"
41
+ @default_feed_path = "headline-events"
42
+ @possible_kinds = ["HeadlineEvent"]
43
+ @display_name = "Events"
44
+ end
45
+ new :INDIVIDUAL_FACILITY_USE, "IndividualFacilityUse" do
46
+ @name = "IndividualFacilityUse"
47
+ @same_as = "https://openactive.io/IndividualFacilityUse"
48
+ @default_feed_path = "individual-facility-uses"
49
+ @possible_kinds = ["IndividualFacilityUse"]
50
+ @display_name = "Facilities"
51
+ end
52
+
53
+ new :SCHEDULED_SESSION, "ScheduledSession" do
54
+ @name = "ScheduledSession"
55
+ @same_as = "https://openactive.io/ScheduledSession"
56
+ @default_feed_path = "scheduled-sessions"
57
+ @possible_kinds = ["ScheduledSession", "ScheduledSession.SessionSeries"]
58
+ @display_name = "Sessions"
59
+ end
60
+ new :SESSION_SERIES, "SessionSeries" do
61
+ @name = "SessionSeries"
62
+ @same_as = "https://openactive.io/SessionSeries"
63
+ @default_feed_path = "session-series"
64
+ @possible_kinds = ["SessionSeries", "SessionSeries.ScheduledSession"]
65
+ @display_name = "Sessions"
66
+ end
67
+ new :SLOT, "Slot" do
68
+ @name = "Slot"
69
+ @same_as = "https://openactive.io/Slot"
70
+ @default_feed_path = "slots"
71
+ @possible_kinds = ["FacilityUse/Slot", "IndividualFacilityUse/Slot"]
72
+ @display_name = "Facilities"
73
+ end
74
+
75
+ # @return [String]
76
+ attr_reader :name
77
+
78
+ # @return [String]
79
+ attr_reader :same_as
80
+
81
+ # @return [String]
82
+ attr_reader :default_feed_path
83
+
84
+ # @return [Array<String>]
85
+ attr_reader :possible_kinds
86
+
87
+ # @return [String]
88
+ attr_reader :display_name
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,7 @@
1
+ module OpenActive
2
+ module DatasetSite
3
+ class Meta < TypesafeEnum::Base
4
+ new :RPDE_MEDIA_TYPE, "application/vnd.openactive.rpde+json; version=1"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,120 @@
1
+ module OpenActive
2
+ module DatasetSite
3
+ class Settings
4
+ def initialize(**params)
5
+ params.each do |k, v|
6
+ setter_method = "#{k}="
7
+
8
+ raise ArgumentError, "Unrecognised field #{k}" unless respond_to?(setter_method)
9
+
10
+ public_send(setter_method, v)
11
+ end
12
+ end
13
+
14
+ attr_accessor :open_data_feed_base_url
15
+
16
+ attr_accessor :dataset_site_url
17
+ attr_accessor :dataset_discussion_url
18
+ attr_accessor :dataset_documentation_url
19
+ attr_accessor :dataset_languages
20
+
21
+ attr_accessor :organisation_name
22
+ attr_accessor :organisation_legal_entity
23
+ attr_accessor :organisation_plain_text_description
24
+ attr_accessor :organisation_email
25
+ attr_accessor :organisation_url
26
+ attr_accessor :organisation_logo_url
27
+
28
+ attr_accessor :background_image_url
29
+ attr_accessor :date_first_published
30
+
31
+ attr_accessor :platform_name
32
+ attr_accessor :platform_url
33
+ attr_accessor :platform_software_version
34
+
35
+ attr_accessor :data_feed_types
36
+
37
+ def data_feed_descriptions
38
+ data_feed_types.map do |description|
39
+ description.respond_to?(:display_name) ? description.display_name : description
40
+ end.uniq
41
+ end
42
+
43
+ def name
44
+ "#{organisation_name} #{data_feed_descriptions.to_sentence}"
45
+ end
46
+
47
+ def data_feed_descriptions_sentence
48
+ data_feed_descriptions.to_sentence.downcase
49
+ end
50
+
51
+ def keywords
52
+ [
53
+ *data_feed_descriptions,
54
+ "Activities",
55
+ "Sports",
56
+ "Physical Activity",
57
+ "OpenActive"
58
+ ]
59
+ end
60
+
61
+ def description
62
+ "Near real-time availability and rich descriptions relating to the "\
63
+ "#{data_feed_descriptions_sentence} available from "\
64
+ "#{organisation_name}"
65
+ end
66
+
67
+ def data_downloads
68
+ data_feed_types.map do |feed_type|
69
+ OpenActive::Models::DataDownload.new(
70
+ name: feed_type.name,
71
+ additional_type: feed_type.same_as,
72
+ encoding_format: "application/vnd.openactive.rpde+json; version=1",
73
+ content_url: open_data_feed_base_url + feed_type.default_feed_path,
74
+ )
75
+ end
76
+ end
77
+
78
+ def to_dataset # rubocop:disable Metrics/MethodLength
79
+ dataset = OpenActive::Models::Dataset.new(
80
+ id: dataset_site_url,
81
+ url: dataset_site_url,
82
+ name: name,
83
+ description: description,
84
+ keywords: keywords,
85
+ license: "https://creativecommons.org/licenses/by/4.0/",
86
+ discussion_url: dataset_discussion_url,
87
+ documentation: dataset_documentation_url,
88
+ in_language: dataset_languages,
89
+ schema_version: "https://www.openactive.io/modelling-opportunity-data/2.0/",
90
+ publisher: OpenActive::Models::Organization.new(
91
+ name: organisation_name,
92
+ legal_name: organisation_legal_entity,
93
+ description: organisation_plain_text_description,
94
+ email: organisation_email,
95
+ url: organisation_url,
96
+ logo: OpenActive::Models::ImageObject.new(
97
+ url: organisation_logo_url,
98
+ ),
99
+ ),
100
+ date_modified: DateTime.now.new_offset(0),
101
+ background_image: OpenActive::Models::ImageObject.new(
102
+ url: background_image_url,
103
+ ),
104
+ distribution: data_downloads,
105
+ date_published: date_first_published,
106
+ )
107
+
108
+ if platform_name && !platform_name.empty?
109
+ dataset.booking_service = OpenActive::Models::BookingService.new(
110
+ name: platform_name,
111
+ url: platform_url,
112
+ software_version: platform_software_version,
113
+ )
114
+ end
115
+
116
+ dataset
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,39 @@
1
+ require 'mustache'
2
+
3
+ module OpenActive
4
+ module DatasetSite
5
+ class TemplateRenderer < Mustache
6
+ self.template_file = "#{__dir__}/datasetsite.mustache"
7
+
8
+ def initialize(settings)
9
+ @settings = settings
10
+ end
11
+
12
+ def dataset
13
+ return @settings if @settings.is_a?(OpenActive::Models::Dataset)
14
+
15
+ @dataset ||= @settings.to_dataset
16
+ end
17
+
18
+ def json
19
+ dataset.to_json(schema: true)
20
+ end
21
+
22
+ def method_missing(orig_method_name, *args)
23
+ method_name = orig_method_name.to_s.underscore
24
+
25
+ return super unless dataset.respond_to?(method_name)
26
+
27
+ val = dataset.public_send(method_name, *args)
28
+
29
+ OpenActive::Helpers::JsonLd.serialize_value(val, nil)
30
+ end
31
+
32
+ def respond_to_missing?(orig_method_name, include_private = false)
33
+ method_name = orig_method_name.to_s.underscore
34
+
35
+ dataset.respond_to?(method_name) || super
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,5 @@
1
+ module OpenActive
2
+ module DatasetSite
3
+ VERSION = "0.1.0".freeze
4
+ end
5
+ end
@@ -0,0 +1,34 @@
1
+ lib = File.expand_path('lib', __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "openactive/dataset_site/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "openactive-dataset_site"
7
+ spec.version = OpenActive::DatasetSite::VERSION
8
+ spec.authors = ["OpenActive Community"]
9
+ spec.email = ["hello@openactive.io"]
10
+
11
+ spec.summary = 'Simplifies creation of dataset sites using templates.'
12
+ # spec.description = %q{TODO: Write a longer description or delete this line.}
13
+ spec.homepage = "https://openactive.io"
14
+ spec.license = "MIT"
15
+
16
+ # Specify which files should be added to the gem when it is released.
17
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
18
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
19
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ end
21
+ spec.bindir = "exe"
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ["lib"]
24
+
25
+ spec.add_runtime_dependency "mustache"
26
+ spec.add_runtime_dependency "openactive"
27
+ spec.add_runtime_dependency "typesafe_enum"
28
+
29
+ spec.add_development_dependency "bundler"
30
+ spec.add_development_dependency "rake"
31
+ spec.add_development_dependency "rspec"
32
+ spec.add_development_dependency "rubocop"
33
+ spec.add_development_dependency "rubocop-rspec"
34
+ end
metadata ADDED
@@ -0,0 +1,173 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: openactive-dataset_site
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - OpenActive Community
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-12-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mustache
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: openactive
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: typesafe_enum
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description:
126
+ email:
127
+ - hello@openactive.io
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".rubocop.yml"
134
+ - Gemfile
135
+ - LICENSE
136
+ - Makefile
137
+ - README.md
138
+ - bin/console
139
+ - bin/setup
140
+ - examples/example.rb
141
+ - lib/openactive/dataset_site.rb
142
+ - lib/openactive/dataset_site/datasetsite.mustache
143
+ - lib/openactive/dataset_site/feed_type.rb
144
+ - lib/openactive/dataset_site/meta.rb
145
+ - lib/openactive/dataset_site/settings.rb
146
+ - lib/openactive/dataset_site/template_renderer.rb
147
+ - lib/openactive/dataset_site/version.rb
148
+ - openactive-dataset_site.gemspec
149
+ homepage: https://openactive.io
150
+ licenses:
151
+ - MIT
152
+ metadata: {}
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubyforge_project:
169
+ rubygems_version: 2.5.2
170
+ signing_key:
171
+ specification_version: 4
172
+ summary: Simplifies creation of dataset sites using templates.
173
+ test_files: []