document_file 0.0.6 → 0.0.7

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.
@@ -40,12 +40,14 @@ h2. Available functionality
40
40
 
41
41
  h3. Dynamic finders
42
42
 
43
- <pre><code>doc = MyDocument.find_by_title("Ruby is great") # => returns the document
44
- doc = MyDocument.find_by_number_of_foos(42) # => returns the document
45
- doc = MyDocument.find_by_file_name("2010-09-13-ruby-stuff") # => returns the document
46
-
47
- docs = MyDocument.find_all_by_status("published") # => [doc_1, doc_2, ...]
48
- docs = MyDocument.find_all_by_tag("programming") # => [doc_1, doc_2, ...]
43
+ <pre><code>doc = MyDocument.find_by_title("Ruby is great") # => returns the document
44
+ doc = MyDocument.find_by_number_of_foos(42) # => returns the document
45
+ doc = MyDocument.find_by_file_name("2010-09-13-ruby-stuff") # => returns the document
46
+
47
+ docs = MyDocument.find_all_by_status("published") # => [doc_1, doc_2, ...]
48
+ docs = MyDocument.find_all_by_tag("programming") # => [doc_1, doc_2, ...]
49
+ docs = MyDocument.find_all_by_tag("programming", :offset => 1) # => [doc_2, ...]
50
+ docs = MyDocument.find_all_by_tag("programming", :limit => 2) # => [doc_1, doc_2]
49
51
  </code></pre>
50
52
 
51
53
 
@@ -60,9 +62,13 @@ h3. Listing documents by the date attribute
60
62
 
61
63
  Document file tries to parse the filename of your documents to create a date attribute. In order to use the automatic parsing, the filenames have to start with a date string, e.g. @2010-09-13-ruby-stuff.textile@. If you don't want to set the date in the filename, you can still do it in the YAML front matter with e.g. @date: 2010-09-10@.
62
64
 
63
- <pre><code>docs = MyDocument.find_all_by_date(2010) # => returns all documents from 2010
64
- docs = MyDocument.find_all_by_date(2010, 9) # => returns all documents from Sep., 2010
65
- docs = MyDocument.find_all_by_date(2010, 9, 13) # => returns all documents from Sep. 13th, 2010
65
+ <pre><code>docs = MyDocument.find_all_by_date(2010) # => returns all documents from 2010
66
+ docs = MyDocument.find_all_by_date(2010, 9) # => returns all documents from Sep., 2010
67
+ docs = MyDocument.find_all_by_date(2010, 9, 13) # => returns all documents from Sep. 13th, 2010
68
+ docs = MyDocument.find_all_by_date('*', 9, 13) # => returns all documents from any Sep. 13th
69
+ docs = MyDocument.find_all_by_date(2010, '*', 13) # => returns all documents from any 13th of 2010
70
+ docs = MyDocument.find_all_by_date('*', '*', 13) # => returns all documents from any 13th
71
+ docs = MyDocument.find_all_by_date('*', 9) # => returns all documents from any Sep.
66
72
  </code></pre>
67
73
 
68
74
  h3. Chaining
@@ -2,6 +2,12 @@ require 'active_support/inflector'
2
2
 
3
3
  module DocumentFile
4
4
  class Collection < Array
5
+ attr_writer :total
6
+
7
+ def total
8
+ @total || length
9
+ end
10
+
5
11
  def <<(document)
6
12
  self.class.ensure_document(document)
7
13
  define_dynamic_finders document.data
@@ -34,6 +40,7 @@ module DocumentFile
34
40
  date_parts = %w(year month day)
35
41
  docs = self
36
42
  args.size.times do |i|
43
+ next if args[i] == '*'
37
44
  docs = docs.select { |doc| doc.date.send(date_parts[i]) == args[i] }
38
45
  end
39
46
  self.class.new docs
@@ -86,19 +93,20 @@ module DocumentFile
86
93
  singular_attribute = attribute
87
94
  end
88
95
  find_all_by_attribute = <<-eos
