dataset-site-template-ruby

Ruby classes and resources supporting dataset site creation

Tools intended to simplify creation of dataset sites using templates.

For comparison, see the .NET and PHP implementations.

Installation

Add this line to your application's Gemfile:

gem 'openactive-dataset_site'

And then execute:

$ bundle

Or install it yourself as:

$ gem install openactive-dataset_site

Usage

If you are developing this package, go to the Contribution section.

Wherever you want to render your Dataset page, include the following instructions:


# Render compiled template with data
renderer = OpenActive::DatasetSite::TemplateRenderer.new(settings)
puts renderer.render

Where settings could be defined like the following (as an example):

settings = OpenActive::DatasetSite::Settings.new(
    open_data_feed_base_url: "https://customer.example.com/feed/",
    dataset_site_url: "https://halo-odi.legendonlineservices.co.uk/openactive/",
    dataset_discussion_url: "https://github.com/gll-better/opendata",
    dataset_documentation_url: "https://docs.acmebooker.example.com/",
    dataset_languages: ["en-GB"],
    organisation_name: "Better",
    organisation_url: "https://www.better.org.uk/",
    organisation_legal_entity: "GLL",
    organisation_plain_text_description: "Established in 1993, GLL is the largest UK-based charitable social enterprise delivering leisure, health and community services. Under the consumer facing brand Better, we operate 258 public Sports and Leisure facilities, 88 libraries, 10 children’s centres and 5 adventure playgrounds in partnership with 50 local councils, public agencies and sporting organisations. Better leisure facilities enjoy 46 million visitors a year and have more than 650,000 members.",
    organisation_logo_url: "http://data.better.org.uk/images/logo.png",
    organisation_email: "[email protected]",
    platform_name: "AcmeBooker",
    platform_url: "https://acmebooker.example.com/",
    platform_software_version: "2.0",
    background_image_url: "https://data.better.org.uk/images/bg.jpg",
    date_first_published: "2019-10-28",
    data_feed_types: [
      OpenActive::DatasetSite::FeedType::FACILITY_USE,
      OpenActive::DatasetSite::FeedType::SCHEDULED_SESSION,
      OpenActive::DatasetSite::FeedType::SESSION_SERIES,
      OpenActive::DatasetSite::FeedType::SLOT,
    ],
)

Feed-level customisation

If you need to do feed specific overrides, then you may do this by overriding the method.

settings = Class.new(OpenActive::DatasetSite::Settings) do
  def data_download(feed_type)
    val = super(feed_type)

    case feed_type
    when OpenActive::DatasetSite::FeedType::SESSION_SERIES
      val.content_url = open_data_feed_base_url + "session_series"
    end

    val
  end
end.new(
  data_feed_types: [
    OpenActive::DatasetSite::FeedType::FACILITY_USE,
    OpenActive::DatasetSite::FeedType::SCHEDULED_SESSION,
    OpenActive::DatasetSite::FeedType::SESSION_SERIES,
    OpenActive::DatasetSite::FeedType::SLOT,
  ],
  # rest of your settings here.
)

To match the PHP/.NET usage, you may alternatively use this approach, however it's less advised as there are more details to get right (and it risks a mismatch between the downloads and the advertised feed types):

settings = OpenActive::DatasetSite::Settings.new(
    # your settings here,
    data_feed_types: [
      OpenActive::DatasetSite::FeedType::SESSION_SERIES,
    ],
    data_downloads: [
        OpenActive::Models::DataDownload.new(
          name: "SessionSeries",
          additional_type: "https://openactive.io/SessionSeries",
          encoding_format:  OpenActive::DatasetSite::Meta.RPDE_MEDIA_TYPE,
          content_url: open_data_feed_base_url + "session-series",
        )
    ]
)

Dataset

