From 340ce5110189e44311578aad9b39c8c17812e79f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Fri, 17 Jan 2025 10:48:37 +0100 Subject: [PATCH] Add information about project governance and team --- _data/governance.yml | 11 +++ _ext/governance_file_parser.rb | 24 ++++++ _ext/pipeline.rb | 2 + .../community-contributors.html.haml | 15 ++-- .../menu/desktop-left-community.html.haml | 12 +++ .../menu/mobile-section-community.html.haml | 8 ++ community/governance.adoc | 80 +++++++++++++++++++ community/team.html.haml | 72 +++++++++++++++++ stylesheets/styles.scss | 2 +- 9 files changed, 215 insertions(+), 11 deletions(-) create mode 100644 _data/governance.yml create mode 100644 _ext/governance_file_parser.rb create mode 100644 community/governance.adoc create mode 100644 community/team.html.haml diff --git a/_data/governance.yml b/_data/governance.yml new file mode 100644 index 000000000..292bbc3d2 --- /dev/null +++ b/_data/governance.yml @@ -0,0 +1,11 @@ +leaders: + # Order is consistent with the order of projects in the top menu. + sebersole: + - orm + marko-bekhta: + - search + - validator + DavideD: + - reactive + koentsje: + - tools \ No newline at end of file diff --git a/_ext/governance_file_parser.rb b/_ext/governance_file_parser.rb new file mode 100644 index 000000000..812796d12 --- /dev/null +++ b/_ext/governance_file_parser.rb @@ -0,0 +1,24 @@ +require 'fileutils' + +module Awestruct + module Extensions + # Parses _data/governance.yml and makes it available under site.governance + class GovernanceFileParser + + def initialize(data_dir="_data") + @data_dir = data_dir + end + + def watch(watched_dirs) + watched_dirs << @data_dir + end + + def execute(site) + # keep reference to site + @site = site + + @site.governance = @site.engine.load_yaml( "#{site.dir}/#{@data_dir}/governance.yml" ) + end + end + end +end diff --git a/_ext/pipeline.rb b/_ext/pipeline.rb index 4f3d4da3c..fe287f878 100644 --- a/_ext/pipeline.rb +++ b/_ext/pipeline.rb @@ -5,6 +5,7 @@ require 'relative' require 'releases' require 'release_file_parser' +require 'governance_file_parser' require 'redirect_creator' require 'directory_listing' require 'links' @@ -45,6 +46,7 @@ # register extensions and transformers extension Awestruct::Extensions::ReleaseFileParser.new + extension Awestruct::Extensions::GovernanceFileParser.new transformer Awestruct::Extensions::JsMinifier.new transformer Awestruct::Extensions::CssMinifier.new transformer Awestruct::Extensions::HtmlMinifier.new diff --git a/_layouts/community/community-contributors.html.haml b/_layouts/community/community-contributors.html.haml index ce1a88acb..0036981e9 100644 --- a/_layouts/community/community-contributors.html.haml +++ b/_layouts/community/community-contributors.html.haml @@ -17,15 +17,10 @@ layout: community-standard %p   -.text-center#contributor-loader +.text-center#list-loader %i.notched.circle.loading.icon.massive -#contributor-list(style="display:none") - -:javascript - $(document).ready(function() { - }); - +#list.contributor-list(style="display:none") :javascript $(document).ready(function() { @@ -45,9 +40,9 @@ layout: community-standard ); }); - $( '#contributor-list' ).append( items ); - $( '#contributor-loader' ).hide(); - $( '#contributor-list' ).fadeIn(); + $( '#list' ).append( items ); + $( '#list-loader' ).hide(); + $( '#list' ).fadeIn(); }); }); }); diff --git a/_partials/menu/desktop-left-community.html.haml b/_partials/menu/desktop-left-community.html.haml index aaf5e779f..9e24eaba4 100644 --- a/_partials/menu/desktop-left-community.html.haml +++ b/_partials/menu/desktop-left-community.html.haml @@ -7,6 +7,12 @@ %i.grid.icon.users Community + - href = "/community/governance/" + - active = (href == current_path) + %a.item{:href => href, :class => "#{(active ? "active" : "")}"} + %i.grid.icon.university + Governance + .ui.dropdown.link.item{:class => "#{(current_path.start_with?( '/community/commonhaus/' ) ? "selected" : "")}"} Commonhaus %i.icon.dropdown @@ -35,6 +41,12 @@ %a.item{:href => href, :class => "#{(current_path.start_with?( href ) ? "selected" : "")}"} Build Hibernate ORM + - href = "/community/team/" + - active = (href == current_path) + %a.item{:href => href, :class => "#{(active ? "active" : "")}"} + %i.grid.icon.id.badge + Team + .ui.dropdown.link.item{:class => "#{(current_path.start_with?( '/community/contributors/' ) ? "selected" : "")}"} Contributors %i.icon.dropdown diff --git a/_partials/menu/mobile-section-community.html.haml b/_partials/menu/mobile-section-community.html.haml index a802d905e..e30fca57c 100644 --- a/_partials/menu/mobile-section-community.html.haml +++ b/_partials/menu/mobile-section-community.html.haml @@ -12,6 +12,10 @@ %a.item(href="/community/"){:class => "#{(item_active ? "active" : "")}"} %i.grid.icon.users Community + - href = "/community/governance/" + %a.item{:href => href, :class => "#{(current_path == href ? "active" : "")}"} + %i.grid.icon.university + Governance - href = "/community/commonhaus/" %a.item{:href => href, :class => "#{(current_path == href ? "active" : "")}"} Commonhaus - Membership @@ -30,6 +34,10 @@ - href = "/community/contribute/build-hibernate-orm/" %a.item{:href => href, :class => "#{(current_path.start_with?( href ) ? "active" : "")}"} Contribute - Build Hibernate ORM + - href = "/community/team/" + %a.item{:href => href, :class => "#{(current_path == href ? "active" : "")}"} + %i.grid.icon.id.badge + Team - item_active = (current_path == '/community/contributors/orm/') %a.item(href="/community/contributors/orm/"){:class => "#{(item_active ? "active" : "")}"} %i.grid.icon.database diff --git a/community/governance.adoc b/community/governance.adoc new file mode 100644 index 000000000..c7f6d311e --- /dev/null +++ b/community/governance.adoc @@ -0,0 +1,80 @@ += Governance +:toc: +:awestruct-layout: community-standard + +This document outlines the governance model for Hibernate projects. +This governance model is designed to uphold the principles of transparency, open collaboration, and community involvement. + +[[roles]] +== Roles and Responsibilities + +- **Contributors:** Anyone who contributes to Hibernate projects in any form. +- **Members:** Contributors eligible for write access to a Hibernate code repository. + Responsible for reviewing and merging contributions in their area of expertise. +- **Project Leaders:** Elected members (at most one per code repository) with higher decision power whenever the project they lead is directly affected. + Responsible for steering project direction, and for enforcing compliance with requirements of the Commonhaus Foundation. + +Small or inactive projects may not have a leader, +in which case Members interested in the project will steer the project direction. + +[[decision-making]] +== Decision-Making + +Hibernate projects follow the https://www.commonhaus.org/bylaws/decision-making.html[Commonhaus decision-making process], with one additional provision. + +Consensus-seeking (lazy consensus):: +Projects primarily aims for a consensus-based decision-making process, where Members and active contributors discuss and come to an agreement. +Voting:: +In situations where consensus cannot be reached, decisions may be made through a simple majority vote among Members. +Conflict Resolution:: +If conflicts arise, Members are responsible for facilitating a resolution. The https://www.commonhaus.org/bylaws/cf-council.html[Commonhaus Foundation Council] (CFC) can be asked to mediate the discussion, if necessary. +Overruling _(Hibernate-specific)_:: +Project Leaders hold the power to overrule any decision directly affecting the project they lead. +This allows swift decisions on urgent or critical matters. +Appeal to such overruling follows conflict resolution rules described above. +// This is intended to balance the very extensive power of project leaders. +In extreme cases, abuse of this power may result in the role of Project Leader being revoked (see below). + +[[role-granting-revoking]] +== Role granting/revoking + +The role of Member or Project Leader is granted or revoked through the <>, +with additional restrictions: + +1. The discussion must happen on the Hibernate development mailing list, as listed in the link:/community[Community page on this website]. +// This prevents a Project Leader overruling their own revocation, or arbitrarily instating/revoking others. +2. Project Leaders may not use their overruling power. +// This is consistent with Commonhaus' own processes, which use supermajority for critical decisions. +3. If consensus cannot be reached, + the ensuing vote requires supermajority approval by two-thirds of voting Members, instead of simple majority. +// This is long on purpose, to eliminates the risk of a decision being taken "in absentia" during e.g. holidays. +// The assumption is that decisions around the project can be taken collectively, or by the previous leader, in the interim. +4. Discussions regarding the role of Project Leader may not last less than 30 days. + +Eligible candidates are: + +For the role of Member:: +Any contributor. +For the role of Project Leader:: +Any contributor to the project they will lead, provided the candidate is a Commonhaus Foundation member, +// TODO update link upon the PR getting merged. +and agrees to become a Signatory of the https://github.com/commonhaus/foundation/pull/219/files#diff-64f58a8e70e16b011f35a30256797c538e6a951da4e9985943b55f4abe6e94b1[Commonhaus Fiscal Sponsorship Agreement] before taking on their new role. + +Members and Project Leaders keep their role indefinitely, unless they resign or a new decision revokes their role. + +The list of Members and Project Leaders is kept up-to-date on the link:/community/team["Team" page] of this website. + +[[code-of-conduct]] +== Code of Conduct + +All participants in Hibernate projects are expected to adhere to the https://www.commonhaus.org/policies/code-of-conduct/[Commonhaus Foundation Code of Conduct]. Please ensure you are familiar with its guidelines and expectations, as it's essential for maintaining a positive and collaborative environment. + +[[trademark-policy]] +== Trademark Policy + +The Hibernate logos, icons, and domain names are protected by trademark rights. Usage of these trademarks must adhere to the https://www.commonhaus.org/policies/trademark-policy/[Commonhaus Foundation Trademark Policy]. + +[[contributing]] +== Contributing + +We welcome all forms of contribution, from code improvements to documentation and design. For details on how to contribute and the process your contributions will follow, please read our link:/community/contribute/[Contributing Guidelines]. diff --git a/community/team.html.haml b/community/team.html.haml new file mode 100644 index 000000000..c00a9c6e0 --- /dev/null +++ b/community/team.html.haml @@ -0,0 +1,72 @@ +--- +layout: community-standard +title: Hibernate Team +--- + +%h2{:id => "leaders"} Project Leaders + +.ui.icon.message + %i.icon.id.badge + .content + This is a list of all + %a(href="/community/governance/#roles") + Hibernate Project Leaders + \. + +.contributor-list.leader-list + - site.governance.leaders.each do |login, project_names| + - project_names_joined = project_names.map { |key| site.projects[key].name } .join( ', ' ) + .ui.card.contributor{:"data-github-login" => login, :"data-project-names" => project_names_joined} + .content + .header + %a{:href => "https://github.com/#{login}"} + #{login} + .extra.content + Leader of #{project_names_joined}. + +%h2{:id => "members"} Members + +.ui.icon.message + %i.icon.id.badge + .content + This is a list of all + %a(href="/community/governance/#roles") + Hibernate Members + who decided to make their membership public on GitHub. + +%p   + +.text-center#list-loader + %i.notched.circle.loading.icon.massive + +#list.contributor-list(style="display:none") + +:javascript + $(document).ready(function() { + var contributorsNameMapping; + $.getJSON( "/community/contributors/contributors-name-mapping.json", function( data ) { + contributorsNameMapping = data; + $.getJSON( "https://api.github.com/orgs/hibernate/public_members", function( data ) { + var items = []; + data.forEach( function( member ) { + var memberName = contributorsNameMapping ? (contributorsNameMapping[member.login] ? contributorsNameMapping[member.login] : member.login) : member.login; + + var item = $( '