Sugar high!

Inspired by the ‘zucker’ project.

Build Status

Install

gem install sugar-high

Usage

See specs for example use

Update Aug 21, 2011

Extracted file_mutate and sweetloader gems.

Only tested for Ruby 1.9.2 and 1.9.3. Using Travis CI.

Sugar packs

  • alias
  • arguments
  • array
  • blank
  • class_ext
  • delegate (extracted from Active Support)
  • dsl
  • enumerable
  • file
  • includes
  • kind_of
  • math
  • metaclass
  • methods
  • module
  • not
  • numeric
  • path
  • properties
  • reg_exp
  • rails
  • concerns

Alias

  • multi_alias name, options_hash : creates multiple aliases using patterns

Arguments

  • args (Used in generator CLI testing)
  • last_option *args : Returns last argument if hash or empty hash otherwise

Array

  • pick_one! – pick one random item
  • pick (n) – pick n random item
  • to_symbols
  • to_symbols_uniq
  • to_strings
  • flat_uniq
  • file_join

Blank

  • blank?

Class Extension

  • autoload_modules (by @stanislaw)

Makes it easy to autoload multiple modules by standard folder-to-module mapping convention

  • is_class?
  • is_module?
  • class_exists?
  • module_exists?
  • try_class
  • try_module
  • try_module_only
  • find_first_class(*class_names)
  • find_first_module(*module_names)

Note: This pack has recently been extracted into its own gem called sweet_loader

Delegate

Extracted from Active Support core extensions:

See Delegate

activesupport/lib/active_support/core_ext/module/delegation.rb

DSL

by @stanislaw

  • with(instance, *args &block)

Useful as a building block for DSLs!


with(Hash.new) do
  merge!(:a => 1)
  merge!(:b => 2)
end.should == {:a => 1, :b => 2}

with(Hash.new, :ready => true) do |options|
  ...
end

with(Hash.new, 1,2,3) do |*args|
  ...
end

Enumerable

  • only_kinds_of?(*modules)
  • only_labels?
  • select_kinds_of(*modules)
  • select_kinds_of!
  • select_labels
  • select_labels!
  • select_symbols
  • select_symbols!
  • select_uniq_symbols!
  • select_strings
  • select_strings!
  • select_only(type)
  • select_only!(type)

File

  • self.blank? and blank? : Is file empty?
  • self.overwrite : overwrite file with new content (mode = ‘w’)
  • self.append : append to existing file with content or create new (mode = ‘w+’)

Hash

  • hash_revert : Reverse keys and values
  • try_keys : return value of first key that is in Hash

Includes

  • includes : Includes modules listed as symbols

Kind of

  • any_kind_of? *const_list
  • kind_of_label? : Symbol or String ?

Metaclass

  • metaclass : Get the metaclass, can be used to dynamically add class singleton methods!

Methods

  • get_methods *types : Get collection of methods, fx :private and :protected (or :all)

Module

  • modules *names
  • nested_modules *names

Create empty namespaces

Not

  • not

Adds the #not method to Object, so you can say fx: if x.not.empty?

Numeric

module NumericCheckExt

  • is_numeric?(arg) – alias numeric?
  • check_numeric!(arg) – raises error if argument is not numeric

module NumberDslExt added to all numeric classes (Float and Numeric)

  • thousand
  • hundred
3.thousand + 2.hundred 
  => 3200

Path

  • String#path – extends String instance with PathString

module PathString

  • to_file
  • to_dir
  • to_symlink

"a/b/c".to_dir
"a/b/c/d.rb".to_file

File type existance

  • exists?
  • file?
  • dir?
  • symlink?

Navigate dirs

  • up
  • down
  • post_up
  • post_down

"a/b/c/d".up(2).should == "a/b"
"a/b/".post_up(2).should == "a/b/../../"  
"a/b/../".post_down(1).should == "a/b/"  

Properties


class CruiseShip
  extend Properties

  property :direction
  property :speed, is(0..300)
end

ship = CruiseShip.new
ship.add_direction_listener(lambda {|x| puts "Oy... someone changed the direction to #{x}"})    
ship.speed = 200
ship.speed = 301 # outside valid range!

RegExp

String, RegExp

  • to_regexp
"a, b /c".to_regexp # escapes it for reg exp!

MatchData

  • offset_after
  • offset_before

RSpec 2 Matchers

  • have_aliases(method, *alias_methods)

  require 'sugar-high/rspec'

  have_aliases :original, :alias_1, :alias2

Rails

Currently the following Rails packs are included:

  • concerns

More to follow in the future…

Concerns

require 'rails/concerns'

Useful concern pattern in order to include concern modules into Rails models (or even controllers etc.)

  • concerned_with *concern_modules
  • include_concerns *concern_modules
  • shared_concerns *concern_modules
  • include_shared_concerns *concern_modules

String

Class methods

  • random_letters
  • letters

Instance methods

  • alpha_numeric
  • insert_before_last

If not already defined

  • trim
  • concat

Note on Patches/Pull Requests

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add tests for it. This is important so I don’t break it in a future version unintentionally.
  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.

Copyright

Copyright © 2010 Kristian Mandrup. See LICENSE for details.