Skip to content

Instantly share code, notes, and snippets.

@rolandwalker
Created August 2, 2014 12:26
Show Gist options
  • Select an option

  • Save rolandwalker/3db81574c64e587a277d to your computer and use it in GitHub Desktop.

Select an option

Save rolandwalker/3db81574c64e587a277d to your computer and use it in GitHub Desktop.
proof-of-concept for Cask variants syntax
# Proposed syntax here is
#
# variant.localization('en') do
# version '1.0'
# end
#
# This syntax would be easier to implement, but cluttered
#
# variant :localization => 'en' do
# version '1.0'
# end
#
# This proof-of-concept was done in about 10 minutes and has
# bugs. In addition, it has un-needed complexity because it
# implements chaining, eg
#
# variant.localization('en').arch('64-bit') do
# version '1.0'
# end
#
class VariantContainer
@@variant_types = [ :localization, :hardware, :os_version, :arch ]
def load(type, choice, block)
@variants ||= {}
@choices ||= {}
@choices.merge!({type => choice})
# todo, order of choices isn't reliable
@variants[@choices] = block if block
# puts @variants.inspect
self
end
@@variant_types.each do |type|
define_method(type) do |*args, &block|
@variants ||= {}
@choices ||= {}
if args.empty?
@choices.fetch(__method__, nil)
else
choice = args.first
load(__method__, choice, block)
end
end
end
def variants
@variants
end
def choices
@choices
end
def initialize(inherit=nil)
@choices = inherit || {}
end
end
class Cask
def self.variant
@variants ||= []
v = VariantContainer.new
@variants << v
v
end
def variant
@variants ||= []
choices = self.class.variants.first.choices || nil
v = VariantContainer.new(choices)
@variants << v
v
end
def self.version(*args)
args.empty? ? @version : @version=args.first
end
def version(*args)
self.class.version(*args)
end
def self.variants
@variants ||= []
end
def variants
self.class.variants
end
end
class Adium < Cask
variant.localization('en') do
version '1.2.3-en'
end
variant.hardware('x86') do
version '1.2.3-x86'
end
variant.hardware('arm') do
version '1.2.3-arm'
end
puts "=================="
puts variants.inspect
end
class Chrome < Cask
variant.localization('en').hardware('x86') do
version '1.2.3-en-x86'
end
variant.localization('en').hardware('ppc') do
version '1.2.3-en-ppc'
end
variant.localization('de').hardware('x86') do
version '1.2.3-de-x86'
end
puts "=================="
puts variants.inspect
end
class Alfred < Cask
version '2'
variant.localization('en') do
version '1.2.3-en-universal'
variant.hardware('x86') do
puts "--------------------> inner block"
version '1.2.3-en-x86'
end
end
puts "=================="
puts variants.inspect
# puts variant.localization.inspect
end
cask = Alfred.new
puts cask.version
puts cask.variants.inspect
block = cask.variants.first.variants.values.first
puts block.inspect
puts "start eval"
result = cask.instance_eval(&block)
puts "stop eval"
puts result.inspect
puts cask.version
puts cask.variants.inspect
# @@@ bug: inspect reports line 135, should be line 137
puts cask.variants.first.variants.values.inspect
exit
block = cask.variants.first.variants.values.first
puts block.inspect
puts "start eval"
result = cask.instance_eval(&block)
puts "stop eval"
puts result.inspect
puts cask.version
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment