document_file 0.0.2 → 0.0.3

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.
@@ -1,4 +1,5 @@
1
1
  require 'yaml'
2
+ require 'active_support/inflector'
2
3
 
3
4
  module DocumentFile
4
5
  class Base
@@ -59,44 +60,75 @@ module DocumentFile
59
60
  end
60
61
 
61
62
  def define_dynamic_methods
62
- @data.each do |method_name, value|
63
- value = "'#{value}'" if value.is_a? String
64
- instance_eval "def #{method_name}; #{value}; end"
63
+ @data.each do |attribute_name, value|
64
+ instance_variable_set("@#{attribute_name}", value)
65
+ self.class.instance_eval "attr_reader :#{attribute_name}"
65
66
 
66
67
  if value.is_a? Array
67
- by_attribute_method = <<-eos
68
- def self.by_#{method_name}
69
- documents = self.all
70
- #{method_name} = {}
71
- documents.each do |document|
72
- document.#{method_name}.each do |single_item|
73
- if #{method_name}.has_key? single_item
74
- #{method_name}[single_item] << document
75
- else
76
- #{method_name}[single_item] = [document]
77
- end
78
- end
79
- end
80
- #{method_name}
81
- end
82
- eos
83
- self.class.send(:module_eval, by_attribute_method)
68
+ define_by_attribute_finder(attribute_name)
69
+ define_find_all_by_attribute_finder(attribute_name)
84
70
  end
85
71
 
86
- define_attribute_finder(method_name)
72
+ define_attribute_finder(attribute_name)
87
73
  end
88
74
  @@dynamic_methods_defined = true
89
75
  end
90
76
 
91
- def define_attribute_finder(method_name)
77
+ # Defines an attribute finder, e.g.
78
+ # MyDocument.find_by_title('some_title') => some_document
79
+ def define_attribute_finder(attribute_name)
92
80
  find_by_attribute_method = <<-eos
93
- def self.find_by_#{method_name}(attribute)
94
- all.detect {|document| document.#{method_name} == attribute}
81
+ def self.find_by_#{attribute_name}(attribute)
82
+ all.detect do |document|
83
+ if document.respond_to?('#{attribute_name}')
84
+ document.#{attribute_name} == attribute
85
+ else
86
+ false
87
+ end
88
+ end
95
89
  end
96
90
  eos
97
91
  self.class.send(:module_eval, find_by_attribute_method)
98
92
  end
99
93
 
94
+ # Defines a by attribute finder for Array attributes, e.g.
95
+ # MyDocument.by_tags
96
+ # => {
97
+ # "tag_1" => [document_1, document_3],
98
+ # "tag_2" => [document_2]
99
+ # }
100
+ def define_by_attribute_finder(array_attribute)
101
+ by_attribute_method = <<-eos
102
+ def self.by_#{array_attribute}
103
+ documents = self.all
104
+ #{array_attribute}_items = {}
105
+ documents.each do |document|
106
+ document.#{array_attribute}.each do |single_item|
107
+ if #{array_attribute}_items.has_key? single_item
108
+ #{array_attribute}_items[single_item] << document
109
+ else
110
+ #{array_attribute}_items[single_item] = [document]
111
+ end
112
+ end if document.#{array_attribute}
113
+ end
114
+ #{array_attribute}_items
115
+ end
116
+ eos
117
+ self.class.send(:module_eval, by_attribute_method)
118
+ end
119
+
120
+ # Finds documents by a specific Array attribute value , e.g.
121
+ # MyDocument.find_all_by_tag('my_tag') => [document_1, document_2, ...]
122
+ def define_find_all_by_attribute_finder(array_attribute)
123
+ singular_array_attribute = ActiveSupport::Inflector.singularize array_attribute
124
+ find_all_by_attribute_method = <<-eos
125
+ def self.find_all_by_#{singular_array_attribute}(singular_array_attribute)
126
+ self.by_#{array_attribute}[singular_array_attribute]
127
+ end
128
+ eos
129
+ self.class.send(:module_eval, find_all_by_attribute_method)
130
+ end
131
+
100
132
  def self.method_missing(method_name, *args)
101
133
  self.all unless @@documents
102
134
  respond_to?(method_name) ? self.send(method_name, *args) : super
@@ -1,3 +1,3 @@
1
1
  module DocumentFile
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -56,7 +56,7 @@ describe MyDocument do
56
56
  end
57
57
  end
58
58
 
59
- describe 'when listing document_files by an array attribute' do
59
+ describe 'when listing document_files by an Array attribute' do
60
60
  it 'should return a Hash' do
61
61
  assert_equal Hash, MyDocument.by_tags.class
62
62
  end
@@ -70,6 +70,29 @@ describe MyDocument do
70
70
  assert_equal Set.new([1, 2]), document_files['tag'].map(&:id).to_set
71
71
  assert_equal Set.new([2]), document_files['tug'].map(&:id).to_set
72
72
  end
73
+
74
+ it 'should not be confused by attributes that only some documents have' do
75
+ document_files_by_authors = MyDocument.by_authors
76
+ assert_equal 1, document_files_by_authors['Frank'].first.id
77
+
78
+ document_files_by_friends = MyDocument.by_friends
79
+ assert_equal 2, document_files_by_friends['Anton'].first.id
80
+ end
81
+ end
82
+
83
+ describe 'when finding document_files by an Array attribute value' do
84
+ it 'should return an Array' do
85
+ assert_equal Array, MyDocument.find_all_by_tag('tag').class
86
+ end
87
+
88
+ it 'should containt documents' do
89
+ assert_equal MyDocument, MyDocument.find_all_by_tag('tag').first.class
90
+ end
91
+
92
+ it 'should return the right documents' do
93
+ assert_equal [1, 2], MyDocument.find_all_by_tag('tag').map(&:id)
94
+ assert_equal [2], MyDocument.find_all_by_tag('tug').map(&:id)
95
+ end
73
96
  end
74
97
 
75
98
  describe 'when finding a document_file' do
@@ -84,6 +107,11 @@ describe MyDocument do
84
107
  document_file = MyDocument.find_by_file_name file_name
85
108
  assert_equal document_file.file_name, file_name
86
109
  end
110
+
111
+ it 'should not be confused by attributes that only some dcuments have' do
112
+ document_file = MyDocument.find_by_special_attribute 'Yes!'
113
+ assert_equal 'Yes!', document_file.special_attribute
114
+ end
87
115
  end
88
116
 
89
117
  describe 'when getting the file name or file path' do
@@ -3,6 +3,7 @@ id: 1
3
3
  title: The shizzle!
4
4
  tags: [tag]
5
5
  number_of_foos: 42
6
+ authors: [Frank, Bertha]
6
7
  ---
7
8
 
8
9
  I like the flowers.
@@ -2,6 +2,8 @@
2
2
  id: 2
3
3
  title: The big pink Oink!
4
4
  tags: [tag, tug]
5
+ special_attribute: Yes!
6
+ friends: [Anton, Paul]
5
7
  ---
6
8
 
7
9
  I'm on a horse!
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Ralph von der Heyden
@@ -14,10 +14,24 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-08-19 00:00:00 +02:00
17
+ date: 2010-08-23 00:00:00 +02:00
18
18
  default_executable:
19
- dependencies: []
20
-
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: activesupport
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 3
30
+ - 0
31
+ - 0
32
+ version: 3.0.0
33
+ type: :runtime
34
+ version_requirements: *id001
21
35
  description: " Makes your plain text files accessible in Ruby. Supports YAML front matter.\n"
22
36
  email: ralph@rvdh.de
23
37
  executables: []