89
- def find_all_by_#{singular_attribute}(attribute)
90
- if respond_to? :by_#{attribute}
96
+ def find_all_by_#{singular_attribute}(attribute, options = {})
97
+ documents = if respond_to?(:by_#{attribute})
91
98
  by_#{attribute}[attribute]
92
99
  else
93
- documents = select do |document|
100
+ select do |document|
94
101
  if document.respond_to? :#{attribute}
95
102
  document.#{attribute} == attribute
96
103
  else
97
104
  false
98
105
  end
99
106
  end
100
- Collection.new documents
101
107
  end
108
+
109
+ self.class.new(documents).offset_and_limitize(options[:offset], options[:limit])
102
110
  end
103
111
  eos
104
112
  instance_eval find_all_by_attribute
@@ -115,5 +123,19 @@ module DocumentFile
115
123
  eos
116
124
  instance_eval find_by_attribute
117
125
  end
126
+
127
+ def offset_and_limitize(offset, limit)
128
+ documents = self
129
+ total_size = documents.length
130
+ if offset
131
+ documents = documents.last(length - offset)
132
+ end
133
+ if limit
134
+ documents = documents.first(limit)
135
+ end
136
+ self.class.new(documents).tap do |col|
137
+ col.total = total_size
138
+ end
139
+ end
118
140
  end
119
141
  end
@@ -1,3 +1,3 @@
1
1
  module DocumentFile
2
- VERSION = '0.0.6'
2
+ VERSION = '0.0.7'
3
3
  end
@@ -87,9 +87,131 @@ describe DocumentFile::Collection do
87
87
  assert_equal 1, documents.size
88
88
  end
89
89
 
90
+ it 'should return all documents with the year and day specified' do
91
+ documents = MyDocument.find_all_by_date 2010, '*', 8
92
+ assert_equal 1, documents.size
93
+ end
94
+
95
+ it 'should return all documents with the month and day specified' do
96
+ documents = MyDocument.find_all_by_date '*', 8, 8
97
+ assert_equal 1, documents.size
98
+ end
99
+
100
+ it 'should return all documents with the day specified' do
101
+ documents = MyDocument.find_all_by_date '*', '*', 8
102
+ assert_equal 1, documents.size
103
+ end
104
+
105
+ it 'should return all documents with the month specified' do
106
+ documents = MyDocument.find_all_by_date '*', 8, '*'
107
+ assert_equal 2, documents.size
108
+ end
109
+
90
110
  it 'should return the first match' do
91
111
  document = MyDocument.find_by_date 2010, 8
92
112
  assert_equal 1, document.id
93
113
  end
94
114
  end
115
+
116
+ describe 'when listing document_files by an Array attribute' do
117
+ it 'should return a Hash' do
118
+ assert_equal Hash, MyDocument.by_tags.class
119
+ end
120
+
121
+ it 'should use the tags as Hash keys' do
122
+ assert_equal Set.new(['tag', 'tug']), MyDocument.by_tags.keys.to_set
123
+ end
124
+
125
+ it 'should use the document_files as Hash values' do
126
+ document_files = MyDocument.by_tags
127
+ assert_equal Set.new([1, 2]), document_files['tag'].map(&:id).to_set
128
+ assert_equal Set.new([2]), document_files['tug'].map(&:id).to_set
129
+ end
130
+
131
+ it 'should not be confused by attributes that only some documents have' do
132
+ document_files_by_authors = MyDocument.by_authors
133
+ assert_equal 1, document_files_by_authors['Frank'].first.id
134
+
135
+ document_files_by_friends = MyDocument.by_friends
136
+ assert_equal 2, document_files_by_friends['Anton'].first.id
137
+ end
138
+ end
139
+
140
+ describe 'when finding all document_files by an Array attribute value' do
141
+ it 'should return a DocumentFile::Collection' do
142
+ klass = MyDocument.find_all_by_tag('tag').class
143
+ assert_equal DocumentFile::Collection, klass
144
+ end
145
+
146
+ it 'should containt documents' do
147
+ assert_equal MyDocument, MyDocument.find_all_by_tag('tag').first.class
148
+ end
149
+
150
+ it 'should return the right documents' do
151
+ assert_equal [1, 2], MyDocument.find_all_by_tag('tag').map(&:id)
152
+ assert_equal [2], MyDocument.find_all_by_tag('tug').map(&:id)
153
+ end
154
+ end
155
+
156
+ describe 'when finding all document_files by an attribute value' do
157
+ before do
158
+ @collection = MyDocument.find_all_by_status(:published)
159
+ end
160
+
161
+ it 'should return a DocumentFile::Collection' do
162
+ assert_equal DocumentFile::Collection, @collection.class
163
+ end
164
+
165
+ it 'should containt documents' do
166
+ assert_equal MyDocument, @collection.first.class
167
+ end
168
+
169
+ it 'should return the right documents' do
170
+ assert_equal [1, 2], @collection.map(&:id)
171
+ end
172
+
173
+ it 'should return an empty collection if the document was not found' do
174
+ empty_collection = MyDocument.find_all_by_status(:draft)
175
+ assert_equal [], empty_collection.map(&:id)
176
+ end
177
+ end
178
+
179
+ describe 'when finding a document_file' do
180
+ it 'should find the right document_file by an attribute' do
181
+ title = 'The shizzle!'
182
+ document_file = MyDocument.find_by_title(title)
183
+ assert_equal title, document_file.title
184
+ end
185
+
186
+ it 'should find the right document_file by file_name' do
187
+ file_name = '2010-08-08-test-document-file'
188
+ document_file = MyDocument.find_by_file_name file_name
189
+ assert_equal document_file.file_name, file_name
190
+ end
191
+
192
+ it 'should not be confused by attributes that only some dcuments have' do
193
+ document_file = MyDocument.find_by_special_attribute 'Yes!'
194
+ assert_equal 'Yes!', document_file.special_attribute
195
+ end
196
+ end
197
+
198
+ describe 'when using a finder with offset or limit' do
199
+ it 'should respect the offset' do
200
+ document_files = MyDocument.find_all_by_tag 'tag', :offset => 1
201
+ assert_equal 1, document_files.size
202
+ assert_equal 2, document_files.first.id
203
+ end
204
+
205
+ it 'should respect the limit' do
206
+ document_files = MyDocument.find_all_by_tag 'tag', :limit => 1
207
+ assert_equal 1, document_files.size
208
+ assert_equal 1, document_files.first.id
209
+ end
210
+
211
+ it 'should still deliver the total number of documents' do
212
+ document_files = MyDocument.find_all_by_tag 'tag', :offset => 1
213
+ assert_equal 1, document_files.size
214
+ assert_equal 2, document_files.total
215
+ end
216
+ end
95
217
  end
@@ -106,88 +106,6 @@ eos
106
106
  end
107
107
  end
108
108
 
109
- describe 'when listing document_files by an Array attribute' do
110
- it 'should return a Hash' do
111
- assert_equal Hash, MyDocument.by_tags.class
112
- end
113
-
114
- it 'should use the tags as Hash keys' do
115
- assert_equal Set.new(['tag', 'tug']), MyDocument.by_tags.keys.to_set
116
- end
117
-
118
- it 'should use the document_files as Hash values' do
119
- document_files = MyDocument.by_tags
120
- assert_equal Set.new([1, 2]), document_files['tag'].map(&:id).to_set
121
- assert_equal Set.new([2]), document_files['tug'].map(&:id).to_set
122
- end
123
-
124
- it 'should not be confused by attributes that only some documents have' do
125
- document_files_by_authors = MyDocument.by_authors
126
- assert_equal 1, document_files_by_authors['Frank'].first.id
127
-
128
- document_files_by_friends = MyDocument.by_friends
129
- assert_equal 2, document_files_by_friends['Anton'].first.id
130
- end
131
- end
132
-
133
- describe 'when finding all document_files by an Array attribute value' do
134
- it 'should return a DocumentFile::Collection' do
135
- klass = MyDocument.find_all_by_tag('tag').class
136
- assert_equal DocumentFile::Collection, klass
137
- end
138
-
139
- it 'should containt documents' do
140
- assert_equal MyDocument, MyDocument.find_all_by_tag('tag').first.class
141
- end
142
-
143
- it 'should return the right documents' do
144
- assert_equal [1, 2], MyDocument.find_all_by_tag('tag').map(&:id)
145
- assert_equal [2], MyDocument.find_all_by_tag('tug').map(&:id)
146
- end
147
- end
148
-
149
- describe 'when finding all document_files by an attribute value' do
150
- before do
151
- @collection = MyDocument.find_all_by_status(:published)
152
- end
153
-
154
- it 'should return a DocumentFile::Collection' do
155
- assert_equal DocumentFile::Collection, @collection.class
156
- end
157
-
158
- it 'should containt documents' do
159
- assert_equal MyDocument, @collection.first.class
160
- end
161
-
162
- it 'should return the right documents' do
163
- assert_equal [1, 2], @collection.map(&:id)
164
- end
165
-
166
- it 'should return an empty collection if the document was not found' do
167
- empty_collection = MyDocument.find_all_by_status(:draft)
168
- assert_equal [], empty_collection.map(&:id)
169
- end
170
- end
171
-
172
- describe 'when finding a document_file' do
173
- it 'should find the right document_file by an attribute' do
174
- title = 'The shizzle!'
175
- document_file = MyDocument.find_by_title(title)
176
- assert_equal title, document_file.title
177
- end
178
-
179
- it 'should find the right document_file by file_name' do
180
- file_name = '2010-08-08-test-document-file'
181
- document_file = MyDocument.find_by_file_name file_name
182
- assert_equal document_file.file_name, file_name
183
- end
184
-
185
- it 'should not be confused by attributes that only some dcuments have' do
186
- document_file = MyDocument.find_by_special_attribute 'Yes!'
187
- assert_equal 'Yes!', document_file.special_attribute
188
- end
189
- end
190
-
191
109
  describe 'when getting the file name or file path' do
192
110
  before do
193
111
  @file_name = '2010-08-08-test-document-file.textile'
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 6
9
- version: 0.0.6
8
+ - 7
9
+ version: 0.0.7
10
10
  platform: ruby
11
11
  authors:
12
12
  - Ralph von der Heyden
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-09-08 00:00:00 +02:00
17
+ date: 2010-09-20 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency