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.
@@ -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
+