module Negroku class Feature include Virtus.value_object values do attribute :name, String attribute :required, Boolean, default: false attribute :enabled, Boolean, default: false, :writer => :public end end end class Negroku::ConfigFactory include Virtus.model def self.loaded_in_bundler(*names) Bundler.locked_gems.dependencies.any? { |a| names.include?(a.name) } end attribute :bower, Negroku::Feature, default: { name: 'bower', enabled: File.exist?('bower.json') } attribute :bundler, Negroku::Feature, default: { name: 'bundler', enabled: File.exist?('Gemfile') } attribute :delayed_job, Negroku::Feature, default: { name: 'delayed_job', enabled: loaded_in_bundler('delayed_job', 'delayed_job_active_record') } attribute :nginx, Negroku::Feature, default: { name: 'nginx', enabled: true, required: true } attribute :nodenv, Negroku::Feature, default: { name: 'nodenv', enabled: true, required: true } attribute :rails, Negroku::Feature, default: { name: 'rails', enabled: loaded_in_bundler('rails') } attribute :rbenv, Negroku::Feature, default: { name: 'rbenv', enabled: true, required: true } attribute :sphinx, Negroku::Feature, default: { name: 'sphinx', enabled: loaded_in_bundler('thinking-sphinx') } attribute :unicorn, Negroku::Feature, default: { name: 'unicorn', enabled: loaded_in_bundler('unicorn') } attribute :puma, Negroku::Feature, default: { name: 'puma', enabled: loaded_in_bundler('puma') } attribute :whenever, Negroku::Feature, default: { name: 'whenever', enabled: File.exist?('config/schedule.rb') } # private end Negroku::Config = Negroku::ConfigFactory.new