wayne-friendly 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. data/.document +2 -0
  2. data/.gitignore +26 -0
  3. data/APACHE-LICENSE +202 -0
  4. data/CHANGELOG.md +28 -0
  5. data/CONTRIBUTORS.md +7 -0
  6. data/LICENSE +20 -0
  7. data/README.md +288 -0
  8. data/Rakefile +68 -0
  9. data/TODO.md +5 -0
  10. data/VERSION +1 -0
  11. data/examples/friendly.yml +7 -0
  12. data/friendly.gemspec +240 -0
  13. data/lib/friendly.rb +58 -0
  14. data/lib/friendly/associations.rb +7 -0
  15. data/lib/friendly/associations/association.rb +34 -0
  16. data/lib/friendly/associations/set.rb +37 -0
  17. data/lib/friendly/attribute.rb +98 -0
  18. data/lib/friendly/boolean.rb +10 -0
  19. data/lib/friendly/cache.rb +24 -0
  20. data/lib/friendly/cache/by_id.rb +33 -0
  21. data/lib/friendly/data_store.rb +73 -0
  22. data/lib/friendly/document.rb +70 -0
  23. data/lib/friendly/document/associations.rb +50 -0
  24. data/lib/friendly/document/attributes.rb +114 -0
  25. data/lib/friendly/document/convenience.rb +41 -0
  26. data/lib/friendly/document/mixin.rb +15 -0
  27. data/lib/friendly/document/scoping.rb +66 -0
  28. data/lib/friendly/document/storage.rb +63 -0
  29. data/lib/friendly/document_table.rb +56 -0
  30. data/lib/friendly/index.rb +73 -0
  31. data/lib/friendly/indexer.rb +50 -0
  32. data/lib/friendly/memcached.rb +48 -0
  33. data/lib/friendly/newrelic.rb +6 -0
  34. data/lib/friendly/query.rb +42 -0
  35. data/lib/friendly/scope.rb +100 -0
  36. data/lib/friendly/scope_proxy.rb +43 -0
  37. data/lib/friendly/sequel_monkey_patches.rb +34 -0
  38. data/lib/friendly/storage.rb +31 -0
  39. data/lib/friendly/storage_factory.rb +24 -0
  40. data/lib/friendly/storage_proxy.rb +111 -0
  41. data/lib/friendly/table.rb +15 -0
  42. data/lib/friendly/table_creator.rb +50 -0
  43. data/lib/friendly/time.rb +14 -0
  44. data/lib/friendly/translator.rb +33 -0
  45. data/lib/friendly/uuid.rb +148 -0
  46. data/lib/tasks/friendly.rake +7 -0
  47. data/rails/init.rb +3 -0
  48. data/spec/config.yml.example +7 -0
  49. data/spec/fakes/data_store_fake.rb +29 -0
  50. data/spec/fakes/database_fake.rb +12 -0
  51. data/spec/fakes/dataset_fake.rb +28 -0
  52. data/spec/fakes/document.rb +18 -0
  53. data/spec/fakes/serializer_fake.rb +12 -0
  54. data/spec/fakes/time_fake.rb +12 -0
  55. data/spec/integration/ad_hoc_scopes_spec.rb +42 -0
  56. data/spec/integration/basic_object_lifecycle_spec.rb +114 -0
  57. data/spec/integration/batch_insertion_spec.rb +29 -0
  58. data/spec/integration/convenience_api_spec.rb +25 -0
  59. data/spec/integration/count_spec.rb +12 -0
  60. data/spec/integration/default_value_spec.rb +30 -0
  61. data/spec/integration/dirty_tracking_spec.rb +43 -0
  62. data/spec/integration/find_via_cache_spec.rb +101 -0
  63. data/spec/integration/finder_spec.rb +71 -0
  64. data/spec/integration/has_many_spec.rb +18 -0
  65. data/spec/integration/index_spec.rb +57 -0
  66. data/spec/integration/named_scope_spec.rb +34 -0
  67. data/spec/integration/offline_indexing_spec.rb +53 -0
  68. data/spec/integration/pagination_spec.rb +63 -0
  69. data/spec/integration/scope_chaining_spec.rb +22 -0
  70. data/spec/integration/table_creator_spec.rb +69 -0
  71. data/spec/integration/write_through_cache_spec.rb +53 -0
  72. data/spec/spec.opts +1 -0
  73. data/spec/spec_helper.rb +105 -0
  74. data/spec/unit/associations/association_spec.rb +57 -0
  75. data/spec/unit/associations/set_spec.rb +43 -0
  76. data/spec/unit/attribute_spec.rb +125 -0
  77. data/spec/unit/cache_by_id_spec.rb +102 -0
  78. data/spec/unit/cache_spec.rb +21 -0
  79. data/spec/unit/data_store_spec.rb +201 -0
  80. data/spec/unit/document/attributes_spec.rb +130 -0
  81. data/spec/unit/document_spec.rb +318 -0
  82. data/spec/unit/document_table_spec.rb +126 -0
  83. data/spec/unit/friendly_spec.rb +25 -0
  84. data/spec/unit/index_spec.rb +196 -0
  85. data/spec/unit/memcached_spec.rb +114 -0
  86. data/spec/unit/query_spec.rb +104 -0
  87. data/spec/unit/scope_proxy_spec.rb +44 -0
  88. data/spec/unit/scope_spec.rb +113 -0
  89. data/spec/unit/storage_factory_spec.rb +59 -0
  90. data/spec/unit/storage_proxy_spec.rb +244 -0
  91. data/spec/unit/translator_spec.rb +91 -0
  92. data/website/index.html +210 -0
  93. data/website/scripts/clipboard.swf +0 -0
  94. data/website/scripts/shBrushAS3.js +61 -0
  95. data/website/scripts/shBrushBash.js +66 -0
  96. data/website/scripts/shBrushCSharp.js +67 -0
  97. data/website/scripts/shBrushColdFusion.js +102 -0
  98. data/website/scripts/shBrushCpp.js +99 -0
  99. data/website/scripts/shBrushCss.js +93 -0
  100. data/website/scripts/shBrushDelphi.js +57 -0
  101. data/website/scripts/shBrushDiff.js +43 -0
  102. data/website/scripts/shBrushErlang.js +54 -0
  103. data/website/scripts/shBrushGroovy.js +69 -0
  104. data/website/scripts/shBrushJScript.js +52 -0
  105. data/website/scripts/shBrushJava.js +59 -0
  106. data/website/scripts/shBrushJavaFX.js +60 -0
  107. data/website/scripts/shBrushPerl.js +74 -0
  108. data/website/scripts/shBrushPhp.js +91 -0
  109. data/website/scripts/shBrushPlain.js +35 -0
  110. data/website/scripts/shBrushPowerShell.js +76 -0
  111. data/website/scripts/shBrushPython.js +66 -0
  112. data/website/scripts/shBrushRuby.js +57 -0
  113. data/website/scripts/shBrushScala.js +53 -0
  114. data/website/scripts/shBrushSql.js +68 -0
  115. data/website/scripts/shBrushVb.js +58 -0
  116. data/website/scripts/shBrushXml.js +71 -0
  117. data/website/scripts/shCore.js +30 -0
  118. data/website/scripts/shLegacy.js +30 -0
  119. data/website/styles/friendly.css +103 -0
  120. data/website/styles/help.png +0 -0
  121. data/website/styles/ie.css +35 -0
  122. data/website/styles/magnifier.png +0 -0
  123. data/website/styles/page_white_code.png +0 -0
  124. data/website/styles/page_white_copy.png +0 -0
  125. data/website/styles/print.css +29 -0
  126. data/website/styles/printer.png +0 -0
  127. data/website/styles/screen.css +257 -0
  128. data/website/styles/shCore.css +330 -0
  129. data/website/styles/shThemeDefault.css +173 -0
  130. data/website/styles/shThemeDjango.css +176 -0
  131. data/website/styles/shThemeEclipse.css +190 -0
  132. data/website/styles/shThemeEmacs.css +175 -0
  133. data/website/styles/shThemeFadeToGrey.css +177 -0
  134. data/website/styles/shThemeMidnight.css +175 -0
  135. data/website/styles/shThemeRDark.css +175 -0
  136. metadata +337 -0
data/Rakefile ADDED
@@ -0,0 +1,68 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "wayne-friendly"
8
+ gem.summary = %Q{NoSQL with MySQL in Ruby}
9
+ gem.description = %Q{Fork of Friendly. Uses the C extension variant of the JSON gem instead of the pure ruby one.}
10
+ gem.email = "github@wego.com"
11
+ gem.homepage = "http://friendlyorm.com"
12
+ gem.authors = ["James Golick"]
13
+ gem.add_development_dependency "rspec", ">= 1.2.9"
14
+ gem.add_development_dependency "cucumber", ">= 0"
15
+ gem.add_development_dependency "jferris-mocha"
16
+ gem.add_development_dependency "memcached"
17
+ gem.add_dependency "sequel", ">= 3.7.0"
18
+ gem.add_dependency "json"
19
+ gem.add_dependency "activesupport"
20
+ gem.add_dependency "will_paginate"
21
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
22
+ end
23
+ rescue LoadError
24
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
25
+ end
26
+
27
+ require 'spec/rake/spectask'
28
+ Spec::Rake::SpecTask.new(:spec) do |spec|
29
+ spec.libs << 'lib' << 'spec'
30
+ spec.spec_files = FileList['spec/**/*_spec.rb']
31
+ end
32
+
33
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
34
+ spec.libs << 'lib' << 'spec'
35
+ spec.pattern = 'spec/**/*_spec.rb'
36
+ spec.rcov = true
37
+ end
38
+
39
+ task :spec => :check_dependencies
40
+
41
+ begin
42
+ require 'cucumber/rake/task'
43
+ Cucumber::Rake::Task.new(:features)
44
+
45
+ task :features => :check_dependencies
46
+ rescue LoadError
47
+ task :features do
48
+ abort "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
49
+ end
50
+ end
51
+
52
+ task :default => :spec
53
+
54
+ require 'rake/rdoctask'
55
+ Rake::RDocTask.new do |rdoc|
56
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
57
+
58
+ rdoc.rdoc_dir = 'rdoc'
59
+ rdoc.title = "friendly #{version}"
60
+ rdoc.rdoc_files.include('README*')
61
+ rdoc.rdoc_files.include('lib/**/*.rb')
62
+ end
63
+
64
+ desc "Sync website."
65
+ task :website do
66
+ `rsync -avz website/* friendlyorm.com:/var/www/friendlyorm.com`
67
+ end
68
+
data/TODO.md ADDED
@@ -0,0 +1,5 @@
1
+ Ideas
2
+ =====
3
+
4
+ * Setup observers
5
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.5.1
@@ -0,0 +1,7 @@
1
+ development:
2
+ :adapter: "mysql"
3
+ :host: "localhost"
4
+ :user: "root"
5
+ :password: "swordfish"
6
+ :database: "friendly_development"
7
+
data/friendly.gemspec ADDED
@@ -0,0 +1,240 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{friendly}
8
+ s.version = "0.5.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["James Golick"]
12
+ s.date = %q{2010-02-05}
13
+ s.description = %q{}
14
+ s.email = %q{jamesgolick@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "APACHE-LICENSE",
23
+ "CHANGELOG.md",
24
+ "CONTRIBUTORS.md",
25
+ "LICENSE",
26
+ "README.md",
27
+ "Rakefile",
28
+ "TODO.md",
29
+ "VERSION",
30
+ "examples/friendly.yml",
31
+ "friendly.gemspec",
32
+ "lib/friendly.rb",
33
+ "lib/friendly/associations.rb",
34
+ "lib/friendly/associations/association.rb",
35
+ "lib/friendly/associations/set.rb",
36
+ "lib/friendly/attribute.rb",
37
+ "lib/friendly/boolean.rb",
38
+ "lib/friendly/cache.rb",
39
+ "lib/friendly/cache/by_id.rb",
40
+ "lib/friendly/data_store.rb",
41
+ "lib/friendly/document.rb",
42
+ "lib/friendly/document/associations.rb",
43
+ "lib/friendly/document/attributes.rb",
44
+ "lib/friendly/document/convenience.rb",
45
+ "lib/friendly/document/mixin.rb",
46
+ "lib/friendly/document/scoping.rb",
47
+ "lib/friendly/document/storage.rb",
48
+ "lib/friendly/document_table.rb",
49
+ "lib/friendly/index.rb",
50
+ "lib/friendly/indexer.rb",
51
+ "lib/friendly/memcached.rb",
52
+ "lib/friendly/newrelic.rb",
53
+ "lib/friendly/query.rb",
54
+ "lib/friendly/scope.rb",
55
+ "lib/friendly/scope_proxy.rb",
56
+ "lib/friendly/sequel_monkey_patches.rb",
57
+ "lib/friendly/storage.rb",
58
+ "lib/friendly/storage_factory.rb",
59
+ "lib/friendly/storage_proxy.rb",
60
+ "lib/friendly/table.rb",
61
+ "lib/friendly/table_creator.rb",
62
+ "lib/friendly/time.rb",
63
+ "lib/friendly/translator.rb",
64
+ "lib/friendly/uuid.rb",
65
+ "lib/tasks/friendly.rake",
66
+ "rails/init.rb",
67
+ "spec/config.yml.example",
68
+ "spec/fakes/data_store_fake.rb",
69
+ "spec/fakes/database_fake.rb",
70
+ "spec/fakes/dataset_fake.rb",
71
+ "spec/fakes/document.rb",
72
+ "spec/fakes/serializer_fake.rb",
73
+ "spec/fakes/time_fake.rb",
74
+ "spec/integration/ad_hoc_scopes_spec.rb",
75
+ "spec/integration/basic_object_lifecycle_spec.rb",
76
+ "spec/integration/batch_insertion_spec.rb",
77
+ "spec/integration/convenience_api_spec.rb",
78
+ "spec/integration/count_spec.rb",
79
+ "spec/integration/default_value_spec.rb",
80
+ "spec/integration/dirty_tracking_spec.rb",
81
+ "spec/integration/find_via_cache_spec.rb",
82
+ "spec/integration/finder_spec.rb",
83
+ "spec/integration/has_many_spec.rb",
84
+ "spec/integration/index_spec.rb",
85
+ "spec/integration/named_scope_spec.rb",
86
+ "spec/integration/offline_indexing_spec.rb",
87
+ "spec/integration/pagination_spec.rb",
88
+ "spec/integration/scope_chaining_spec.rb",
89
+ "spec/integration/table_creator_spec.rb",
90
+ "spec/integration/write_through_cache_spec.rb",
91
+ "spec/spec.opts",
92
+ "spec/spec_helper.rb",
93
+ "spec/unit/associations/association_spec.rb",
94
+ "spec/unit/associations/set_spec.rb",
95
+ "spec/unit/attribute_spec.rb",
96
+ "spec/unit/cache_by_id_spec.rb",
97
+ "spec/unit/cache_spec.rb",
98
+ "spec/unit/data_store_spec.rb",
99
+ "spec/unit/document/attributes_spec.rb",
100
+ "spec/unit/document_spec.rb",
101
+ "spec/unit/document_table_spec.rb",
102
+ "spec/unit/friendly_spec.rb",
103
+ "spec/unit/index_spec.rb",
104
+ "spec/unit/memcached_spec.rb",
105
+ "spec/unit/query_spec.rb",
106
+ "spec/unit/scope_proxy_spec.rb",
107
+ "spec/unit/scope_spec.rb",
108
+ "spec/unit/storage_factory_spec.rb",
109
+ "spec/unit/storage_proxy_spec.rb",
110
+ "spec/unit/translator_spec.rb",
111
+ "website/index.html",
112
+ "website/scripts/clipboard.swf",
113
+ "website/scripts/shBrushAS3.js",
114
+ "website/scripts/shBrushBash.js",
115
+ "website/scripts/shBrushCSharp.js",
116
+ "website/scripts/shBrushColdFusion.js",
117
+ "website/scripts/shBrushCpp.js",
118
+ "website/scripts/shBrushCss.js",
119
+ "website/scripts/shBrushDelphi.js",
120
+ "website/scripts/shBrushDiff.js",
121
+ "website/scripts/shBrushErlang.js",
122
+ "website/scripts/shBrushGroovy.js",
123
+ "website/scripts/shBrushJScript.js",
124
+ "website/scripts/shBrushJava.js",
125
+ "website/scripts/shBrushJavaFX.js",
126
+ "website/scripts/shBrushPerl.js",
127
+ "website/scripts/shBrushPhp.js",
128
+ "website/scripts/shBrushPlain.js",
129
+ "website/scripts/shBrushPowerShell.js",
130
+ "website/scripts/shBrushPython.js",
131
+ "website/scripts/shBrushRuby.js",
132
+ "website/scripts/shBrushScala.js",
133
+ "website/scripts/shBrushSql.js",
134
+ "website/scripts/shBrushVb.js",
135
+ "website/scripts/shBrushXml.js",
136
+ "website/scripts/shCore.js",
137
+ "website/scripts/shLegacy.js",
138
+ "website/styles/friendly.css",
139
+ "website/styles/help.png",
140
+ "website/styles/ie.css",
141
+ "website/styles/magnifier.png",
142
+ "website/styles/page_white_code.png",
143
+ "website/styles/page_white_copy.png",
144
+ "website/styles/print.css",
145
+ "website/styles/printer.png",
146
+ "website/styles/screen.css",
147
+ "website/styles/shCore.css",
148
+ "website/styles/shThemeDefault.css",
149
+ "website/styles/shThemeDjango.css",
150
+ "website/styles/shThemeEclipse.css",
151
+ "website/styles/shThemeEmacs.css",
152
+ "website/styles/shThemeFadeToGrey.css",
153
+ "website/styles/shThemeMidnight.css",
154
+ "website/styles/shThemeRDark.css"
155
+ ]
156
+ s.homepage = %q{http://friendlyorm.com}
157
+ s.rdoc_options = ["--charset=UTF-8"]
158
+ s.require_paths = ["lib"]
159
+ s.rubygems_version = %q{1.3.5}
160
+ s.summary = %q{NoSQL with MySQL in Ruby}
161
+ s.test_files = [
162
+ "spec/fakes/data_store_fake.rb",
163
+ "spec/fakes/database_fake.rb",
164
+ "spec/fakes/dataset_fake.rb",
165
+ "spec/fakes/document.rb",
166
+ "spec/fakes/serializer_fake.rb",
167
+ "spec/fakes/time_fake.rb",
168
+ "spec/integration/ad_hoc_scopes_spec.rb",
169
+ "spec/integration/basic_object_lifecycle_spec.rb",
170
+ "spec/integration/batch_insertion_spec.rb",
171
+ "spec/integration/convenience_api_spec.rb",
172
+ "spec/integration/count_spec.rb",
173
+ "spec/integration/default_value_spec.rb",
174
+ "spec/integration/dirty_tracking_spec.rb",
175
+ "spec/integration/find_via_cache_spec.rb",
176
+ "spec/integration/finder_spec.rb",
177
+ "spec/integration/has_many_spec.rb",
178
+ "spec/integration/index_spec.rb",
179
+ "spec/integration/named_scope_spec.rb",
180
+ "spec/integration/offline_indexing_spec.rb",
181
+ "spec/integration/pagination_spec.rb",
182
+ "spec/integration/scope_chaining_spec.rb",
183
+ "spec/integration/table_creator_spec.rb",
184
+ "spec/integration/write_through_cache_spec.rb",
185
+ "spec/spec_helper.rb",
186
+ "spec/unit/associations/association_spec.rb",
187
+ "spec/unit/associations/set_spec.rb",
188
+ "spec/unit/attribute_spec.rb",
189
+ "spec/unit/cache_by_id_spec.rb",
190
+ "spec/unit/cache_spec.rb",
191
+ "spec/unit/data_store_spec.rb",
192
+ "spec/unit/document/attributes_spec.rb",
193
+ "spec/unit/document_spec.rb",
194
+ "spec/unit/document_table_spec.rb",
195
+ "spec/unit/friendly_spec.rb",
196
+ "spec/unit/index_spec.rb",
197
+ "spec/unit/memcached_spec.rb",
198
+ "spec/unit/query_spec.rb",
199
+ "spec/unit/scope_proxy_spec.rb",
200
+ "spec/unit/scope_spec.rb",
201
+ "spec/unit/storage_factory_spec.rb",
202
+ "spec/unit/storage_proxy_spec.rb",
203
+ "spec/unit/translator_spec.rb"
204
+ ]
205
+
206
+ if s.respond_to? :specification_version then
207
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
208
+ s.specification_version = 3
209
+
210
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
211
+ s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
212
+ s.add_development_dependency(%q<cucumber>, [">= 0"])
213
+ s.add_development_dependency(%q<jferris-mocha>, [">= 0"])
214
+ s.add_development_dependency(%q<memcached>, [">= 0"])
215
+ s.add_runtime_dependency(%q<sequel>, [">= 3.7.0"])
216
+ s.add_runtime_dependency(%q<json>, [">= 0"])
217
+ s.add_runtime_dependency(%q<activesupport>, [">= 0"])
218
+ s.add_runtime_dependency(%q<will_paginate>, [">= 0"])
219
+ else
220
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
221
+ s.add_dependency(%q<cucumber>, [">= 0"])
222
+ s.add_dependency(%q<jferris-mocha>, [">= 0"])
223
+ s.add_dependency(%q<memcached>, [">= 0"])
224
+ s.add_dependency(%q<sequel>, [">= 3.7.0"])
225
+ s.add_dependency(%q<json>, [">= 0"])
226
+ s.add_dependency(%q<activesupport>, [">= 0"])
227
+ s.add_dependency(%q<will_paginate>, [">= 0"])
228
+ end
229
+ else
230
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
231
+ s.add_dependency(%q<cucumber>, [">= 0"])
232
+ s.add_dependency(%q<jferris-mocha>, [">= 0"])
233
+ s.add_dependency(%q<memcached>, [">= 0"])
234
+ s.add_dependency(%q<sequel>, [">= 3.7.0"])
235
+ s.add_dependency(%q<json>, [">= 0"])
236
+ s.add_dependency(%q<activesupport>, [">= 0"])
237
+ s.add_dependency(%q<will_paginate>, [">= 0"])
238
+ end
239
+ end
240
+
data/lib/friendly.rb ADDED
@@ -0,0 +1,58 @@
1
+ require 'friendly/associations'
2
+ require 'friendly/attribute'
3
+ require 'friendly/boolean'
4
+ require 'friendly/cache'
5
+ require 'friendly/cache/by_id'
6
+ require 'friendly/data_store'
7
+ require 'friendly/document'
8
+ require 'friendly/document_table'
9
+ require 'friendly/index'
10
+ require 'friendly/indexer'
11
+ require 'friendly/memcached'
12
+ require 'friendly/query'
13
+ require 'friendly/sequel_monkey_patches'
14
+ require 'friendly/scope'
15
+ require 'friendly/scope_proxy'
16
+ require 'friendly/storage_factory'
17
+ require 'friendly/storage_proxy'
18
+ require 'friendly/translator'
19
+ require 'friendly/uuid'
20
+
21
+ require 'json/ext'
22
+ require 'will_paginate/collection'
23
+
24
+ module Friendly
25
+ class << self
26
+ attr_accessor :datastore, :db, :cache
27
+
28
+ def configure(config)
29
+ self.db = Sequel.connect(config)
30
+ self.datastore = DataStore.new(db)
31
+ end
32
+
33
+ def batch
34
+ begin
35
+ datastore.start_batch
36
+ yield
37
+ datastore.flush_batch
38
+ ensure
39
+ datastore.reset_batch
40
+ end
41
+ end
42
+
43
+ def create_tables!
44
+ Document.create_tables!
45
+ end
46
+ end
47
+
48
+ class Error < RuntimeError; end
49
+ class RecordNotFound < Error; end
50
+ class MissingIndex < Error; end
51
+ class NoConverterExists < Friendly::Error; end
52
+ class NotSupported < Friendly::Error; end
53
+ end
54
+
55
+ if defined?(Rails.root) && defined?(Rails.env)
56
+ config = YAML.load(File.read(Rails.root.join("config","friendly.yml")))[Rails.env]
57
+ Friendly.configure(config)
58
+ end
@@ -0,0 +1,7 @@
1
+ require 'friendly/associations/association'
2
+ require 'friendly/associations/set'
3
+
4
+ module Friendly
5
+ module Associations
6
+ end
7
+ end
@@ -0,0 +1,34 @@
1
+ module Friendly
2
+ module Associations
3
+ class Association
4
+ attr_reader :owner_klass, :name
5
+
6
+ def initialize(owner_klass, name, options = {})
7
+ @owner_klass = owner_klass
8
+ @name = name
9
+ @class_name = options[:class_name]
10
+ @foreign_key = options[:foreign_key]
11
+ end
12
+
13
+ def klass
14
+ @klass ||= class_name.constantize
15
+ end
16
+
17
+ def foreign_key
18
+ @foreign_key ||= [owner_klass_name, :id].join("_").to_sym
19
+ end
20
+
21
+ def class_name
22
+ @class_name ||= name.to_s.classify
23
+ end
24
+
25
+ def owner_klass_name
26
+ owner_klass.name.to_s.underscore.singularize
27
+ end
28
+
29
+ def scope(document)
30
+ klass.scope(foreign_key => document.id)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,37 @@
1
+ module Friendly
2
+ module Associations
3
+ class Set
4
+ attr_reader :klass, :association_klass, :associations
5
+
6
+ def initialize(klass, association_klass = Association)
7
+ @klass = klass
8
+ @association_klass = association_klass
9
+ @associations = {}
10
+ end
11
+
12
+ def add(name, options = {})
13
+ associations[name] = association_klass.new(klass, name, options)
14
+ add_association_accessor(name)
15
+ end
16
+
17
+ def get_scope(name, document)
18
+ get(name).scope(document)
19
+ end
20
+
21
+ def get(name)
22
+ associations[name]
23
+ end
24
+
25
+ protected
26
+ def add_association_accessor(name)
27
+ klass.class_eval do
28
+ eval <<-__END__
29
+ def #{name}
30
+ self.class.association_set.get_scope(:#{name}, self)
31
+ end
32
+ __END__
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end