class Hubscreen::Utils

Public Class Methods

compare_property_lists(klass, source, target) click to toggle source
# File lib/hubscreen/utils.rb, line 74
def compare_property_lists(klass, source, target)
  skip         = [] # Array of skipped properties and the reason
  new_groups   = Set.new # Array of groups to create
  new_props    = [] # Array of properties to add
  update_props = [] # Array of properties to update
  src_groups   = source['groups']
  dst_groups   = target['groups']
  src_props    = source['properties']
  dst_props    = target['properties']

  src_props.each do |src|
    group = find_by_name(src['groupName'], src_groups)
    if src['createdUserId'].blank? && src['updatedUserId'].blank? then
      skip << { prop: src, reason: 'Not user created' }
    else
      dst = find_by_name(src['name'], dst_props)
      if dst
        if dst['readOnlyDefinition']
          skip << { prop: src, reason: 'Definition is read-only' }
        elsif klass.same?(src, dst)
          skip << { prop: src, reason: 'No change' }
        else
          new_groups << group unless group.blank? || find_by_name(group['name'], dst_groups)
          update_props << src
        end
      else
        new_groups << group unless group.blank? || find_by_name(group['name'], dst_groups)
        new_props << src
      end
    end
  end
  [skip, new_groups.to_a, new_props, update_props]
end
create_groups(klass, groups, dry_run=false) click to toggle source
# File lib/hubscreen/utils.rb, line 41
def create_groups(klass, groups, dry_run=false)
  puts '','Creating new groups'
  groups.each do |g|
    if dry_run || klass.create_group!(g)
      puts "Created: #{g['name']}"
    else
      puts "Failed: #{g['name']}"
    end
  end
end
create_properties(klass, props, dry_run=false) click to toggle source
# File lib/hubscreen/utils.rb, line 52
def create_properties(klass, props, dry_run=false)
  puts '','Creating new properties'
  props.each do |p|
    if dry_run || klass.create!(p)
      puts "Created: #{p['groupName']}:#{p['name']}"
    else
      puts "Failed: #{p['groupName']}:#{p['name']}"
    end
  end
end
dump_properties(klass, hapikey=ENV['HUBSPOT_API_KEY'], filter={}) click to toggle source
# File lib/hubscreen/utils.rb, line 20
def dump_properties(klass, hapikey=ENV['HUBSPOT_API_KEY'], filter={})
  with_hapikey(hapikey) do
    { 'groups'     => klass.groups({}, filter),
      'properties' => klass.all({}, filter).select { |p| !p['hubspotDefined'] }
    }
  end
end
hash_to_properties(hash, opts = {}) click to toggle source

Turns a hash into the hubspot properties format

# File lib/hubscreen/utils.rb, line 15
def hash_to_properties(hash, opts = {})
  key_name = opts[:key_name] || "property"
  hash.map { |k, v| { key_name => k.to_s, "value" => v } }
end
properties_to_hash(props) click to toggle source

Parses the hubspot properties format into a key-value hash

# File lib/hubscreen/utils.rb, line 8
def properties_to_hash(props)
  newprops = HashWithIndifferentAccess.new
  props.each { |k, v| newprops[k] = v["value"] }
  newprops
end
restore_properties(klass, hapikey=ENV['HUPSPOT_API_KEY'], properties={}, dry_run=false) click to toggle source
# File lib/hubscreen/utils.rb, line 28
def restore_properties(klass, hapikey=ENV['HUPSPOT_API_KEY'], properties={}, dry_run=false)
  existing_properties                       = dump_properties(klass, hapikey)
  skip, new_groups, new_props, update_props = compare_property_lists(klass, properties, existing_properties)
  puts '', 'Dry Run - Changes will not be applied' if dry_run
  puts '','Skipping'
  skip.each { |h| puts "#{h[:reason]} - #{h[:prop]['groupName']}:#{h[:prop]['name']}" }
  with_hapikey(hapikey) do
    create_groups(klass, new_groups, dry_run)
    create_properties(klass, new_props, dry_run)
    update_properties(klass, update_props, dry_run)
  end
end
update_properties(klass, props, dry_run=false) click to toggle source
# File lib/hubscreen/utils.rb, line 63
def update_properties(klass, props, dry_run=false)
  puts '','Updating existing properties'
  props.each do |p|
    if dry_run || klass.update!(p['name'], p)
      puts "Updated: #{p['groupName']}:#{p['name']}"
    else
      puts "Failed: #{p['groupName']}:#{p['name']}"
    end
  end
end
with_hapikey(hapikey) { || ... } click to toggle source
# File lib/hubscreen/utils.rb, line 108
def with_hapikey(hapikey)
  begin
    Hubspot.configure(hapikey: hapikey) unless hapikey.blank?
    yield if block_given?
  ensure
    Hubspot.configure(hapikey: ENV['HUBSPOT_API_KEY']) unless hapikey.blank?
  end
end

Private Class Methods

find_by_name(name, set) click to toggle source
# File lib/hubscreen/utils.rb, line 119
def find_by_name(name, set)
  set.detect { |item| item['name'] == name }
end