charisma 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/charisma.gemspec CHANGED
@@ -1,39 +1,39 @@
1
- $:.push File.expand_path("../lib", __FILE__)
2
- require 'charisma/version'
3
-
4
- Gem::Specification.new do |s|
5
- s.name = 'charisma'
6
- s.version = Charisma::VERSION
7
- s.platform = Gem::Platform::RUBY
8
- s.date = "2011-03-22"
9
- s.authors = ['Andy Rossmeissl', 'Seamus Abshere']
10
- s.email = 'andy@rossmeissl.net'
11
- s.homepage = 'http://github.com/brighterplanet/charisma'
12
- s.summary = %Q{Curate your rich Ruby objects' attributes}
13
- s.description = %Q{Define strategies for accessing and displaying a subset of your classes' attributes}
14
- s.extra_rdoc_files = [
15
- 'LICENSE',
16
- 'README.rdoc',
17
- ]
18
-
19
- s.required_rubygems_version = Gem::Requirement.new('>= 1.3.7')
20
- s.rubygems_version = '1.3.7'
21
- s.specification_version = 3
22
-
23
- s.files = `git ls-files`.split("\n")
24
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
26
- s.require_paths = ['lib']
27
-
28
- s.add_dependency 'activesupport'
29
- s.add_dependency 'actionpack'
30
- s.add_dependency 'blockenspiel'
31
- s.add_dependency 'conversions'
32
-
33
- s.add_development_dependency 'bundler'
34
- s.add_development_dependency 'bueller'
35
- s.add_development_dependency 'rake'
36
- s.add_development_dependency 'rcov'
37
- s.add_development_dependency 'supermodel'
38
- end
39
-
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+ require 'charisma/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = 'charisma'
6
+ s.version = Charisma::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.date = "2011-04-29"
9
+ s.authors = ['Andy Rossmeissl', 'Seamus Abshere']
10
+ s.email = 'andy@rossmeissl.net'
11
+ s.homepage = 'http://github.com/brighterplanet/charisma'
12
+ s.summary = %Q{Curate your rich Ruby objects' attributes}
13
+ s.description = %Q{Define strategies for accessing and displaying a subset of your classes' attributes}
14
+ s.extra_rdoc_files = [
15
+ 'LICENSE',
16
+ 'README.rdoc',
17
+ ]
18
+
19
+ s.required_rubygems_version = Gem::Requirement.new('>= 1.3.7')
20
+ s.rubygems_version = '1.3.7'
21
+ s.specification_version = 3
22
+
23
+ s.files = `git ls-files`.split("\n")
24
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
26
+ s.require_paths = ['lib']
27
+
28
+ s.add_dependency 'activesupport'
29
+ s.add_dependency 'actionpack'
30
+ s.add_dependency 'blockenspiel'
31
+ s.add_dependency 'conversions'
32
+
33
+ s.add_development_dependency 'bundler'
34
+ s.add_development_dependency 'bueller'
35
+ s.add_development_dependency 'rake'
36
+ s.add_development_dependency 'rcov'
37
+ s.add_development_dependency 'supermodel'
38
+ end
39
+
data/lib/charisma.rb CHANGED
@@ -10,7 +10,7 @@ require 'active_support/version'
10
10
  end if ActiveSupport::VERSION::MAJOR == 3
11
11
 
12
12
  require 'action_pack'
13
- require 'active_support/version'
13
+ require 'action_pack/version'
14
14
  %w{
15
15
  action_view/helpers/number_helper
16
16
  }.each do |action_pack_3_requirement|
@@ -30,7 +30,6 @@ require 'charisma/curator'
30
30
  require 'charisma/curator/curation'
31
31
  require 'charisma/number_helper'
32
32
 
33
-
34
33
  module Charisma
35
34
  def self.included(base)
36
35
  base.send :include, Base
@@ -1,19 +1,9 @@
1
1
  module Charisma
2
- class Characterization
3
- attr_reader :characteristics
4
-
5
- def initialize
6
- @characteristics = {}
7
- end
8
-
9
- def [](name)
10
- characteristics[name]
11
- end
12
-
2
+ class Characterization < Hash
13
3
  include Blockenspiel::DSL
14
4
  def has(name, options = {}, &blk)
15
5
  name = name.to_sym
16
- characteristics[name] = Characteristic.new(name, options, &blk)
6
+ self[name] = Characteristic.new(name, options, &blk)
17
7
  end
18
8
  end
19
9
  end
@@ -1,11 +1,39 @@
1
1
  module Charisma
2
2
  class Curator
3
- def initialize(base)
4
- @subject = base
3
+ attr_reader :subject
4
+
5
+ def initialize(subject)
6
+ @subject = subject
7
+ end
8
+
9
+ def [](key)
10
+ if value = subject.send(key)
11
+ Curation.new value, subject.class.characterization[key]
12
+ end
13
+ end
14
+
15
+ def keys
16
+ subject.class.characterization.keys.select do |key|
17
+ !!subject.send(key)
18
+ end
19
+ end
20
+
21
+ def slice(*only_keys)
22
+ only_keys.inject({}) do |memo, key|
23
+ if curation = self[key]
24
+ memo[key] = curation
25
+ end
26
+ memo
27
+ end
5
28
  end
6
29
 
7
- def [](name)
8
- Curation.new @subject.send(name), @subject.class.characterization[name]
30
+ def to_hash
31
+ subject.class.characterization.keys.inject({}) do |memo, key|
32
+ if curation = self[key]
33
+ memo[key] = curation
34
+ end
35
+ memo
36
+ end
9
37
  end
10
38
  end
11
39
  end
@@ -1,3 +1,6 @@
1
+ require 'action_pack'
2
+ require 'action_view'
3
+
1
4
  module Charisma
2
5
  class NumberHelper
3
6
  extend ActionView::Helpers::NumberHelper
@@ -1,3 +1,3 @@
1
- module Charisma
2
- VERSION = "0.1.0"
3
- end
1
+ module Charisma
2
+ VERSION = "0.1.1"
3
+ end
data/test/helper.rb CHANGED
@@ -1,63 +1,73 @@
1
- require 'rubygems'
2
- require 'test/unit'
3
- require 'supermodel'
4
-
5
- $LOAD_PATH.unshift(File.dirname(__FILE__))
6
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
- require 'charisma'
8
-
9
- class Test::Unit::TestCase
10
- end
11
-
12
- class RelativeAstronomicMass < Charisma::Measurement # or don't inherit and provide everything yourself
13
- units :hollagrams => 'hg'
14
- # before_ and after_ filters or some other reason to use this as opposed to Charisma::Measurements::Mass
15
- end
16
-
17
- class Spaceship < SuperModel::Base
18
- attributes :window_count, :name, :size
19
- belongs_to :make, :class_name => 'SpaceshipMake', :primary_key => 'name'
20
- belongs_to :fuel, :class_name => 'SpaceshipFuel', :primary_key => 'name'
21
- belongs_to :destination, :class_name => 'Planet', :primary_key => 'name'
22
-
23
- include Charisma
24
- characterize do
25
- has :make, :display_with => :name
26
- has :fuel
27
- has :window_count do |window_count|
28
- "#{window_count} windows"
29
- end
30
- has :size, :measures => :length # uses Charisma::Measurements::Length
31
- has :weight, :measures => RelativeAstronomicMass
32
- has :name
33
- has :destination
34
- end
35
- end
36
-
37
- class SpaceshipMake < SuperModel::Base
38
- has_many :spaceships
39
- attributes :name
40
- self.primary_key = :name
41
- end
42
-
43
- class SpaceshipFuel < SuperModel::Base
44
- has_many :spaceships
45
- attributes :name, :emission_factor
46
- self.primary_key = :name
47
-
48
- def as_characteristic
49
- "#{name} (#{emission_factor} kg CO2/L)"
50
- end
51
- end
52
-
53
- class Planet < SuperModel::Base
54
- has_many :spaceships
55
- attributes :name
56
- self.primary_key = :name
57
-
58
- def to_s
59
- name
60
- end
61
- end
62
-
63
- Conversions.register :hollagrams, :supertons, 2
1
+ require 'bigdecimal'
2
+ require 'rubygems'
3
+ require 'test/unit'
4
+ require 'supermodel'
5
+
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
8
+ require 'charisma'
9
+
10
+ class Test::Unit::TestCase
11
+ end
12
+
13
+ class RelativeAstronomicMass < Charisma::Measurement # or don't inherit and provide everything yourself
14
+ units :hollagrams => 'hg'
15
+ # before_ and after_ filters or some other reason to use this as opposed to Charisma::Measurements::Mass
16
+ end
17
+
18
+ class Spaceship < SuperModel::Base
19
+ attributes :window_count, :name, :size, :weight
20
+ belongs_to :make, :class_name => 'SpaceshipMake', :primary_key => 'name'
21
+ belongs_to :fuel, :class_name => 'SpaceshipFuel', :primary_key => 'name'
22
+ belongs_to :destination, :class_name => 'Planet', :primary_key => 'name'
23
+
24
+ include Charisma
25
+ characterize do
26
+ has :make, :display_with => :name
27
+ has :fuel
28
+ has :window_count do |window_count|
29
+ "#{window_count} windows"
30
+ end
31
+ has :size, :measures => :length # uses Charisma::Measurements::Length
32
+ has :weight, :measures => RelativeAstronomicMass
33
+ has :name
34
+ has :destination
35
+ end
36
+ end
37
+
38
+ class SpaceshipMake < SuperModel::Base
39
+ has_many :spaceships
40
+ attributes :name
41
+ self.primary_key = :name
42
+ end
43
+
44
+ class SpaceshipFuel < SuperModel::Base
45
+ has_many :spaceships
46
+ attributes :name, :emission_factor
47
+ self.primary_key = :name
48
+
49
+ def as_characteristic
50
+ "#{name} (#{emission_factor} kg CO2/L)"
51
+ end
52
+ end
53
+
54
+ class Planet < SuperModel::Base
55
+ has_many :spaceships
56
+ attributes :name
57
+ self.primary_key = :name
58
+
59
+ def to_s
60
+ name
61
+ end
62
+
63
+ def mass
64
+ case name
65
+ when 'Pluto'
66
+ BigDecimal('1.31e+1_022')
67
+ else
68
+ raise "unknown"
69
+ end
70
+ end
71
+ end
72
+
73
+ Conversions.register :hollagrams, :supertons, 2
@@ -1,41 +1,70 @@
1
- require 'helper'
2
-
3
- class TestCharisma < Test::Unit::TestCase
4
- def test_simple_attribute_characteristic
5
- spaceship = Spaceship.new :name => 'Amaroq'
6
- assert_equal 'Amaroq', spaceship.characteristics[:name].to_s
7
- end
8
- def test_measured_attribute
9
- spaceship = Spaceship.new :size => 10 # meters
10
- assert_equal '10 m', spaceship.characteristics[:size].to_s
11
- end
12
- def test_classified_attribute
13
- spaceship = Spaceship.new :weight => 1_000_000 # hg
14
- assert_equal '1,000,000 hg', spaceship.characteristics[:weight].to_s
15
- end
16
- def test_units
17
- spaceship = Spaceship.new :weight => '1000000.1' # kg
18
- assert_equal :hollagrams, spaceship.characteristics[:weight].units
19
- assert_equal 'hg', spaceship.characteristics[:weight].u
20
- assert_equal 2_000_000.2, spaceship.characteristics[:weight].supertons
21
- end
22
- def test_attribute_with_custom_display
23
- spaceship = Spaceship.new :window_count => 10
24
- assert_equal '10 windows', spaceship.characteristics[:window_count].to_s
25
- end
26
- def test_simple_association
27
- planet = Planet.create :name => 'Pluto'
28
- spaceship = Spaceship.new :destination => planet
29
- assert_equal 'Pluto', spaceship.characteristics[:destination].to_s
30
- end
31
- def test_association_with_display_hint
32
- make = SpaceshipMake.create :name => 'Boeing'
33
- spaceship = Spaceship.new :make => make
34
- assert_equal 'Boeing', spaceship.characteristics[:make].to_s
35
- end
36
- def test_association_with_prepared_display
37
- fuel = SpaceshipFuel.create :name => 'Kerosene', :emission_factor => 10
38
- spaceship = Spaceship.new :fuel => fuel
39
- assert_equal 'Kerosene (10 kg CO2/L)', spaceship.characteristics[:fuel].to_s
40
- end
41
- end
1
+ require 'helper'
2
+
3
+ class TestCharisma < Test::Unit::TestCase
4
+ def test_001_simple_attribute_characteristic
5
+ spaceship = Spaceship.new :name => 'Amaroq'
6
+ assert_equal 'Amaroq', spaceship.characteristics[:name].to_s
7
+ end
8
+ def test_002_measured_attribute
9
+ spaceship = Spaceship.new :size => 10 # meters
10
+ assert_equal '10 m', spaceship.characteristics[:size].to_s
11
+ end
12
+ def test_003_classified_attribute
13
+ spaceship = Spaceship.new :weight => 1_000_000 # hg
14
+ assert_equal '1,000,000 hg', spaceship.characteristics[:weight].to_s
15
+ end
16
+ def test_004_units
17
+ spaceship = Spaceship.new :weight => '1000000.1' # kg
18
+ assert_equal :hollagrams, spaceship.characteristics[:weight].units
19
+ assert_equal 'hg', spaceship.characteristics[:weight].u
20
+ assert_equal 2_000_000.2, spaceship.characteristics[:weight].supertons
21
+ end
22
+ def test_005_attribute_with_custom_display
23
+ spaceship = Spaceship.new :window_count => 10
24
+ assert_equal '10 windows', spaceship.characteristics[:window_count].to_s
25
+ end
26
+ def test_006_simple_association
27
+ planet = Planet.create :name => 'Pluto'
28
+ spaceship = Spaceship.new :destination => planet
29
+ assert_equal 'Pluto', spaceship.characteristics[:destination].to_s
30
+ end
31
+ def test_007_association_with_display_hint
32
+ make = SpaceshipMake.create :name => 'Boeing'
33
+ spaceship = Spaceship.new :make => make
34
+ assert_equal 'Boeing', spaceship.characteristics[:make].to_s
35
+ end
36
+ def test_008_association_with_prepared_display
37
+ fuel = SpaceshipFuel.create :name => 'Kerosene', :emission_factor => 10
38
+ spaceship = Spaceship.new :fuel => fuel
39
+ assert_equal 'Kerosene (10 kg CO2/L)', spaceship.characteristics[:fuel].to_s
40
+ end
41
+ def test_009_number_helper
42
+ assert_equal '1,000', Charisma::NumberHelper.delimit(1_000)
43
+ end
44
+ def test_010_characteristics_slice
45
+ spaceship = Spaceship.new :name => 'Amaroq'
46
+ assert_equal 'Amaroq', spaceship.characteristics.slice(:name)[:name].to_s
47
+ end
48
+ def test_011_associated_object_methods
49
+ planet = Planet.create :name => 'Pluto'
50
+ spaceship = Spaceship.new :destination => planet
51
+ assert_equal BigDecimal('1.31e+1_022'), spaceship.characteristics[:destination].mass
52
+ end
53
+ def test_012_missing_characteristics_come_back_as_nil
54
+ spaceship = Spaceship.new :name => 'Amaroq'
55
+ assert_equal nil, spaceship.characteristics[:size]
56
+ end
57
+ def test_013_characteristics_keys
58
+ spaceship = Spaceship.new :name => 'Amaroq'
59
+ assert_equal [:name].sort_by { |k| k.to_s }, spaceship.characteristics.keys.sort_by { |k| k.to_s }
60
+ spaceship.weight = 1_000_000
61
+ assert_equal [:name, :weight].sort_by { |k| k.to_s }, spaceship.characteristics.keys.sort_by { |k| k.to_s }
62
+ end
63
+ def test_014_characterization_keys
64
+ assert_equal [:destination, :fuel, :make, :name, :size, :weight, :window_count].sort_by { |k| k.to_s }, Spaceship.characterization.keys.sort_by { |k| k.to_s }
65
+ end
66
+ def test_015_to_hash_preserving_curation
67
+ spaceship = Spaceship.new :name => 'Amaroq'
68
+ assert_equal 'Amaroq', spaceship.characteristics.to_hash[:name].to_s
69
+ end
70
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: charisma
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 0
10
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Andy Rossmeissl
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-03-22 00:00:00 -04:00
19
+ date: 2011-04-29 00:00:00 -04:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency