psql 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.pryrc ADDED
@@ -0,0 +1,2 @@
1
+ $: << './lib'
2
+ require 'psql'
data/.wrong ADDED
@@ -0,0 +1 @@
1
+ color
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in psql.gemspec
4
+ gemspec
@@ -0,0 +1,6 @@
1
+ guard 'minitest' do
2
+ watch( %r|^test/(.*)\/?(.*)_test\.rb| )
3
+ watch( %r|^lib/(.*)([^/]+)\.rb| ){ |m| "test/#{m[1]}#{m[2]}_test.rb" }
4
+ watch( 'test/test_helper.rb' ){ 'test' }
5
+ watch( 'Gemfile.lock' ){ 'test' }
6
+ end
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Jeremy Ruppel
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,57 @@
1
+ # PSQL
2
+
3
+ A simple ruby library for consuming the `psql` command. Created in order to
4
+ simply and quickly describe a PostgreSQL table without having to go through
5
+ ActiveRecord, so that's basically all you can do right now.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'psql'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install psql
20
+
21
+ ## Usage
22
+
23
+ If you have the following schema in a database named `blog`:
24
+
25
+ Table "public.posts"
26
+ | Column | Type | Modifiers |
27
+ |--------------|-----------------------|-----------|
28
+ | id | integer | not null |
29
+ | title | character varying(55) | |
30
+ | body | text | |
31
+
32
+ ``` ruby
33
+ db = PSQL::Database.new 'blog' # => instance of PSQL::Database
34
+ db.table( 'posts' ) # => instance of PSQL::Table
35
+ db.table( 'posts' ).column( 'title' ) # => instance of PSQL::Column
36
+ db.table( 'posts' ).column( 'title' ).type # => :string
37
+
38
+ # And the grand finale:
39
+
40
+ PSQL[ 'blog' ][ 'posts' ][ 'title' ].type # => :string
41
+ ```
42
+
43
+ **PSQL** has no dependency on rails, but it can try and auto-detect your
44
+ rails database name if `RAILS_ENV` is set:
45
+
46
+ ``` ruby
47
+ ENV[ 'RAILS_ENV' ] # => "development"
48
+ PSQL::Database.new :rails # => attempts to locate database.yml and determine the database name
49
+ ```
50
+
51
+ ## Contributing
52
+
53
+ 1. Fork it
54
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
55
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
56
+ 4. Push to the branch (`git push origin my-new-feature`)
57
+ 5. Create new Pull Request
@@ -0,0 +1,30 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << 'test'
6
+ t.pattern = 'test/**/*_test.rb'
7
+ end
8
+
9
+ task :default => :test
10
+
11
+ namespace :db do
12
+
13
+ desc 'Create the test database'
14
+ task :create do
15
+ sh 'createdb psql_gem_test'
16
+ end
17
+
18
+ desc 'Migrate the test database'
19
+ task :migrate do
20
+ sh 'psql --file ./test/fixtures/database.sql psql_gem_test'
21
+ end
22
+
23
+ task :setup => [ :create, :migrate ]
24
+ task :reset => [ :drop, :setup ]
25
+
26
+ desc 'Drop the test database'
27
+ task :drop do
28
+ sh 'dropdb psql_gem_test'
29
+ end
30
+ end
@@ -0,0 +1,25 @@
1
+ require 'psql/version'
2
+
3
+ module PSQL
4
+ autoload :Column, 'psql/column'
5
+ autoload :Database, 'psql/database'
6
+ autoload :Table, 'psql/table'
7
+
8
+ def []( name )
9
+ Database.new name
10
+ end
11
+ module_function :[]
12
+ end
13
+
14
+ require 'cocaine'
15
+ require 'csv'
16
+
17
+ def PSQL( command, params )
18
+ cmd = Cocaine::CommandLine.new 'psql', '-tAc "%s" :dbname' % [ command ]
19
+
20
+ if headers = params.delete( :headers )
21
+ CSV.parse cmd.run( params ), :headers => headers, :col_sep => '|'
22
+ else
23
+ cmd.run params
24
+ end
25
+ end
@@ -0,0 +1,32 @@
1
+ module PSQL
2
+ class Column
3
+
4
+ ##
5
+ #
6
+ def initialize( name, raw_type, modifiers=nil )
7
+ @name, @raw_type, @modifiers = name, raw_type, modifiers
8
+ end
9
+ attr_reader :name, :raw_type, :modifiers
10
+
11
+ ##
12
+ #
13
+ def type
14
+ case raw_type
15
+ when 'integer'
16
+ :integer
17
+ when 'double precision'
18
+ :float
19
+ when 'boolean'
20
+ :boolean
21
+ when /^character varying/
22
+ :string
23
+ when 'text'
24
+ :text
25
+ when 'date'
26
+ :date
27
+ when 'timestamp without time zone'
28
+ :datetime
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,56 @@
1
+ module PSQL
2
+ class Database
3
+
4
+ ##
5
+ #
6
+ def initialize( name )
7
+ @name = case name
8
+ when String
9
+ name
10
+ when :rails
11
+ find_rails_database_name
12
+ end
13
+ end
14
+ attr_reader :name
15
+
16
+ ##
17
+ # Finds a database object by name. Objects are tables, views, or
18
+ # sequences.
19
+ def object( object_name )
20
+ object = objects.find do |obj|
21
+ obj[ 'name' ] == object_name
22
+ end
23
+
24
+ if !object
25
+ raise "Database #{name} does not have an object named '#{object_name}'."
26
+ end
27
+
28
+ klass = PSQL.const_get object[ 'type' ].capitalize
29
+ klass.new object[ 'name' ], name
30
+ end
31
+ alias :[] :object
32
+
33
+ private
34
+
35
+ ##
36
+ # Lists all of the objects in this database. Objects are
37
+ # tables, views, and sequences.
38
+ def objects
39
+ PSQL '\d', :dbname => name, :headers => %w| schema name type owner |
40
+ end
41
+
42
+ ##
43
+ #
44
+ def find_rails_database_name
45
+ require 'yaml'
46
+
47
+ raise(<<-EOS.strip) unless ENV[ 'RAILS_ENV' ]
48
+ Cannot automatically determine rails database name because RAILS_ENV is not set.
49
+ EOS
50
+
51
+ file = `find . -name database.yml`.chomp
52
+ hash = YAML.load_file( file )
53
+ hash[ ENV[ 'RAILS_ENV' ] ][ 'database' ]
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,41 @@
1
+ module PSQL
2
+ class Table
3
+
4
+ ##
5
+ #
6
+ def initialize( name, dbname )
7
+ @name, @dbname = name, dbname
8
+ end
9
+ attr_reader :name, :dbname
10
+
11
+ ##
12
+ #
13
+ def column( column_name )
14
+ column = columns.find do |col|
15
+ col[ 'name' ] == column_name
16
+ end
17
+
18
+ if !column
19
+ raise "Table #{name} does not have a column named '#{column_name}'."
20
+ end
21
+
22
+ Column.new column[ 'name' ], column[ 'type' ], column[ 'modifiers' ]
23
+ end
24
+ alias :[] :column
25
+
26
+ def column_names
27
+ columns.map { |col| col[ 'name' ] }
28
+ end
29
+
30
+ private
31
+
32
+ ##
33
+ #
34
+ def columns
35
+ @columns ||= PSQL '\d :name',
36
+ :name => name,
37
+ :dbname => dbname,
38
+ :headers => %w| name type modifiers |
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,3 @@
1
+ module PSQL
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'psql/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "psql"
8
+ gem.version = PSQL::VERSION
9
+ gem.authors = ["Jeremy Ruppel"]
10
+ gem.email = ["jeremy.ruppel@gmail.com"]
11
+ gem.description = %q{A simple ruby library for consuming the `psql` command.}
12
+ gem.summary = %q{A simple ruby library for consuming the `psql` command.}
13
+ gem.homepage = 'https://github.com/jeremyruppel/psql'
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency 'cocaine', '0.5.1'
21
+
22
+ gem.add_development_dependency 'wrong', '0.7.0'
23
+ gem.add_development_dependency 'pry', '0.9.12'
24
+ gem.add_development_dependency 'guard-minitest', '0.5.0'
25
+ gem.add_development_dependency 'rb-fsevent', '~> 0.9'
26
+ end
@@ -0,0 +1,13 @@
1
+ -- ===================================================================
2
+ -- = Name: posts; Type: TABLE; Schema: public; Owner: 0; Tablespace: =
3
+ -- ===================================================================
4
+
5
+ CREATE TABLE posts (
6
+ id integer NOT NULL,
7
+ title character varying(255),
8
+ body text,
9
+ created_at timestamp without time zone,
10
+ published_on date,
11
+ published boolean,
12
+ rating double precision
13
+ );
@@ -0,0 +1,6 @@
1
+ development:
2
+ adapter: postgresql
3
+ database: psql_gem_development
4
+ test:
5
+ adapter: postgresql
6
+ database: psql_gem_test
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ class ColumnTest < MiniTest::Unit::TestCase
4
+
5
+ def test_stores_attributes
6
+ col = PSQL::Column.new 'foo', 'bar', 'baz'
7
+ assert { col.name == 'foo' }
8
+ assert { col.raw_type == 'bar' }
9
+ assert { col.modifiers == 'baz' }
10
+ end
11
+ def test_integer_type
12
+ col = PSQL::Column.new 'id', 'integer'
13
+ assert { col.type == :integer }
14
+ end
15
+ def test_float_type
16
+ col = PSQL::Column.new 'rating', 'double precision'
17
+ assert { col.type == :float }
18
+ end
19
+ def test_boolean_type
20
+ col = PSQL::Column.new 'published', 'boolean'
21
+ assert { col.type == :boolean }
22
+ end
23
+ def test_string_type
24
+ col = PSQL::Column.new 'title', 'character varying(255)'
25
+ assert { col.type == :string }
26
+ end
27
+ def test_text_type
28
+ col = PSQL::Column.new 'body', 'text'
29
+ assert { col.type == :text }
30
+ end
31
+ def test_datetime_type
32
+ col = PSQL::Column.new 'created_at', 'timestamp without time zone'
33
+ assert { col.type == :datetime }
34
+ end
35
+ def test_date_type
36
+ col = PSQL::Column.new 'published_on', 'date'
37
+ assert { col.type == :date }
38
+ end
39
+ end
@@ -0,0 +1,26 @@
1
+ require 'test_helper'
2
+
3
+ class DatabaseTest < MiniTest::Unit::TestCase
4
+
5
+ def test_stores_database_name
6
+ db = PSQL::Database.new 'psql_gem_test'
7
+ assert { db.name == 'psql_gem_test' }
8
+ end
9
+ def test_reads_rails_database_config
10
+ ENV[ 'RAILS_ENV' ] = 'test'
11
+ db = PSQL::Database.new :rails
12
+ assert { db.name == 'psql_gem_test' }
13
+ end
14
+ def test_object_raises_error_if_not_found
15
+ db = PSQL::Database.new 'psql_gem_test'
16
+ assert { rescuing { db.object( 'foo' ) }.message =~ /Database psql_gem_test does not have an object named 'foo'./ }
17
+ end
18
+ def test_object_returns_table_object
19
+ db = PSQL::Database.new 'psql_gem_test'
20
+ assert { db.object( 'posts' ).is_a?( PSQL::Table ) }
21
+ end
22
+ def test_hash_access_returns_table_object
23
+ db = PSQL::Database.new 'psql_gem_test'
24
+ assert { db[ 'posts' ].is_a?( PSQL::Table ) }
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ require 'test_helper'
2
+
3
+ class TableTest < MiniTest::Unit::TestCase
4
+
5
+ def test_stores_name_and_database_name
6
+ table = PSQL::Table.new 'foo', 'bar'
7
+ assert { table.name == 'foo' }
8
+ assert { table.dbname == 'bar' }
9
+ end
10
+ def test_column_raises_error_if_not_found
11
+ table = PSQL::Table.new 'posts', 'psql_gem_test'
12
+ assert { rescuing { table.column( 'foo' ) }.message =~ /Table posts does not have a column named 'foo'./ }
13
+ end
14
+ def test_column_returns_column_object
15
+ table = PSQL::Table.new 'posts', 'psql_gem_test'
16
+ assert { table.column( 'title' ).is_a?( PSQL::Column ) }
17
+ end
18
+ def test_hash_access_returns_column_object
19
+ table = PSQL::Table.new 'posts', 'psql_gem_test'
20
+ assert { table[ 'title' ].is_a?( PSQL::Column ) }
21
+ end
22
+ def test_column_names
23
+ table = PSQL::Table.new 'posts', 'psql_gem_test'
24
+ assert { table.column_names == %w| id title body created_at published_on published rating | }
25
+ end
26
+ end
@@ -0,0 +1,23 @@
1
+ require 'minitest/autorun'
2
+ require 'wrong/adapters/minitest'
3
+ require 'psql'
4
+
5
+ # class DatabaseTestRunner < MiniTest::Unit
6
+ #
7
+ # def _run_suites(*)
8
+ # before_suite
9
+ # super
10
+ # ensure
11
+ # after_suite
12
+ # end
13
+ #
14
+ # def before_suite
15
+ # `createdb psql_gem_test`
16
+ # end
17
+ #
18
+ # def after_suite
19
+ # `dropdb psql_gem_test`
20
+ # end
21
+ # end
22
+ #
23
+ # MiniTest::Unit.runner = DatabaseTestRunner.new
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: psql
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jeremy Ruppel
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: cocaine
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.5.1
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.5.1
30
+ - !ruby/object:Gem::Dependency
31
+ name: wrong
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - '='
36
+ - !ruby/object:Gem::Version
37
+ version: 0.7.0
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - '='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.7.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: pry
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - '='
52
+ - !ruby/object:Gem::Version
53
+ version: 0.9.12
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.9.12
62
+ - !ruby/object:Gem::Dependency
63
+ name: guard-minitest
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - '='
68
+ - !ruby/object:Gem::Version
69
+ version: 0.5.0
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - '='
76
+ - !ruby/object:Gem::Version
77
+ version: 0.5.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: rb-fsevent
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: '0.9'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '0.9'
94
+ description: A simple ruby library for consuming the `psql` command.
95
+ email:
96
+ - jeremy.ruppel@gmail.com
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - .gitignore
102
+ - .pryrc
103
+ - .wrong
104
+ - Gemfile
105
+ - Guardfile
106
+ - LICENSE.txt
107
+ - README.md
108
+ - Rakefile
109
+ - lib/psql.rb
110
+ - lib/psql/column.rb
111
+ - lib/psql/database.rb
112
+ - lib/psql/table.rb
113
+ - lib/psql/version.rb
114
+ - psql.gemspec
115
+ - test/fixtures/database.sql
116
+ - test/fixtures/database.yml
117
+ - test/psql/column_test.rb
118
+ - test/psql/database_test.rb
119
+ - test/psql/table_test.rb
120
+ - test/test_helper.rb
121
+ homepage: https://github.com/jeremyruppel/psql
122
+ licenses: []
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ none: false
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ requirements: []
140
+ rubyforge_project:
141
+ rubygems_version: 1.8.23
142
+ signing_key:
143
+ specification_version: 3
144
+ summary: A simple ruby library for consuming the `psql` command.
145
+ test_files:
146
+ - test/fixtures/database.sql
147
+ - test/fixtures/database.yml
148
+ - test/psql/column_test.rb
149
+ - test/psql/database_test.rb
150
+ - test/psql/table_test.rb
151
+ - test/test_helper.rb
152
+ has_rdoc: