comma 3.1.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. data/Appraisals +6 -1
  2. data/Gemfile.lock +1 -1
  3. data/README.markdown +42 -2
  4. data/gemfiles/{active3.2.11.gemfile → active3.0.20.gemfile} +2 -2
  5. data/gemfiles/{active3.0.9.gemfile.lock → active3.0.20.gemfile.lock} +17 -17
  6. data/gemfiles/active3.1.12.gemfile.lock +1 -1
  7. data/gemfiles/{active3.0.9.gemfile → active3.2.14.gemfile} +2 -2
  8. data/gemfiles/{active3.2.11.gemfile.lock → active3.2.14.gemfile.lock} +14 -14
  9. data/gemfiles/active4.0.0.gemfile.lock +1 -1
  10. data/gemfiles/{rails3.0.9.gemfile → data_mapper1.2.0.gemfile} +2 -2
  11. data/gemfiles/data_mapper1.2.0.gemfile.lock +101 -0
  12. data/gemfiles/mongoid3.1.4.gemfile.lock +2 -2
  13. data/gemfiles/{rails3.1.1.gemfile → rails3.0.20.gemfile} +1 -1
  14. data/gemfiles/{rails3.0.9.gemfile.lock → rails3.0.20.gemfile.lock} +41 -41
  15. data/gemfiles/rails3.1.12.gemfile.lock +1 -1
  16. data/gemfiles/{rails3.2.11.gemfile → rails3.2.14.gemfile} +1 -1
  17. data/gemfiles/{rails3.2.11.gemfile.lock → rails3.2.14.gemfile.lock} +42 -43
  18. data/gemfiles/rails4.0.0.gemfile.lock +1 -1
  19. data/lib/comma.rb +3 -1
  20. data/lib/comma/data_extractor.rb +78 -0
  21. data/lib/comma/data_mapper_collection.rb +7 -0
  22. data/lib/comma/extractor.rb +36 -0
  23. data/lib/comma/header_extractor.rb +48 -0
  24. data/lib/comma/object.rb +4 -0
  25. data/lib/comma/version.rb +1 -1
  26. data/spec/comma/{extractors_spec.rb → data_extractor_spec.rb} +2 -60
  27. data/spec/comma/header_extractor_spec.rb +68 -0
  28. data/spec/comma/rails/data_mapper_collection_spec.rb +49 -0
  29. metadata +138 -102
  30. checksums.yaml +0 -15
  31. data/gemfiles/active3.1.1.gemfile +0 -9
  32. data/gemfiles/active3.1.1.gemfile.lock +0 -58
  33. data/gemfiles/rails3.1.1.gemfile.lock +0 -124
  34. data/lib/comma/extractors.rb +0 -131
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- comma (3.1.0)
4
+ comma (3.2.0)
5
5
  activesupport (>= 3.0.0)
6
6
 
7
7
  GEM
@@ -3,7 +3,7 @@
3
3
  source "http://rubygems.org"
4
4
 
5
5
  gem "fastercsv", :platforms=>:ruby_18
6
- gem "rails", "3.2.11"
6
+ gem "rails", "3.2.14"
7
7
  gem "rspec-rails"
8
8
 
9
9
  gemspec :path=>"../"
@@ -1,38 +1,38 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- comma (3.1.0)
4
+ comma (3.2.0)
5
5
  activesupport (>= 3.0.0)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
- actionmailer (3.2.11)
11
- actionpack (= 3.2.11)
12
- mail (~> 2.4.4)
13
- actionpack (3.2.11)
14
- activemodel (= 3.2.11)
15
- activesupport (= 3.2.11)
10
+ actionmailer (3.2.14)
11
+ actionpack (= 3.2.14)
12
+ mail (~> 2.5.4)
13
+ actionpack (3.2.14)
14
+ activemodel (= 3.2.14)
15
+ activesupport (= 3.2.14)
16
16
  builder (~> 3.0.0)
17
17
  erubis (~> 2.7.0)
18
18
  journey (~> 1.0.4)
19
- rack (~> 1.4.0)
19
+ rack (~> 1.4.5)
20
20
  rack-cache (~> 1.2)
21
21
  rack-test (~> 0.6.1)
22
22
  sprockets (~> 2.2.1)
23
- activemodel (3.2.11)
24
- activesupport (= 3.2.11)
23
+ activemodel (3.2.14)
24
+ activesupport (= 3.2.14)
25
25
  builder (~> 3.0.0)
26
- activerecord (3.2.11)
27
- activemodel (= 3.2.11)
28
- activesupport (= 3.2.11)
26
+ activerecord (3.2.14)
27
+ activemodel (= 3.2.14)
28
+ activesupport (= 3.2.14)
29
29
  arel (~> 3.0.2)
30
30
  tzinfo (~> 0.3.29)
31
- activeresource (3.2.11)
32
- activemodel (= 3.2.11)
33
- activesupport (= 3.2.11)
34
- activesupport (3.2.11)
35
- i18n (~> 0.6)
31
+ activeresource (3.2.14)
32
+ activemodel (= 3.2.14)
33
+ activesupport (= 3.2.14)
34
+ activesupport (3.2.14)
35
+ i18n (~> 0.6, >= 0.6.4)
36
36
  multi_json (~> 1.0)
37
37
  appraisal (0.4.1)
38
38
  bundler
@@ -42,41 +42,40 @@ GEM
42
42
  diff-lcs (1.1.3)
43
43
  erubis (2.7.0)
44
44
  fastercsv (1.5.5)
45
- hike (1.2.1)
46
- i18n (0.6.1)
45
+ hike (1.2.3)
46
+ i18n (0.6.5)
47
47
  journey (1.0.4)
48
- json (1.7.6)
49
- mail (2.4.4)
50
- i18n (>= 0.4.0)
48
+ json (1.8.0)
49
+ mail (2.5.4)
51
50
  mime-types (~> 1.16)
52
51
  treetop (~> 1.4.8)
53
- mime-types (1.20.1)
54
- multi_json (1.5.0)
52
+ mime-types (1.25)
53
+ multi_json (1.7.9)
55
54
  polyglot (0.3.3)
56
- rack (1.4.4)
55
+ rack (1.4.5)
57
56
  rack-cache (1.2)
58
57
  rack (>= 0.4)
59
58
  rack-ssl (1.3.3)
60
59
  rack
61
60
  rack-test (0.6.2)
62
61
  rack (>= 1.0)
63
- rails (3.2.11)
64
- actionmailer (= 3.2.11)
65
- actionpack (= 3.2.11)
66
- activerecord (= 3.2.11)
67
- activeresource (= 3.2.11)
68
- activesupport (= 3.2.11)
62
+ rails (3.2.14)
63
+ actionmailer (= 3.2.14)
64
+ actionpack (= 3.2.14)
65
+ activerecord (= 3.2.14)
66
+ activeresource (= 3.2.14)
67
+ activesupport (= 3.2.14)
69
68
  bundler (~> 1.0)
70
- railties (= 3.2.11)
71
- railties (3.2.11)
72
- actionpack (= 3.2.11)
73
- activesupport (= 3.2.11)
69
+ railties (= 3.2.14)
70
+ railties (3.2.14)
71
+ actionpack (= 3.2.14)
72
+ activesupport (= 3.2.14)
74
73
  rack-ssl (~> 1.3.2)
75
74
  rake (>= 0.8.7)
76
75
  rdoc (~> 3.4)
77
76
  thor (>= 0.14.6, < 2.0)
78
77
  rake (0.9.6)
79
- rdoc (3.12)
78
+ rdoc (3.12.2)
80
79
  json (~> 1.4)
81
80
  rspec (2.8.0)
82
81
  rspec-core (~> 2.8.0)
@@ -100,13 +99,13 @@ GEM
100
99
  multi_json (~> 1.0)
101
100
  rack (~> 1.0)
102
101
  tilt (~> 1.1, != 1.3.0)
103
- sqlite3 (1.3.7)
104
- thor (0.17.0)
105
- tilt (1.3.3)
106
- treetop (1.4.12)
102
+ sqlite3 (1.3.8)
103
+ thor (0.18.1)
104
+ tilt (1.4.1)
105
+ treetop (1.4.15)
107
106
  polyglot
108
107
  polyglot (>= 0.3.1)
109
- tzinfo (0.3.35)
108
+ tzinfo (0.3.37)
110
109
 
111
110
  PLATFORMS
112
111
  ruby
@@ -115,7 +114,7 @@ DEPENDENCIES
115
114
  appraisal (~> 0.4.1)
116
115
  comma!
117
116
  fastercsv
118
- rails (= 3.2.11)
117
+ rails (= 3.2.14)
119
118
  rake (~> 0.9.2)
120
119
  rspec (~> 2.8.0)
121
120
  rspec-rails
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- comma (3.1.0)
4
+ comma (3.1.1)
5
5
  activesupport (>= 3.0.0)
6
6
 
7
7
  GEM
data/lib/comma.rb CHANGED
@@ -28,11 +28,13 @@ require 'active_support/lazy_load_hooks'
28
28
  ActiveSupport.on_load(:active_record) do
29
29
  require 'comma/relation' if defined?(ActiveRecord::Relation)
30
30
  end
31
+
31
32
  ActiveSupport.on_load(:mongoid) do
32
33
  require 'comma/mongoid'
33
34
  end
34
35
 
35
- require 'comma/extractors'
36
+ require 'comma/data_mapper_collection' if defined? DataMapper
37
+
36
38
  require 'comma/generator'
37
39
  require 'comma/array'
38
40
  require 'comma/object'
@@ -0,0 +1,78 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'comma/extractor'
3
+
4
+ module Comma
5
+
6
+ class DataExtractor < Extractor
7
+
8
+ class ExtractValueFromInstance
9
+ def initialize(instance)
10
+ @instance = instance
11
+ end
12
+
13
+ def extract(sym, &block)
14
+ yield_block_with_value(extract_value(sym), &block)
15
+ end
16
+
17
+ private
18
+
19
+ def yield_block_with_value(value, &block)
20
+ block ? yield(value) : value
21
+ end
22
+
23
+ def extract_value(method)
24
+ extraction_object.send(method)
25
+ end
26
+
27
+ def extraction_object
28
+ @instance
29
+ end
30
+ end
31
+
32
+ class ExtractValueFromAssociationOfInstance < ExtractValueFromInstance
33
+ def initialize(instance, association_name)
34
+ super(instance)
35
+ @association_name = association_name
36
+ end
37
+
38
+ private
39
+
40
+ def extraction_object
41
+ @instance.send(@association_name) || null_association
42
+ end
43
+
44
+ def null_association
45
+ @null_association ||= Class.new(Class.const_defined?(:BasicObject) ? ::BasicObject : ::Object) do
46
+ def method_missing(symbol, *args, &block)
47
+ nil
48
+ end
49
+ end.new
50
+ end
51
+ end
52
+
53
+ def method_missing(sym, *args, &block)
54
+ if args.blank?
55
+ @results << ExtractValueFromInstance.new(@instance).extract(sym, &block)
56
+ end
57
+
58
+ args.each do |arg|
59
+ case arg
60
+ when Hash
61
+ arg.each do |k, v|
62
+ @results << ExtractValueFromAssociationOfInstance.new(@instance, sym).extract(k, &block)
63
+ end
64
+ when Symbol
65
+ @results << ExtractValueFromAssociationOfInstance.new(@instance, sym).extract(arg, &block)
66
+ when String
67
+ @results << ExtractValueFromInstance.new(@instance).extract(sym, &block)
68
+ else
69
+ raise "Unknown data symbol #{arg.inspect}"
70
+ end
71
+ end
72
+ end
73
+
74
+ def __static_column__(header = nil, &block)
75
+ @results << (block ? yield(@instance) : nil)
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,7 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class DataMapper::Collection
4
+ def to_comma(style = :default)
5
+ Comma::Generator.new(self, style).run(:each)
6
+ end
7
+ end
@@ -0,0 +1,36 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module Comma
4
+
5
+ class Extractor
6
+
7
+ def initialize(instance, style, formats)
8
+ @instance = instance
9
+ @style = style
10
+ @formats = formats
11
+ @results = []
12
+ end
13
+
14
+ def results
15
+ instance_eval &@formats[@style]
16
+ @results.map { |r| convert_to_data_value(r) }
17
+ end
18
+
19
+ def id(*args, &block)
20
+ method_missing(:id, *args, &block)
21
+ end
22
+
23
+ def __use__(style)
24
+ # TODO: prevent infinite recursion
25
+ instance_eval(&@formats[style])
26
+ end
27
+
28
+ private
29
+
30
+ def convert_to_data_value(result)
31
+ result.nil? ? result : result.to_s
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,48 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'comma/extractor'
3
+ require 'active_support/core_ext/class/attribute'
4
+ require 'active_support/core_ext/date_time/conversions'
5
+ require 'active_support/core_ext/object/blank'
6
+ require 'active_support/core_ext/string/inflections'
7
+
8
+ module Comma
9
+ class HeaderExtractor < Extractor
10
+
11
+ class_attribute :value_humanizer
12
+
13
+ DEFAULT_VALUE_HUMANIZER = lambda do |value, model_class|
14
+ value.is_a?(String) ? value : value.to_s.humanize
15
+ end
16
+ self.value_humanizer = DEFAULT_VALUE_HUMANIZER
17
+
18
+ def method_missing(sym, *args, &block)
19
+ model_class = @instance.class
20
+ @results << self.value_humanizer.call(sym, model_class) if args.blank?
21
+ args.each do |arg|
22
+ case arg
23
+ when Hash
24
+ arg.each do |k, v|
25
+ @results << self.value_humanizer.call(v, get_association_class(model_class, sym))
26
+ end
27
+ when Symbol
28
+ @results << self.value_humanizer.call(arg, get_association_class(model_class, sym))
29
+ when String
30
+ @results << self.value_humanizer.call(arg, model_class)
31
+ else
32
+ raise "Unknown header symbol #{arg.inspect}"
33
+ end
34
+ end
35
+ end
36
+
37
+ def __static_column__(header = '', &block)
38
+ @results << header
39
+ end
40
+
41
+ private
42
+
43
+ def get_association_class(model_class, association)
44
+ model_class.respond_to?(:reflect_on_association) ?
45
+ model_class.reflect_on_association(association).klass : nil
46
+ end
47
+ end
48
+ end
data/lib/comma/object.rb CHANGED
@@ -1,3 +1,7 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'comma/data_extractor'
3
+ require 'comma/header_extractor'
4
+
1
5
  class Object
2
6
  class_attribute :comma_formats
3
7
 
data/lib/comma/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Comma
2
- VERSION = "3.1.1"
2
+ VERSION = "3.2.0"
3
3
  end
@@ -1,4 +1,5 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
2
3
 
3
4
  # comma do
4
5
  # name 'Title'
@@ -7,65 +8,6 @@ require File.dirname(__FILE__) + '/../spec_helper'
7
8
  # isbn :number_10 => 'ISBN-10', :number_13 => 'ISBN-13'
8
9
  # end
9
10
 
10
- describe Comma::HeaderExtractor do
11
-
12
- before do
13
- @isbn = Isbn.new('123123123', '321321321')
14
- @book = Book.new('Smalltalk-80', 'Language and Implementation', @isbn)
15
-
16
- @headers = @book.to_comma_headers
17
- end
18
-
19
- describe 'when no parameters are provided' do
20
-
21
- it 'should use the method name as the header name, humanized' do
22
- @headers.should include('Description')
23
- end
24
- end
25
-
26
- describe 'when given a string description as a parameter' do
27
-
28
- it 'should use the string value, unmodified' do
29
- @headers.should include('Title')
30
- end
31
- end
32
-
33
- describe 'when an hash is passed as a parameter' do
34
-
35
- describe 'with a string value' do
36
-
37
- it 'should use the string value, unmodified' do
38
- @headers.should include('ISBN-10')
39
- end
40
- end
41
-
42
- describe 'with a non-string value' do
43
-
44
- it 'should use the non string value converted to a string, humanized' do
45
- @headers.should include('Issuer')
46
- end
47
- end
48
-
49
- end
50
-
51
- end
52
-
53
- describe Comma::HeaderExtractor, 'with static column method' do
54
- before do
55
- @headers = Class.new(Struct.new(:id, :name)) do
56
- comma do
57
- __static_column__
58
- __static_column__ 'STATIC'
59
- __static_column__ 'STATIC' do '' end
60
- end
61
- end.new(1, 'John Doe').to_comma_headers
62
- end
63
-
64
- it 'should extract headers' do
65
- @headers.should eq(['', 'STATIC', 'STATIC'])
66
- end
67
- end
68
-
69
11
  describe Comma::DataExtractor do
70
12
 
71
13
  before do