psql 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,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: