blob: 5bc18fd4a17d3827d7136b5460c8d352989abd24 [file] [log] [blame]
#!/usr/bin/env ruby
PAGETITLE = "Listing of Apache Trademarks" # Wvisible:brand,trademarks
# return output in JSON format if the query string includes 'json'
ENV['HTTP_ACCEPT'] = 'application/json' if ENV['QUERY_STRING'].include? 'json'
$LOAD_PATH.unshift '/srv/whimsy/lib'
require 'csv'
require 'json'
require 'whimsy/asf'
require 'wunderbar'
require 'wunderbar/bootstrap'
require 'wunderbar/jquery'
require 'net/http'
# Fieldnames/values from counsel provided docket.csv
MNAM = 'TrademarkName'
COUNTRY = 'CountryName'
STAT = 'TrademarkStatus'
CLASS = 'Class'
REG = 'RegNumber'
APPNUMBER = 'AppNumber'
CLASSGOODS = 'ClassGoods'
REGISTERED = 'Registered'
USA = 'United States of America'
UNREG_ID = 'unreg_'
MAP_PMC_REG = {
'lucene' => 'lucene-core'
}
# Transform docket spreadsheet into structured JSON
def csv2json
brand_dir = ASF::SVN['brandlist']
csv = CSV.read("#{brand_dir}/docket.csv", headers:true)
docket = {}
csv.each do |r|
r << ['pmc', r[MNAM].downcase.sub('.org','').sub(' & design','')]
key = r['pmc'].to_sym
mrk = {}
%W[ #{STAT} #{COUNTRY} #{CLASS} #{APPNUMBER} #{REG} #{CLASSGOODS} ].each do |col|
mrk[col] = r[col]
end
if not docket.key?(key)
docket[key] = { r[MNAM] => [mrk] }
else
if not (docket[key]).key?(r[MNAM])
docket[key][r[MNAM]] = [mrk]
else
docket[key][r[MNAM]] << mrk
end
end
end
docket
end
# Since the CSV changes rarely, it is manually checked in separately
_json do
csv2json
end
def _unreg(pmc, proj, parent, n)
_div!.panel.panel_default id: pmc do
_div!.panel_heading role: "tab", id: "#{parent}h#{n}" do
_h4!.panel_title do
_a!.collapsed role: "button", data_toggle: "collapse", aria_expanded: "false", data_parent: "##{parent}", href: "##{parent}c#{n}", aria_controls: "#{parent}c#{n}" do
_! proj['name']
_{"&trade; software"}
end
end
end
_div!.panel_collapse.collapse id: "#{parent}c#{n}", role: "tabpanel", aria_labelledby: "#{parent}h#{n}" do
_div!.panel_body do
_a! href: proj['homepage'] do
_! "#{proj['name']}: "
end
_! proj['description']
end
end
end
end
def _marks(marks)
marks.each do |mark, items|
_ul.list_group do
_li!.list_group_item.active do
_{"#{mark} &reg;"}
end
items.each do |itm|
if itm[STAT] == REGISTERED then
if itm[COUNTRY] == USA then
_li.list_group_item do
_a! "In the #{itm[COUNTRY]}, class #{itm[CLASS]}, reg # #{itm[REG]}", href: "https://tsdr.uspto.gov/#caseNumber=#{itm[REG]}&caseSearchType=US_APPLICATION&caseType=DEFAULT&searchType=statusSearch"
end
else
_li.list_group_item "In #{itm[COUNTRY]}, class #{itm[CLASS]}, reg # #{itm[REG]}"
end
end
end
end
end
end
def _project(pmc, pnam, purl, marks)
_div.panel.panel_primary id: pmc do
_div.panel_heading do
_h3!.panel_title do
_a! pnam, href: purl
_{"&reg; software"}
end
end
_div.panel_body do
allr = true # If any are not Registered, just say "or applied for..."; ignore other status details
marks.each do |mark, items|
if items.any? {|itm| itm[STAT] != REGISTERED }
allr = allr & false
end
end
if allr
_{"The ASF owns the following registered trademarks for our #{pnam}&reg; software:"}
else
_{"The ASF owns the following registered or applied for trademarks for our #{pnam}&reg; software:"}
end
end
_marks marks
end
end
def _apache(marks)
_div.panel.panel_primary id: 'apache' do
_div.panel_heading do
_h3.panel_title do
_{"Our APACHE&reg; trademarks"}
end
end
_div!.panel_body do
_{"Our APACHE&reg; trademark represents our house brand of consensus-driven, community built software for the public good."}
end
_marks marks
end
end
_html do
_body? do
_whimsy_body(
title: PAGETITLE,
related: {
"https://www.apache.org/foundation/marks/resources" => "Trademark Site Map",
"https://www.apache.org/foundation/marks/list/" => "Official Apache Trademark List",
"https://www.apache.org/foundation/marks/contact" => "Contact Us About Trademarks"
},
helpblock: -> {
_p "This is an automated listing of the trademarks claimed by the ASF on behalf of our many project communities."
_p do
_ 'See the list of '
_a 'Registered trademarks', href: '#registered'
_ ' or see other trademarks by letter: '
end
_ul.list_inline do
("A".."Z").each do |ltr|
_li do
_a ltr, href: "##{UNREG_ID}#{ltr.downcase}"
end
end
end
}
) do
brand_dir = ASF::SVN['brandlist']
docket = JSON.parse(File.read("#{brand_dir}/docket.json"))
projects = JSON.parse(Net::HTTP.get(URI('https://projects.apache.org/json/foundation/projects.json')))
_h3 'The ASF holds the following registered trademarks:', id: 'registered'
docket.each do |proj, marks|
# Map project name to name in projects.json for unusual cases
MAP_PMC_REG.key?(proj) ? pmc = MAP_PMC_REG[proj] : pmc = proj
if pmc == 'apache' then
_apache(marks)
elsif projects.key?(pmc) then
_project pmc, projects[pmc]['name'], projects[pmc]['homepage'], marks
else
# TODO map all pmc names to projects or podlings
_project pmc.downcase, 'Apache ' + pmc.capitalize, 'https://' + pmc + '.apache.org', marks
end
end
_h3 'The ASF holds the following unregistered trademarks:'
allproj = projects.group_by { |k, v| /Apache\s+(.)/.match(v['name'])[1].downcase }
allproj.sort.each do |ltr, parr|
parent = "#{UNREG_ID}#{ltr}"
_div.panel_group id: parent, role: "tablist", aria_multiselectable: "true" do
parr.each_with_index do |x, num|
unless docket[x[0]] then
_unreg(x[0], x[1], parent, num)
end
end
end
end
end
end
end