#!/usr/bin/env ruby

#  ComDev Talks: Parse ComDev listings of Apache-related talks
$LOAD_PATH.unshift '/srv/whimsy/lib'
require 'whimsy/asf'

require 'yaml'
require 'json'

COMDEVTALKS = ASF::SVN.svnurl!('comdevtalks') # *.yaml
COMDEVDIR = ASF::SVN['comdevtalks'] # *.yaml
SKIPFILE = 'README.yaml'

# Parse all talks and submitters
def parse_talks(dir = "#{COMDEVDIR}")
  talks = {}
  submitters = {}
  Dir[File.join("#{dir}", "*.yaml")].each do |fname|
    begin
      if fname =~ /_/
        talks["#{File.basename(fname, ".*")}"] = YAML.load(File.read(fname.untaint))
      elsif fname !~ /SKIPFILE/
        submitters["#{File.basename(fname, ".*")}"] = YAML.load(File.read(fname.untaint))
      end
    rescue Exception => e
      puts "Bogosity! analyzing #{fname} raised #{e.message[0..255]}"
      puts "\t#{e.backtrace.join("\n\t")}"
    end
  end

  return talks, submitters
end

# Abstract how cgi gets data
def get_talks_submitters()
  # return parse_talks
  # HACK static data until we have generated public/ or other format
  talks = {"Apache_Way_2017"=>{"title"=>"Apache Way: Effective Open Source Project Management", "teaser"=>"Learn how to manage long-lived diverse open source project communities by following the behaviors of the Apache Way.", "submitter"=>"curcuru", "speakers"=>["curcuru"], "abstract"=>"The \"Apache Way\" is the process by which Apache Software Foundation projects are managed. It has evolved 18 years and has produced over 170 highly successful open source Apache projects. But what is it and how does it work?\n\nLearn the core behaviors that make up the Apache Way, and how they are used in successful Apache projects from core technologies, to big data, to user facing projects.\n\nThe behaviors in the Apache Way are required for all Apache projects, but can be simply used by any open source projects.  Distributed decision making, open communication, do-ocracy, and diverse communities are the cornerstones.\n\nBenefit from the experience of over 5,000 Apache committers and 170 successful projects by applying these behaviors and techniques in your own projects! \n", "audience"=>"Community managers, developers, project managers involved with FOSS projects.", "slides"=>"http://shaneslides.com/apachecon/TheApacheWay-Intro-ApacheConNA2017.html", "video"=>"https://www.youtube.com/watch?v=hpAv54KIgK8", "topics"=>["apacheway", "community"], "present_at"=>["http://apachecon.com/2017"], "present_date"=>"2017-05-16"}, "Committed_To_The_Apache_Way"=>{"title"=>"Committed To The Apache Way", "teaser"=>"Learn how being involved in an Apache project is not just about code.", "submitter"=>"sharan", "speakers"=>["sharan"], "abstract"=>"'To be committed' is a strange phrase. In the past it was used to describe people who were sent to mental institutions or 'facilities'. Fast forward to today and words like committed and commitment are used throughout the Open Source world. Are we all a little crazy? - Perhaps!\n\nIn this presentation Sharan shares her thoughts and experiences about being a Committer, life at the ASF (facility) and how not being able to code is still OK.\n", "audience"=>"Community managers, developers, project managers involved with FOSS projects.", "slides"=>"http://events.linuxfoundation.org/sites/events/files/slides/Commited%20to%20Apache.pdf", "video"=>"https://www.youtube.com/watch?v=vT-kxmoLs5k&index=25&list=PLbzoR-pLrL6pLDCyPxByWQwYTL-JrF5Rp", "topics"=>["community", "contributors"], "present_at"=>["http://apachecon.com/2017"], "present_date"=>"2017-05-16"}, "From_Dev_To_User"=>{"title"=>"From dev@ to user@ to the Apache Way", "teaser"=>"The story of how an existing project community improved by coming to Apache.", "submitter"=>"sblackmon", "speakers"=>["sblackmon"], "abstract"=>"This talk will cover the journey of Apache Streams (incubating) beyond a solution solely by and for java developers, toward a solution that can provide value for anyone, anywhere along the experience spectrum, regardless of technical preferences.  We'll share feedback that served as concentrate focus on mission and usability. \n\nWe'll walk through some of the improvements made to project code and tooling (maven), documentation (website, examples), and usability (command line interface, maven plugins, zeppelin support, network APIs) to move the project from dev@ to user@, and the opportunities we see to increase usability and relevance still further.\n", "audience"=>"Community managers, developers, project managers involved with FOSS projects.", "slides"=>"http://events.linuxfoundation.org/sites/events/files/slides/ApacheConNA2017-Blackmon.pdf", "video"=>"https://www.youtube.com/watch?v=E9A54x6af8o&index=27&list=PLbzoR-pLrL6pLDCyPxByWQwYTL-JrF5Rp", "topics"=>["incubator", "apacheway"], "present_at"=>["http://apachecon.com/2017"], "present_date"=>"2017-05-16"}, "Tale_Of_Two_Developers"=>{"title"=>"A Tale of Two Developers: Finding Harmony Between Commercial Software Development and the Apache Way", "teaser"=>"Learn from the real-life lunchtime dialog between an experienced Apache committer and a new coder.", "submitter"=>"wang", "speakers"=>["wang", "Alex Leblang"], "abstract"=>"Apache community members can reference tenets from the Apache Way such as \u201Ccommunity over code\u201D and \u201Copenness\u201D as if it were second nature. While they may sound simple, these concepts can be foreign to developers coming to open source for the first time. Success as an Apache contributor stresses skills not emphasized in other types of software development, including reconciling the requirements of the upstream development process with the realities of running a commercial software business.\n\nWith the assistance of choreographed Socratic dialogue, our two protagonists, an experienced Apache committer and an enthusiastic young gun contributor, explore the tensions of working on an Apache project as employees of a for-profit company. The audience will learn practical advice and problem solving techniques for working effectively as part of an Apache community. By the end, our greenhorn comes to understand that the yin and yang of commercial software development and the Apache Way can exist in harmony.\n\nOur talk contextualizes the Apache Way for developers who are paid to work on open-source full-time, drawn from our real-world experience working at Cloudera. This is presented through a series of short vignettes accompanied by intervening discussion and review slides. Tenets of the Apache Way like meritocracy, community, and hats are introduced and referred to throughout as the backbone to building strong open-source communities. We examine the tension between corporate pressures and open-source, emphasizing the underlying value that companies gain from open-source software.\n\nOur two main characters are:\n* Alex, an energetic young developer who is new to open source but not to development. Excited to get stuff done on this new project.\n* Andrew, a long-time Apache committer who takes Alex under his wing and teaches him the importance of open-source.\n\nThe outline for our skits are:\n* Act 1: Introduction to Apache and the Apache Way, FAQs from Alex as someone getting started as a new contributor\n* Act 2: How to build consensus when there's conflict (e.g. someone -1's your patch), public communication, demonstrating merit and the path to committership\n* Act 3: No jerks allowed. Andrew does a heel turn and is ruling the project with an iron fist, Alex intervenes in a come-to-jesus/student-becomes-the-teacher moment. Re-emphasize the importance of community, and how dictators are bad for projects.\n", "audience"=>"Community managers, developers, project managers involved with FOSS projects.", "slides"=>nil, "video"=>"https://www.youtube.com/watch?v=ea_9qkaTeVw&index=26&list=PLbzoR-pLrL6pLDCyPxByWQwYTL-JrF5Rp", "topics"=>["apacheway", "developers"], "present_at"=>["http://apachecon.com/2017"], "present_date"=>"2017-05-16"}}
  
  submitters = {"curcuru"=>{"name"=>"Shane Curcuru", "website"=>"http://communityovercode.com/", "twitter"=>"shanecurcuru", "facebook"=>nil, "bio"=>"Shane has been involved at the Apache Software Foundation (ASF) since 1999, and serves as Director and VP of Brand Management, setting trademark policies and helping all 200+ Apache projects implement and defend their brands.\n\nOtherwise, Shane is: a father and husband, a friend, a geek, a Member of the ASF, a baker, and a punny guy.  Oh, and we have cats.  Shane blogs at http://communityovercode.com/ and regularly speaks on FOSS governance and branding topics.\n"}, "README"=>{"title"=>"Talk Title: Strings with colons must be quoted", "teaser"=>"Teaser is one sentence for use on session grids or tweets or the like (where supported).", "submitter"=>"curcuru", "speakers"=>["curcuru", "Court Jester"], "abstract"=>"Abstracts are the full description of a talk, session, or panel that has already been presented.\n\nAbstracts may have line breaks, and some systems may allow **formatting** or the like.\n\nUsing the YAML pipe \"|\" character for a literal multiline scalar means linebreaks are preserved in the abstract. \n", "audience"=>"Brief description of the expected audience for this talk.", "slides"=>"URL.to/posted-slides", "video"=>"URL.to/posted-video?if-any", "present_at"=>["URL.to/last-conference-presented-at"], "present_date"=>"2017-05-16"}, "sblackmon"=>{"name"=>"Steve Blackmon", "website"=>nil, "twitter"=>"steveblackmon", "facebook"=>nil, "bio"=>"VP Technology at People Pattern, previously Director of Data Science at W2O Group, co-founder of Ravel, stints at Boeing, Lockheed Martin, and Accenture. Committer and PMC for Apache Streams (incubating). Experienced user of Spark, Storm, Hadoop, Pig, Hive, Nutch, Cassandra, Tinkerpop, and more.\n"}, "sharan"=>{"name"=>"Sharan Foga", "website"=>nil, "twitter"=>nil, "facebook"=>nil, "bio"=>"Sharan Foga have been involved with the ASF since 2008 and has presented at previous Apachecons (Vancouver 2016, Budapest 2015 & 2014). She enjoys working on community management and related areas and is a Committer and PMC Member for Apache OFBiz and Community Development.\n"}, "wang"=>{"name"=>"Andrew Wang", "website"=>"http://umbrant.com/", "twitter"=>nil, "facebook"=>nil, "bio"=>"Andrew Wang is a software engineer at Cloudera on the HDFS team, where he has worked on projects including in-memory caching, transparent encryption, and erasure coding. Previously, he was a PhD student in the AMP Lab at UC Berkeley, where he worked on problems related to distributed systems and warehouse-scale computing. He is a committer and PMC member on the Apache Hadoop project, a committer on Apache Kudu (incubating), and holds masters and bachelors degrees in computer science from UC Berkeley and UVa respectively. Andrew has spoken at conferences including Hadoop Summit EU, Strata NYC, Strata London, HBaseCon, ACM SoCC, and USENIX HotCloud.\n"}}
  
  return talks, submitters
end

# ## ### #### ##### ######
# Main method for command line use
if __FILE__ == $PROGRAM_NAME
  dir = COMDEVDIR
  outfile = File.join("#{dir}", "comdevtalks.json")
  puts "BEGIN: Parsing YAMLs in #{dir}"
  talks, submitters = parse_talks dir
  results = {}
  results['talks'] = talks
  results['submitters'] = submitters
  File.open(outfile, "w") do |f|
    f.puts JSON.pretty_generate(results)
  end
  puts talks
  puts "END: Thanks for running, see #{outfile}"
  puts submitters
end