dataset = OpenActive::Models::Dataset.new(
  id: "http://example.com/dataset/",
  description:
    "Near real-time availability and rich descriptions relating to the facilities and sessions available from Simpleweb",
  url: "http://example.com/dataset/",
  dateModified: "2019-12-09T15:36:15+00:00",
  keywords:
    ["Facilities",
     "Sessions",
     "Activities",
     "Sports",
     "Physical Activity",
     "OpenActive"],
  schemaVersion: "https://www.openactive.io/modelling-opportunity-data/2.0/",
  license: "https://creativecommons.org/licenses/by/4.0/",
  publisher:
    OpenActive::Models::Organization.new(
      name: "Simpleweb",
      description:
       "Simpleweb is a purpose driven software company that specialises in new technologies, product development, and human interaction.",
      url: "https://www.simpleweb.co.uk/",
      legalName: "Simpleweb Ltd",
      logo:
       OpenActive::Models::ImageObject.new(
         url:
           "https://simpleweb.co.uk/wp-content/uploads/2015/07/facebook-default.png",
       ),
      email: "[email protected]",
    ),
  discussionUrl: "https://github.com/simpleweb/sw-oa-php-test-site",
  datePublished: "2019-11-05T00:00:00+00:00",
  inLanguage: ["en-GB"],
  distribution:
    [OpenActive::Models::DataDownload.new(
      name: "FacilityUse",
      additionalType: "https://openactive.io/FacilityUse",
      encodingFormat: "application/vnd.openactive.rpde+json; version=1",
      contentUrl: "http://example.com/feed/facility-uses",
    ),
     OpenActive::Models::DataDownload.new(
       name: "ScheduledSession",
       additionalType: "https://openactive.io/ScheduledSession",
       encodingFormat: "application/vnd.openactive.rpde+json; version=1",
       contentUrl: "http://example.com/feed/scheduled-sessions",
     ),
     OpenActive::Models::DataDownload.new(
       name: "SessionSeries",
       additionalType: "https://openactive.io/SessionSeries",
       encodingFormat: "application/vnd.openactive.rpde+json; version=1",
       contentUrl: "http://example.com/feed/session_series",
     ),
     OpenActive::Models::DataDownload.new(
       name: "Slot",
       additionalType: "https://openactive.io/Slot",
       encodingFormat: "application/vnd.openactive.rpde+json; version=1",
       contentUrl: "http://example.com/feed/slots",
     )],
  backgroundImage:
    OpenActive::Models::ImageObject.new(
      url:
        "https://simpleweb.co.uk/wp-content/uploads/2017/06/IMG_8994-500x500-c-default.jpg",
    ),
  documentation: "https://developer.openactive.io/",
  name: "Simpleweb Facilities and Sessions",
)

renderer = OpenActive::DatasetSite::TemplateRenderer.new(dataset)

puts renderer.render

Dataset patching

The dataset generation should already be good for most purposes, if needing to change just a couple of fields then you may be better of patching just those fields.

settings = OpenActive::DatasetSite::Settings.new(
  # your settings here
)

dataset = settings.to_dataset

dataset.description = "Some better non-generated description here."

renderer = OpenActive::DatasetSite::TemplateRenderer.new(dataset)

puts renderer.render

API

OpenActive::DatasetSite::Settings

Accepts a config hash containing the following keys:

Settings
Key Type Description
open_data_feed_base_url string The the base URL for the open data feeds
dataset_site_url string The URL where this dataset site is displayed (the page's own URL)
dataset_discussion_url string The GitHub issues page for the dataset
dataset_documentation_url string Any documentation specific to the dataset. Defaults to https://developer.openactive.io/ if not provided, which should be used if no documentation is available.
dataset_languages string[] The languages available in the dataset, following the IETF BCP 47 standard. Defaults to array("en-GB").
organisation_name string The publishing organisation's name
organisation_url string The publishing organisation's URL
organisation_legal_entity string The legal name of the publishing organisation of this dataset
organisation_plain_text_description string A plain text description of this organisation
organisation_logo_url string An image URL of the publishing organisation's logo, ideally in PNG format
organisation_email string The contact email of the publishing organisation of this dataset
platform_name string The software platform's name. Only set this if different from the publishing organisation, otherwise leave as null to exclude platform metadata.
platform_url string The software platform's website
platform_software_version string The software platform's software version
background_image_url string The background image to show on the Dataset Site page
date_first_published string The date the dataset was first published
data_feed_types FeedType[] A list of supported DataFeed types

And data_feed_types must be an array of FeedType constants, which auto-generates the metadata associated which each feed using best-practice values. See available types

OpenActive::DatasetSite::TemplateRenderer.new(settings)

Accepts a settings or a DataSet object. This is a Mustache engine.

.render

Returns a string corresponding to the compiled HTML, based on the datasetsite.mustache, the provided settings

FeedType

A class containing the supported distribution types:

Constant Name
COURSE Course
COURSE_INSTANCE CourseInstance
EVENT Event
EVENT_SERIES EventSeries
FACILITY_USE FacilityUse
HEADLINE_EVENT HeadlineEvent
INDIVIDUAL_FACILITY_USE IndividualFacilityUse
SCHEDULED_SESSION ScheduledSession
SESSION_SERIES SessionSeries
SLOT Slot