activerecord-column-reader 0.0.1
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.
- data/.gitignore +1 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +52 -0
- data/README +31 -0
- data/Rakefile +124 -0
- data/activerecord-column-reader.gemspec +56 -0
- data/lib/activerecord-column-reader.rb +1 -0
- data/lib/penknife/active_record/column_reader.rb +29 -0
- data/spec/penknife/column_reader_spec.rb +31 -0
- data/spec/spec_helper.rb +17 -0
- metadata +156 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
/test.db
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
activerecord-column-reader (0.0.1)
|
5
|
+
activerecord (~> 3.0.3)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (3.0.3)
|
11
|
+
activesupport (= 3.0.3)
|
12
|
+
builder (~> 2.1.2)
|
13
|
+
i18n (~> 0.4)
|
14
|
+
activerecord (3.0.3)
|
15
|
+
activemodel (= 3.0.3)
|
16
|
+
activesupport (= 3.0.3)
|
17
|
+
arel (~> 2.0.2)
|
18
|
+
tzinfo (~> 0.3.23)
|
19
|
+
activesupport (3.0.3)
|
20
|
+
arel (2.0.6)
|
21
|
+
builder (2.1.2)
|
22
|
+
diff-lcs (1.1.2)
|
23
|
+
i18n (0.5.0)
|
24
|
+
json (1.5.1)
|
25
|
+
rake (0.8.7)
|
26
|
+
rdoc (2.4.3)
|
27
|
+
rspec (2.1.0)
|
28
|
+
rspec-core (~> 2.1.0)
|
29
|
+
rspec-expectations (~> 2.1.0)
|
30
|
+
rspec-mocks (~> 2.1.0)
|
31
|
+
rspec-core (2.1.0)
|
32
|
+
rspec-expectations (2.1.0)
|
33
|
+
diff-lcs (~> 1.1.2)
|
34
|
+
rspec-mocks (2.1.0)
|
35
|
+
sdoc (0.2.20)
|
36
|
+
json (>= 1.1.3)
|
37
|
+
rdoc (= 2.4.3)
|
38
|
+
sqlite3 (1.3.3)
|
39
|
+
sqlite3-ruby (1.3.3)
|
40
|
+
sqlite3 (>= 1.3.3)
|
41
|
+
tzinfo (0.3.24)
|
42
|
+
|
43
|
+
PLATFORMS
|
44
|
+
ruby
|
45
|
+
|
46
|
+
DEPENDENCIES
|
47
|
+
activerecord (~> 3.0.3)
|
48
|
+
activerecord-column-reader!
|
49
|
+
rake (~> 0.8.7)
|
50
|
+
rspec (~> 2.1.0)
|
51
|
+
sdoc (~> 0.2.20)
|
52
|
+
sqlite3-ruby (~> 1.3.1)
|
data/README
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
A very simple utility, for when you want to easily read only a single column from an ActiveRecord model.
|
2
|
+
|
3
|
+
Usage:
|
4
|
+
|
5
|
+
class Monster < ActiveRecord::Base
|
6
|
+
column_reader :name
|
7
|
+
column_reader :hairyness, :as => :hirsutenesses
|
8
|
+
column_reader :dob
|
9
|
+
|
10
|
+
scope :dangerous, :conditions => {:carnivorous => true}
|
11
|
+
end
|
12
|
+
|
13
|
+
At it's simplest, it returns the values of just the given column:
|
14
|
+
|
15
|
+
Monster.names
|
16
|
+
# => ['Graham', 'Mike', 'Fuzzly']
|
17
|
+
|
18
|
+
The default accessor is the column name pluralized, but using the :as option, another name can be chosen:
|
19
|
+
|
20
|
+
Monster.hirsutenesses
|
21
|
+
# => ['bald', 'very', 'very']
|
22
|
+
|
23
|
+
Scopes are respected:
|
24
|
+
|
25
|
+
Monster.dangerous.names
|
26
|
+
# => ['Fuzzly']
|
27
|
+
|
28
|
+
And columns are correctly type cast:
|
29
|
+
|
30
|
+
Monster.dobs:
|
31
|
+
# => [#<Date: 4886491/2,0,2299161>, #<Date: 2886491/2,0,2299161>, #<Date: 3886491/2,0,2299161>]
|
data/Rakefile
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "bundler"
|
3
|
+
|
4
|
+
Bundler.setup :development
|
5
|
+
|
6
|
+
require "rspec/core/rake_task"
|
7
|
+
require "rake/gempackagetask"
|
8
|
+
require "rake/rdoctask"
|
9
|
+
require "rake/testtask"
|
10
|
+
require "sdoc"
|
11
|
+
|
12
|
+
task :default => 'spec'
|
13
|
+
|
14
|
+
# This builds the actual gem. For details of what all these options
|
15
|
+
# mean, and other ones you can add, check the documentation here:
|
16
|
+
#
|
17
|
+
# http://rubygems.org/read/chapter/20
|
18
|
+
#
|
19
|
+
path = File.expand_path("..", __FILE__)
|
20
|
+
|
21
|
+
spec = Dir.chdir(path) do
|
22
|
+
Gem::Specification.new do |s|
|
23
|
+
|
24
|
+
# Change these as appropriate
|
25
|
+
s.name = "activerecord-column-reader"
|
26
|
+
s.version = "0.0.1"
|
27
|
+
s.summary = "Simple ActiveRecord optimization"
|
28
|
+
s.author = "Tom Ward"
|
29
|
+
s.email = "tom@popdog.net"
|
30
|
+
s.homepage = "http://tomafro.net"
|
31
|
+
|
32
|
+
s.has_rdoc = true
|
33
|
+
s.extra_rdoc_files = %w(README)
|
34
|
+
s.rdoc_options = %w(--main README)
|
35
|
+
|
36
|
+
# Add any extra files to include in the gem
|
37
|
+
s.files = `cd #{path} && git ls-files`.split("\n").sort
|
38
|
+
|
39
|
+
# You need to put your code in a directory which can then be added to
|
40
|
+
# the $LOAD_PATH by rubygems. Typically this is lib, but you don't seem
|
41
|
+
# to have that directory. You'll need to set the line below to whatever
|
42
|
+
# directory your code is in. Rubygems is going to assume lib if you leave
|
43
|
+
# this blank.
|
44
|
+
#
|
45
|
+
s.require_paths = ["lib"]
|
46
|
+
|
47
|
+
# Main dependencies
|
48
|
+
s.add_dependency 'activerecord', '~>3.0.3'
|
49
|
+
|
50
|
+
# Development only dependencies
|
51
|
+
s.add_development_dependency 'rspec', '~>2.1.0'
|
52
|
+
s.add_development_dependency 'rake', '~>0.8.7'
|
53
|
+
s.add_development_dependency 'sqlite3-ruby', '~>1.3.1'
|
54
|
+
s.add_development_dependency 'sdoc', '~>0.2.20'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Stolen from jeweler
|
59
|
+
def prettyify_array(gemspec_ruby, array_name)
|
60
|
+
gemspec_ruby.gsub(/s\.#{array_name.to_s} = \[.+?\]/) do |match|
|
61
|
+
leadin, files = match[0..-2].split("[")
|
62
|
+
leadin + "[\n #{files.split(",").join(",\n ")}\n ]"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# This task actually builds the gem. We also regenerate a static
|
67
|
+
# .gemspec file, which is useful if something (i.e. GitHub) will
|
68
|
+
# be automatically building a gem for this project. If you're not
|
69
|
+
# using GitHub, edit as appropriate.
|
70
|
+
#
|
71
|
+
# To publish your gem online, install the 'gemcutter' gem; Read more
|
72
|
+
# about that here: http://gemcutter.org/pages/gem_docs
|
73
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
74
|
+
pkg.gem_spec = spec
|
75
|
+
end
|
76
|
+
|
77
|
+
desc "Generate gemspec"
|
78
|
+
task :gemspec do
|
79
|
+
output = spec.to_ruby
|
80
|
+
output = prettyify_array(output, :files)
|
81
|
+
output = prettyify_array(output, :test_files)
|
82
|
+
output = prettyify_array(output, :extra_rdoc_files)
|
83
|
+
|
84
|
+
file = File.expand_path("../#{spec.name}.gemspec", __FILE__)
|
85
|
+
File.open(file, "w") {|f| f << output }
|
86
|
+
end
|
87
|
+
|
88
|
+
task :package => :gemspec
|
89
|
+
|
90
|
+
# Generate documentation
|
91
|
+
Rake::RDocTask.new do |rdoc|
|
92
|
+
rdoc.rdoc_files.include("README", "lib/**/*.rb")
|
93
|
+
rdoc.rdoc_dir = 'doc'
|
94
|
+
rdoc.options << '--fmt' << 'shtml' # explictly set shtml generator
|
95
|
+
rdoc.template = 'direct' # lighter template used on railsapi.com
|
96
|
+
end
|
97
|
+
|
98
|
+
desc 'Clear out RDoc and generated packages'
|
99
|
+
task :clean => [:clobber_rdoc, :clobber_package] do
|
100
|
+
rm_f "#{spec.name}.gemspec"
|
101
|
+
end
|
102
|
+
|
103
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
104
|
+
t.rspec_opts = "-f n -c"
|
105
|
+
t.pattern = "spec/**/*_spec.rb"
|
106
|
+
end
|
107
|
+
|
108
|
+
desc 'Tag the repository in git with gem version number'
|
109
|
+
task :tag do
|
110
|
+
if `git diff --cached`.empty? && `git diff`.empty?
|
111
|
+
Rake::Task["package"].invoke
|
112
|
+
|
113
|
+
if `git tag`.split("\n").include?("v#{spec.version}")
|
114
|
+
raise "Version #{spec.version} has already been released"
|
115
|
+
end
|
116
|
+
`git add #{File.expand_path("../#{spec.name}.gemspec", __FILE__)}`
|
117
|
+
`git commit -m "Released version #{spec.version}"`
|
118
|
+
`git tag v#{spec.version}`
|
119
|
+
`git push --tags`
|
120
|
+
`git push`
|
121
|
+
else
|
122
|
+
raise "Repository contains uncommitted changes; either commit or stash."
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{activerecord-column-reader}
|
5
|
+
s.version = "0.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Tom Ward"]
|
9
|
+
s.date = %q{2011-01-31}
|
10
|
+
s.email = %q{tom@popdog.net}
|
11
|
+
s.extra_rdoc_files = [
|
12
|
+
"README"
|
13
|
+
]
|
14
|
+
s.files = [
|
15
|
+
".gitignore",
|
16
|
+
"Gemfile",
|
17
|
+
"Gemfile.lock",
|
18
|
+
"README",
|
19
|
+
"Rakefile",
|
20
|
+
"activerecord-column-reader.gemspec",
|
21
|
+
"lib/activerecord-column-reader.rb",
|
22
|
+
"lib/penknife/active_record/column_reader.rb",
|
23
|
+
"spec/penknife/column_reader_spec.rb",
|
24
|
+
"spec/spec_helper.rb"
|
25
|
+
]
|
26
|
+
s.homepage = %q{http://tomafro.net}
|
27
|
+
s.rdoc_options = ["--main", "README"]
|
28
|
+
s.require_paths = ["lib"]
|
29
|
+
s.rubygems_version = %q{1.3.7}
|
30
|
+
s.summary = %q{Simple ActiveRecord optimization}
|
31
|
+
|
32
|
+
if s.respond_to? :specification_version then
|
33
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
34
|
+
s.specification_version = 3
|
35
|
+
|
36
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
37
|
+
s.add_runtime_dependency(%q<activerecord>, ["~> 3.0.3"])
|
38
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.1.0"])
|
39
|
+
s.add_development_dependency(%q<rake>, ["~> 0.8.7"])
|
40
|
+
s.add_development_dependency(%q<sqlite3-ruby>, ["~> 1.3.1"])
|
41
|
+
s.add_development_dependency(%q<sdoc>, ["~> 0.2.20"])
|
42
|
+
else
|
43
|
+
s.add_dependency(%q<activerecord>, ["~> 3.0.3"])
|
44
|
+
s.add_dependency(%q<rspec>, ["~> 2.1.0"])
|
45
|
+
s.add_dependency(%q<rake>, ["~> 0.8.7"])
|
46
|
+
s.add_dependency(%q<sqlite3-ruby>, ["~> 1.3.1"])
|
47
|
+
s.add_dependency(%q<sdoc>, ["~> 0.2.20"])
|
48
|
+
end
|
49
|
+
else
|
50
|
+
s.add_dependency(%q<activerecord>, ["~> 3.0.3"])
|
51
|
+
s.add_dependency(%q<rspec>, ["~> 2.1.0"])
|
52
|
+
s.add_dependency(%q<rake>, ["~> 0.8.7"])
|
53
|
+
s.add_dependency(%q<sqlite3-ruby>, ["~> 1.3.1"])
|
54
|
+
s.add_dependency(%q<sdoc>, ["~> 0.2.20"])
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'penknife/active_record/column_reader'
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
3
|
+
module Penknife
|
4
|
+
module ActiveRecord
|
5
|
+
module ColumnReader
|
6
|
+
def column_reader(column_name, options = {})
|
7
|
+
name = options.delete(:as) || column_name.to_s.pluralize
|
8
|
+
column = columns_hash[column_name.to_s]
|
9
|
+
|
10
|
+
if type_cast_code = column.type_cast_code('v')
|
11
|
+
type_cast_code = "::#{type_cast_code}"
|
12
|
+
end
|
13
|
+
|
14
|
+
line = __LINE__
|
15
|
+
self.class_eval %{
|
16
|
+
def self.#{name}
|
17
|
+
query = scoped.select(arel_table[:#{column_name}])
|
18
|
+
connection.select_all(query.to_sql).collect do |value|
|
19
|
+
v = value.values.first
|
20
|
+
#{type_cast_code}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
}, __FILE__, line + 1
|
24
|
+
end
|
25
|
+
|
26
|
+
::ActiveRecord::Base.extend(self)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Monster < ActiveRecord::Base
|
4
|
+
column_reader :name
|
5
|
+
column_reader :dob, :as => :birth_dates
|
6
|
+
scope :carnivorous, :conditions => {:carnivorous => true}
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "Penknife::ActiveRecord::ColumnReader" do
|
10
|
+
before :all do
|
11
|
+
@growler = Monster.create! :name => 'Growler', :carnivorous => true, :dob => 5.years.ago.to_date
|
12
|
+
@munchy = Monster.create! :name => 'Munchy', :carnivorous => true, :dob => 12.years.ago
|
13
|
+
@thistletop = Monster.create! :name => 'Thistletop', :carnivorous => false, :dob => 1.years.ago
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns only specified values" do
|
17
|
+
Monster.names.sort.should eql(['Growler', 'Munchy', 'Thistletop'])
|
18
|
+
end
|
19
|
+
|
20
|
+
it "respects scope" do
|
21
|
+
Monster.carnivorous.names.sort.should eql(['Growler', 'Munchy'])
|
22
|
+
end
|
23
|
+
|
24
|
+
it "casts returned values" do
|
25
|
+
Monster.birth_dates
|
26
|
+
end
|
27
|
+
|
28
|
+
after :all do
|
29
|
+
Monster.destroy_all
|
30
|
+
end
|
31
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'active_record'
|
3
|
+
require 'activerecord-column-reader'
|
4
|
+
require 'logger'
|
5
|
+
|
6
|
+
ActiveRecord::Base.establish_connection({
|
7
|
+
:adapter => "sqlite3",
|
8
|
+
:database => "test.db"
|
9
|
+
})
|
10
|
+
|
11
|
+
ActiveRecord::Schema.define(:version => 1) do
|
12
|
+
create_table 'monsters', :force => true do |t|
|
13
|
+
t.string 'name'
|
14
|
+
t.date 'dob'
|
15
|
+
t.boolean 'carnivorous'
|
16
|
+
end
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: activerecord-column-reader
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Tom Ward
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-02-08 00:00:00 +00:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
prerelease: false
|
23
|
+
type: :runtime
|
24
|
+
name: activerecord
|
25
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ~>
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 1
|
31
|
+
segments:
|
32
|
+
- 3
|
33
|
+
- 0
|
34
|
+
- 3
|
35
|
+
version: 3.0.3
|
36
|
+
requirement: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
prerelease: false
|
39
|
+
type: :development
|
40
|
+
name: rspec
|
41
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
hash: 11
|
47
|
+
segments:
|
48
|
+
- 2
|
49
|
+
- 1
|
50
|
+
- 0
|
51
|
+
version: 2.1.0
|
52
|
+
requirement: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
prerelease: false
|
55
|
+
type: :development
|
56
|
+
name: rake
|
57
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ~>
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
hash: 49
|
63
|
+
segments:
|
64
|
+
- 0
|
65
|
+
- 8
|
66
|
+
- 7
|
67
|
+
version: 0.8.7
|
68
|
+
requirement: *id003
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
prerelease: false
|
71
|
+
type: :development
|
72
|
+
name: sqlite3-ruby
|
73
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ~>
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
hash: 25
|
79
|
+
segments:
|
80
|
+
- 1
|
81
|
+
- 3
|
82
|
+
- 1
|
83
|
+
version: 1.3.1
|
84
|
+
requirement: *id004
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
prerelease: false
|
87
|
+
type: :development
|
88
|
+
name: sdoc
|
89
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ~>
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
hash: 63
|
95
|
+
segments:
|
96
|
+
- 0
|
97
|
+
- 2
|
98
|
+
- 20
|
99
|
+
version: 0.2.20
|
100
|
+
requirement: *id005
|
101
|
+
description:
|
102
|
+
email: tom@popdog.net
|
103
|
+
executables: []
|
104
|
+
|
105
|
+
extensions: []
|
106
|
+
|
107
|
+
extra_rdoc_files:
|
108
|
+
- README
|
109
|
+
files:
|
110
|
+
- .gitignore
|
111
|
+
- Gemfile
|
112
|
+
- Gemfile.lock
|
113
|
+
- README
|
114
|
+
- Rakefile
|
115
|
+
- activerecord-column-reader.gemspec
|
116
|
+
- lib/activerecord-column-reader.rb
|
117
|
+
- lib/penknife/active_record/column_reader.rb
|
118
|
+
- spec/penknife/column_reader_spec.rb
|
119
|
+
- spec/spec_helper.rb
|
120
|
+
has_rdoc: true
|
121
|
+
homepage: http://tomafro.net
|
122
|
+
licenses: []
|
123
|
+
|
124
|
+
post_install_message:
|
125
|
+
rdoc_options:
|
126
|
+
- --main
|
127
|
+
- README
|
128
|
+
require_paths:
|
129
|
+
- lib
|
130
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
hash: 3
|
136
|
+
segments:
|
137
|
+
- 0
|
138
|
+
version: "0"
|
139
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
|
+
none: false
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
hash: 3
|
145
|
+
segments:
|
146
|
+
- 0
|
147
|
+
version: "0"
|
148
|
+
requirements: []
|
149
|
+
|
150
|
+
rubyforge_project:
|
151
|
+
rubygems_version: 1.3.7
|
152
|
+
signing_key:
|
153
|
+
specification_version: 3
|
154
|
+
summary: Simple ActiveRecord optimization
|
155
|
+
test_files: []
|
156
|
+
|