Project

odrl-ruby

0.0
The project is in a healthy, maintained state
A builder for ODRL files. Does basic validation against core ODRL vocabularies. Has a Builder that allows you to create ODRL Profiles to extend the core vocabulary. DOES NOT validate against a profile. DOES NOT cover the full ODRL specificaiton, only the bits that I needed!
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies
 Project Readme

ODRL::Ruby

This is a gem to build ODRL records, and serialize them. Does not cover the full ODRL model (yet!)

Installation

Add this line to your application's Gemfile:

gem 'odrl-ruby'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install odrl-ruby

Usage

Two functionalities: Build ODRL Policies; Build ODRL Profiles to extend the core ODRL vocabulary

Build Policy:

require 'odrl/ruby'

# an offer to toshiaki from mark to use the polyA resource during the biohackathon

# core annotatons are:  :title, :creator, :description, :subject :baseURI, :uid, :type
policy = ODRL::Offer.new(
    title: "Offer to Toshiaki-san",
    creator: "https://orcid.org/0000-0001-6960-357X",
    description: "An offer for Toshiaki-san to use the polyA data during the hackathon",
    subject: "collaboration", # this is the CCE category - useful for EJP-RD ONLYU
)

asset = ODRL::Asset.new(uid: "http://mark.wilkinson.org/data/polyA", title: "Mark's PolyA Database")

# you indicate the type of party by assigning the predicate (either assigner or assignee)
# ODRLV is the RDF::Vocabulary for ODRL, exported to this namespace
mark = ODRL::Party.new(uid: "https://orcid.org/0000-0001-6960-357X", predicate: ODRLV.assigner, title: "Mark D Wilkinson" )
toshiaki = ODRL::Party.new(uid: "https://orcid.org/0000-0003-2391-0384", predicate: ODRLV.assignee, title: "Toshiaki Katayama")

# Rules
permission = ODRL::Permission.new(title: "Permission to use")

use = ODRL::Use.new(value: "use") # subclass of ODRL::Action

# Constraints: :uid, :rightOperand, :leftOperand, :operator, :rightOperandReference, :dataType, :unit, :status
constraint = ODRL::Constraint.new(
    title: "Only during the hackathon",
    leftOperand: "event",
    operator: "eq",
    rightOperand: "https://2023.biohackathon.org"
)
permission.addConstraint(constraint: constraint)
permission.addAsset(asset: asset)
permission.addAssigner(party: toshiaki)
permission.addAssignee(party: mark)
permission.addAction(action: use)

policy.addPermission(rule: permission)

policy.load_graph  # this brings the triples into memory, cascading down all objects conneted to "policuy"
result = policy.serialize(format: 'turtle')  # get the RDF string
puts result

Build Profile:

require 'odrl/profile/builder'

p = ODRL::Profile::Builder.new(
    uri: "https://example.org/myprofiles/grp",
    title: "ODRL Profile for Germplasm resources",
    description: "There are some properties and comparisons that only make sense in the Germplasm expert domain",
    authors: ["Mark D Wilkinson"],
    version: 0.1,
    license: "https://creativecommons.org/licenses/by/4.0/"
)

p.asset_relations << ODRL::Profile::AssetRelation.new(
    uri: "https://example.org/myprofiles/grp#nagoya_permission",
    label: "Permission under Nagoya protocol",
    definition: "Permission is a special thing in the Nagoya protocol")


p.party_functional_roles << ODRL::Profile::PartyFunction.new(
    uri: "https://example.org/myprofiles/grp#nagoya_assigner",
    label: "Assigner with Nagoya authority to assign",
    definition: "Assigners have special responsibilities in the Nagoya protocol")

p.actions << ODRL::Profile::Action.new(
    uri: "https://example.org/myprofiles/grp#nagoya_propogate",
    label: "Plant and Harvest",
    definition: "the action of planting and harvesting the seed",
    included_in: ODRLV.use,
    implies: ODRLV.distribute)


p.leftOperands << ODRL::Profile::LeftOperand.new(
    uri: "https://example.org/myprofiles/grp#at_risk_species",
    label: "At Risk Species",
    definition: "A species that has been flagged as at-risk of extinction")

p.rightOperands << ODRL::Profile::RightOperand.new(
    uri: "https://example.org/myprofiles/grp#on_watchlist",
    label: "On Watchlist",
    definition: "A species whose risk of extinction is on a watchlist")

p.operators << ODRL::Profile::Operator.new(
    uri: "https://example.org/myprofiles/grp#within_risk_boundary",
    label: "Within Bounds",
    definition: "comparison of risk boundaries")


p.build()
puts p.serialize

License

The gem is available as open source under the terms of the MIT License.