sql_values 0.1.0

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 ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in sql_values.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,32 @@
1
+ *sql_values* retrieves SQL values using Active Record query interface but without instantiation of AR-objects.
2
+
3
+ Assuming you've got a class:
4
+
5
+ ```ruby
6
+ class Player < ActiveRecord::Base
7
+ validates_presence_of :name
8
+ scope :best, order('rating desc')
9
+ end
10
+ ```
11
+
12
+ You can now retrieve `values`:
13
+
14
+ ```ruby
15
+ Player.values(:name) # => ["boffy", "pitibo", "macovsky"]
16
+ Player.best.values(:rating) # => [30, 25, 10]
17
+ ```
18
+
19
+ There's also a shorthand `ids` for `values(:id)`:
20
+
21
+ ```ruby
22
+ Player.where("rating>?", 10).ids # => [1, 3]
23
+ Player.ids(:league_id) # => [5, 3, 4]
24
+ ```
25
+
26
+ And last but not the least, `hashes`:
27
+
28
+ ```ruby
29
+ Player.hashes(%w{id name}) # => [{"id" => 1, "name" => "boffy"}, {"id" => 2, "name" => "pitibo"}, {"id" => 3, "name" => "macovsky"}]
30
+ ```
31
+
32
+ That's all folks!
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rake/testtask'
4
+
5
+ # Run the test with 'rake' or 'rake test'
6
+ desc 'Default: run acts_as_list unit tests.'
7
+ task :default => :test
8
+
9
+ desc 'Test the acts_as_list plugin.'
10
+ Rake::TestTask.new(:test) do |t|
11
+ t.libs << 'lib' << 'test'
12
+ t.pattern = 'test/**/test_*.rb'
13
+ t.verbose = true
14
+ end
data/init.rb ADDED
@@ -0,0 +1,2 @@
1
+ require File.join(File.dirname(__FILE__), "lib", "sql_values")
2
+ SqlValues::Railtie.insert
data/lib/sql_values.rb ADDED
@@ -0,0 +1,32 @@
1
+ require "sql_values/version"
2
+ require "sql_values/railtie"
3
+
4
+ module SqlValues
5
+ module RelationInstanceMethods
6
+ def values(name)
7
+ connection.select_values(select(name).to_sql)
8
+ end
9
+
10
+ def ids(name = :id)
11
+ values(name)
12
+ end
13
+
14
+ def hashes(names)
15
+ connection.select_all(select(names).to_sql)
16
+ end
17
+ end
18
+
19
+ module ActiveRecordClassMethods
20
+ def values(name)
21
+ relation.values(name)
22
+ end
23
+
24
+ def ids(name = :id)
25
+ relation.ids(name)
26
+ end
27
+
28
+ def hashes(names)
29
+ relation.hashes(names)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+ require 'sql_values'
2
+
3
+ module SqlValues
4
+ if defined?(Rails::Railtie)
5
+ require 'rails'
6
+ class Railtie < Rails::Railtie
7
+ initializer 'sql_values.insert_into_active_record' do
8
+ ActiveSupport.on_load :active_record do
9
+ SqlValues::Railtie.insert
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ class Railtie
16
+ def self.insert
17
+ if defined?(ActiveRecord)
18
+ ActiveRecord::Relation.send(:include, SqlValues::RelationInstanceMethods)
19
+ ActiveRecord::Base.extend(SqlValues::ActiveRecordClassMethods)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,3 @@
1
+ module SqlValues
2
+ VERSION = "0.1.0"
3
+ end
data/rails/init.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'sql_values/railtie'
2
+ SqlValues::Railtie.insert
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "sql_values/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "sql_values"
7
+ s.version = SqlValues::VERSION
8
+ s.authors = ["Max Savchenko"]
9
+ s.email = ["robotector@gmail.com"]
10
+ s.homepage = "http://github.com/macovsky/sql_values"
11
+ s.summary = %q{Retrieve SQL values using Active Record query interface but without instantiation of AR-objects}
12
+ s.description = %q{}
13
+
14
+ s.rubyforge_project = "sql_values"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_dependency 'activerecord', '>= 3.0.0'
22
+ s.add_development_dependency 'sqlite3'
23
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'active_record'
12
+ require "#{File.dirname(__FILE__)}/../init"
@@ -0,0 +1,57 @@
1
+ require 'helper'
2
+
3
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
4
+
5
+ class Player < ActiveRecord::Base
6
+ scope :best, order('rating desc')
7
+ end
8
+
9
+ class PlayerTest < Test::Unit::TestCase
10
+ DATA = [
11
+ {'rating' => 2, 'name' => 'boffy'},
12
+ {'rating' => 3, 'name' => 'pitibo'},
13
+ {'rating' => 1, 'name' => 'macovsky'},
14
+ ]
15
+
16
+ BEST_DATA = DATA.sort_by{|data| data['rating']}.reverse
17
+
18
+ def setup
19
+ ActiveRecord::Schema.define(:version => 1) do
20
+ create_table :players do |t|
21
+ t.column :rating, :integer, :null => false, :default => 0
22
+ t.column :name, :string
23
+ end
24
+ end
25
+ Player.create(DATA)
26
+ end
27
+
28
+ def teardown
29
+ ActiveRecord::Base.connection.tables.each do |table|
30
+ ActiveRecord::Base.connection.drop_table(table)
31
+ end
32
+ end
33
+
34
+ def test_respond_to
35
+ %w{ids values hashes}.each do |name|
36
+ assert Player.respond_to?(name)
37
+ assert Player.best.respond_to?(name)
38
+ end
39
+ end
40
+
41
+ def test_values
42
+ assert_equal Player.ids, [1,2,3]
43
+ assert_equal Player.values(:id), [1,2,3]
44
+ assert_equal Player.values(:name), DATA.map{|d| d['name']}
45
+ end
46
+
47
+ def test_values_on_relation
48
+ assert_equal Player.best.ids, [2,1,3]
49
+ assert_equal Player.best.values(:id), [2,1,3]
50
+ assert_equal Player.best.values(:name), BEST_DATA.map{|d| d['name']}
51
+ end
52
+
53
+ def test_hashes
54
+ assert_equal Player.hashes(%w{rating name}), DATA
55
+ assert_equal Player.best.hashes(%w{rating name}), BEST_DATA
56
+ end
57
+ end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sql_values
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Max Savchenko
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-12 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activerecord
16
+ requirement: &70192875659360 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 3.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70192875659360
25
+ - !ruby/object:Gem::Dependency
26
+ name: sqlite3
27
+ requirement: &70192875658620 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70192875658620
36
+ description: ''
37
+ email:
38
+ - robotector@gmail.com
39
+ executables: []
40
+ extensions: []
41
+ extra_rdoc_files: []
42
+ files:
43
+ - .gitignore
44
+ - Gemfile
45
+ - README.md
46
+ - Rakefile
47
+ - init.rb
48
+ - lib/sql_values.rb
49
+ - lib/sql_values/railtie.rb
50
+ - lib/sql_values/version.rb
51
+ - rails/init.rb
52
+ - sql_values.gemspec
53
+ - test/helper.rb
54
+ - test/test_sql_values.rb
55
+ homepage: http://github.com/macovsky/sql_values
56
+ licenses: []
57
+ post_install_message:
58
+ rdoc_options: []
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ requirements: []
74
+ rubyforge_project: sql_values
75
+ rubygems_version: 1.8.10
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: Retrieve SQL values using Active Record query interface but without instantiation
79
+ of AR-objects
80
+ test_files:
81
+ - test/helper.rb
82
+ - test/test_sql_values.rb