openactive-dataset_site 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []