activerecord-column-reader 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ /test.db
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
@@ -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>]
@@ -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
@@ -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
+