class Jekyll::AttendeasePlugin::EventDataGenerator

Public Instance Methods

generate(site) click to toggle source
# File lib/jekyll/attendease_plugin/event_data_generator.rb, line 21
def generate(site)
  return if site.config.organization?

  if site.config.attendease['api_host'] && !site.config.attendease['api_host'].match(/^https/)
    raise "Is your Attendease api_host site properly in _config.yml? Needs to be something like https://myevent.attendease.com/"
  else
    # add a trailing slash if we are missing one.
    if site.config.attendease['api_host'][-1, 1] != '/'
      site.config.attendease['api_host'] += '/'
    end

    @attendease_data_path = File.join(site.config['attendease_source'], '_attendease', 'data')

    FileUtils.mkdir_p(@attendease_data_path)

    if site.config.cms_theme?
      data_files = %w[site event pages portal_pages site_settings organization_site_settings mappable].map { |m| "#{m}.json"} << 'lingo.yml'
    else
      data_files = %w[site event sessions presenters rooms filters venues sponsors pages site_settings].map { |m| "#{m}.json"} << 'lingo.yml'
    end

    # no more site in nextgen themes
    #data_files.shift if site.config.attendease['jekyll33']

    data_files.each do |filename|
      update_data = true
      data = nil

      file = File.join(@attendease_data_path, filename)

      if File.exists?(file) && use_cache?(site, file)
        update_data = false

        if filename.match(/json$/)
          begin
            data = JSON.parse(File.read(file))
          rescue => e
            raise "Error parsing #{file}: #{e.inspect}"
          end
        else
          data = File.read(file)
        end
      end

      key = "has_#{filename.split('.')[0]}"

      # don't bother making a request for resources that don't exist in the event
      if !site.config.attendease[key].nil? && !site.config.attendease[key]
        update_data = false
        data = []
      end

      if update_data
        options = {}
        options.merge!(:headers => {'X-Event-Token' => site.config.attendease['access_token']}) if site.config.attendease['access_token']

        request_filename = filename.gsub(/yml$/, 'yaml')
        response = get("#{site.config.attendease['api_host']}api/#{request_filename}?meta=true", options)

        #if (filename.match(/yaml$/) || data.is_a?(Hash) && !data['error']) || data.is_a?(Array)
        if (!response.nil? && response.response.is_a?(Net::HTTPOK))
          Jekyll.logger.info "[Attendease] Saving #{filename} data..."

          if filename.match(/json$/)
            data = response.parsed_response
            File.open(file, 'w') { |f| f.write(data.to_json) }
          else # yaml
            File.open(file, 'w') { |f| f.write(response.body) }
          end
        else
          raise "Request failed for #{site.config.attendease['api_host']}api/#{request_filename}. Is your Attendease api_host site properly in _config.yml?"
        end
      end

      # make this data available to anything that wants it
      site.config['attendease'][File.basename(filename, '.*')] = data
      site.data[File.basename(filename, '.*')] = data

      if data.is_a?(Hash)
        # DEPRECATED
        if filename == 'site.json'
          # Adding to site config so we can access these variables globally without using a Liquid Tag so we can use if/else
          site.config['attendease']['data'] = {}

          data.keys.each do |tag|
            site.config['attendease']['data'][tag] = data[tag]
            # memorandum from the department of redundancy department:
            # --------------------------------------------------------
            # support accessing the attendease_* variables without the
            # attendease_ prefix because they're already namespaced in
            # site.attendease.data
            #
            # TODO: update all themes to not use attendease_ variables
            #       and then retire them from the ThemeManager.
            if tag.match(/^attendease_/)
              site.config['attendease']['data'][tag.gsub(/^attendease_/, '')] = data[tag]
            end
          end
        end
      end
    end

    # provide a structure of session instances (timeslots) grouped
    # by day (suitable for displaying a schedule)
    unless site.config.cms_theme?
      site.config['attendease']['days'] = []
      schedule_data = ScheduleDataParser.new(site)
      site.config['attendease']['event']['dates'].each do |day|
        instances = []
        schedule_data.sessions.each do |s|
          s['instances'].each do |instance|
            if instance['date'] == day['date']
              instance['session'] = s
              instances << instance
            end
          end
        end

        day['instances'] = instances.sort {|x,y| [x['time'], x['session']['name']] <=> [y['time'], y['session']['name']]}
        site.config['attendease']['days'] << day
      end
    end

    # make the event available to anyone
    event = JSON.parse(File.read("#{@attendease_data_path}/event.json"))
    site.config['attendease']['event'] = event

    if site.config.attendease['copy_data']
      data_dir = File.join(site.source, 'attendease_data')
      FileUtils.mkdir(data_dir) unless File.exists?(data_dir)
      site.config['attendease']['data_files'] = {}

      Dir.chdir(@attendease_data_path) do
        extension = '.json'
        Dir.glob('*.json').each do |f|
          base_name = File.basename(f, extension)
          digest = Digest::SHA2.file(f).hexdigest
          digest_file = "#{base_name}-#{digest}.json"
          FileUtils.cp(f, File.join(data_dir, digest_file))
          site.config['attendease']['data_files'][base_name] = digest_file
        end
      end

      # tell Jekyll about these new static files to publish
      site.reader.read_directories 'attendease_data'
    end
  end
end
get(url, options = {}) click to toggle source
# File lib/jekyll/attendease_plugin/event_data_generator.rb, line 8
def get(url, options = {})
  begin
    HTTParty.get(url, options)
  rescue => e
    Jekyll.logger.error "Could not connect to #{url}."
    puts e.inspect
  end
end
use_cache?(site, file) click to toggle source
# File lib/jekyll/attendease_plugin/event_data_generator.rb, line 17
def use_cache?(site, file)
  (Time.now.to_i - File.mtime(file).to_i) <= (site.config.attendease['cache_expiry'].nil? ? 30 : site.config.attendease['cache_expiry'])  # file is less than 30 seconds old
end