Created
August 2, 2014 12:26
-
-
Save rolandwalker/3db81574c64e587a277d to your computer and use it in GitHub Desktop.
proof-of-concept for Cask variants syntax
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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