spectacles 0.2.0 → 0.3.0.pre

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 273aac137fa2b8244bfe33650a911ef10b8086e2
4
- data.tar.gz: 01bf02d0644540ad31c6196effb248deeaf57940
3
+ metadata.gz: 777bc0650701d2eb93cc11a22223182c281f1cca
4
+ data.tar.gz: ec7b5d312864bad0a7d704d6d299f43528c0c0d9
5
5
  SHA512:
6
- metadata.gz: ca36ebb76457fe731712fc45f7dcf5408cdad8c67020a2cbab36fa2f45e6a31c13cbc71fcacb71dc8556d2f5d206c58b9689f6a7a2d7c8e0794673abde91b472
7
- data.tar.gz: 49c690ad0b1ca67184346d8a1cd8f4b154bb857aa2971d1a6b79335fae2fc4449ed3a31ee19062fc474032a9ccec07de6db6eb8ad45cf70627430e892a4a051c
6
+ metadata.gz: 0ed610ac85d55c42ae2b1e41cd7ce887dacbb1785774bad2ce355f7ce1bed80a79de92cfaa3cb34fd00ff1e60f2a5c299624be28411ed62817d382c13d6ed0c9
7
+ data.tar.gz: 2adeacea766bb60432eeea04e7c976c06a16eaae039e4005d0f301bae90122dab4d2b3c552cb81ef52aba33cc896e32b0f90b5add1b5b77a1f2fa6ea9548e08f
data/Gemfile CHANGED
@@ -3,6 +3,19 @@ source "http://rubygems.org"
3
3
  # Specify your gem's dependencies in spectacles.gemspec
4
4
  gemspec
5
5
 
6
- group :test do
6
+ platforms :jruby do
7
+ gem "activerecord-jdbcmysql-adapter"
8
+ gem "activerecord-jdbcpostgresql-adapter"
9
+ gem "activerecord-jdbcsqlite3-adapter"
10
+ end
11
+
12
+ platforms :ruby do
13
+ gem "mysql"
14
+ gem "mysql2"
15
+ gem "pg"
16
+ gem "sqlite3"
17
+ end
18
+
19
+ group :test do
7
20
  gem 'simplecov', :require => false
8
21
  end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2012 Adam Hutchison, Brandon Dewitt
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -2,8 +2,8 @@ require "bundler/gem_tasks"
2
2
  require 'rake/testtask'
3
3
 
4
4
  namespace :test do
5
- adapters = [:mysql, :mysql2, :postgresql, :sqlite]
6
- task :all => [:spectacles] + adapters
5
+ adapters = [ :mysql, :mysql2, :postgresql, :sqlite, :sqlite3 ]
6
+ task :all => [ :spectacles ] + adapters
7
7
 
8
8
  adapters.each do |adapter|
9
9
  Rake::TestTask.new(adapter) do |t|
@@ -13,7 +13,7 @@ namespace :test do
13
13
  t.verbose = true
14
14
  end
15
15
  end
16
-
16
+
17
17
  Rake::TestTask.new(:spectacles) do |t|
18
18
  t.libs.push "lib"
19
19
  t.libs.push "specs"
@@ -1,19 +1,3 @@
1
- # (The MIT License)
2
- #
3
- # Copyright (c) 2012 Adam Hutchison, http://github.com/liveh2o
4
- # Copyright (c) 2012 Brandon Dewitt, http://abrandoned.com
5
- #
6
- # Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'),
7
- # to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
- # and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
9
- #
10
- # The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
11
- #
12
- # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
14
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
15
- # IN THE SOFTWARE.
16
-
17
1
  require 'active_record'
18
2
  require 'active_support/core_ext'
19
3
  require 'spectacles/schema_statements'
@@ -39,11 +23,11 @@ module Spectacles
39
23
  end
40
24
 
41
25
  ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do
42
- alias_method(:_spectacles_orig_inherited, :inherited) if method_defined?(:inherited)
26
+ alias_method(:_spectacles_original_inherited, :inherited) if method_defined?(:inherited)
43
27
 
44
28
  def self.inherited(klass)
45
29
  ::Spectacles::load_adapters
46
- _spectacles_orig_inherited if method_defined?(:_spectacles_orig_inherited)
30
+ _spectacles_orig_inherited if method_defined?(:_spectacles_original_inherited)
47
31
  end
48
32
  end
49
33
 
@@ -1,7 +1,7 @@
1
1
  require 'spectacles/schema_statements/abstract_adapter'
2
2
 
3
3
  module Spectacles
4
- SUPPORTED_ADAPTERS = %w( Mysql Mysql2 PostgreSQL SQLServer SQLite )
4
+ SUPPORTED_ADAPTERS = %w( Mysql Mysql2 PostgreSQL SQLServer SQLite SQLite3 )
5
5
 
6
6
  def self.load_adapters
7
7
  SUPPORTED_ADAPTERS.each do |db|
@@ -10,7 +10,7 @@ module Spectacles
10
10
  if ActiveRecord::ConnectionAdapters.const_defined?(adapter_class)
11
11
  require "spectacles/schema_statements/#{db.downcase}_adapter"
12
12
  ActiveRecord::ConnectionAdapters.const_get(adapter_class).class_eval do
13
- include Spectacles::SchemaStatements.const_get(adapter_class)
13
+ include Spectacles::SchemaStatements.const_get(adapter_class)
14
14
  end
15
15
  end
16
16
  end
@@ -1,12 +1,19 @@
1
1
  module Spectacles
2
2
  module SchemaStatements
3
3
  module AbstractAdapter
4
- def create_view(view_name, build_query = nil)
4
+ def create_view(view_name, *args)
5
+ options = args.extract_options!
6
+ build_query = args.shift
7
+
5
8
  raise "#{self.class} requires a query or block" if build_query.nil? && !block_given?
6
9
 
7
10
  build_query = yield if block_given?
8
11
  build_query = build_query.to_sql if build_query.respond_to?(:to_sql)
9
12
 
13
+ if options[:force] && view_exists?(view_name)
14
+ drop_view(view_name)
15
+ end
16
+
10
17
  query = create_view_statement(view_name, build_query)
11
18
  execute(query)
12
19
  end
@@ -15,7 +22,7 @@ module Spectacles
15
22
  query = "CREATE VIEW ? AS #{create_query}"
16
23
  query_array = [query, view_name.to_s]
17
24
 
18
- #return ActiveRecord::Base.__send__(:sanitize_sql_array, query_array)
25
+ #return ActiveRecord::Base.__send__(:sanitize_sql_array, query_array)
19
26
  "CREATE VIEW #{view_name} AS #{create_query}"
20
27
  end
21
28
 
@@ -28,10 +35,14 @@ module Spectacles
28
35
  query = "DROP VIEW IF EXISTS ? "
29
36
  query_array = [query, view_name.to_s]
30
37
 
31
- #return ActiveRecord::Base.__send__(:sanitize_sql_array, query_array)
38
+ #return ActiveRecord::Base.__send__(:sanitize_sql_array, query_array)
32
39
  "DROP VIEW IF EXISTS #{view_name} "
33
40
  end
34
41
 
42
+ def view_exists?(name)
43
+ return views.include?(name.to_s)
44
+ end
45
+
35
46
  def views
36
47
  raise "Override view for your db adapter in #{self.class}"
37
48
  end
@@ -0,0 +1,33 @@
1
+ require 'spectacles/schema_statements/abstract_adapter'
2
+
3
+ module Spectacles
4
+ module SchemaStatements
5
+ module SQLite3Adapter
6
+ include Spectacles::SchemaStatements::AbstractAdapter
7
+
8
+ def generate_view_query(*columns)
9
+ sql = <<-SQL
10
+ SELECT #{columns.join(',')}
11
+ FROM sqlite_master
12
+ WHERE type = 'view'
13
+ SQL
14
+ end
15
+
16
+ def views #:nodoc:
17
+ sql = generate_view_query(:name)
18
+
19
+ exec_query(sql, "SCHEMA").map do |row|
20
+ row['name']
21
+ end
22
+ end
23
+
24
+ def view_build_query(table_name)
25
+ sql = generate_view_query(:sql)
26
+ sql << " AND name = #{quote_table_name(table_name)}"
27
+
28
+ row = exec_query(sql, "SCHEMA").first
29
+ row['sql'].gsub(/CREATE VIEW .*? AS/i, "")
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,3 +1,3 @@
1
1
  module Spectacles
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0.pre"
3
3
  end
@@ -1,9 +1,11 @@
1
1
  module Spectacles
2
2
  class View < ActiveRecord::Base
3
3
  self.abstract_class = true
4
-
4
+
5
5
  def readonly?
6
6
  true
7
7
  end
8
8
  end
9
+
10
+ ::ActiveSupport.run_load_hooks(:spectacles, View)
9
11
  end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Spectacles::SchemaStatements::SQLite3Adapter" do
4
+ File.delete(File.expand_path(File.dirname(__FILE__) + "/../test.db")) rescue nil
5
+
6
+ ActiveRecord::Base.establish_connection(
7
+ :adapter => "sqlite3",
8
+ :database => "specs/test.db"
9
+ )
10
+ load_schema
11
+
12
+ it_behaves_like "an adapter", "SQLite3Adapter"
13
+ it_behaves_like "a view model"
14
+ end
@@ -1,5 +1,5 @@
1
1
  require 'simplecov'
2
- SimpleCov.start do
2
+ SimpleCov.start do
3
3
  add_filter "/specs"
4
4
  end
5
5
 
@@ -49,11 +49,11 @@ shared_examples_for "an adapter" do |adapter|
49
49
 
50
50
  describe "view_name" do
51
51
  it "takes a symbol as the view_name" do
52
- shared_base.create_view(view_name.to_sym, Product.scoped).must_match(/#{view_name}/)
52
+ shared_base.create_view(view_name.to_sym, Product.all).must_match(/#{view_name}/)
53
53
  end
54
54
 
55
55
  it "takes a string as the view_name" do
56
- shared_base.create_view(view_name.to_s, Product.scoped).must_match(/#{view_name}/)
56
+ shared_base.create_view(view_name.to_s, Product.all).must_match(/#{view_name}/)
57
57
  end
58
58
  end
59
59
 
@@ -64,15 +64,15 @@ shared_examples_for "an adapter" do |adapter|
64
64
  end
65
65
 
66
66
  it "uses an Arel::Relation if passed" do
67
- select_statement = Product.scoped.to_sql
68
- shared_base.create_view(view_name, Product.scoped).must_match(/#{Regexp.escape(select_statement)}/)
67
+ select_statement = Product.all.to_sql
68
+ shared_base.create_view(view_name, Product.all).must_match(/#{Regexp.escape(select_statement)}/)
69
69
  end
70
70
  end
71
71
 
72
72
  describe "block" do
73
73
  it "can use an Arel::Relation from the yield" do
74
- select_statement = Product.scoped.to_sql
75
- shared_base.create_view(view_name) { Product.scoped }.must_match(/#{Regexp.escape(select_statement)}/)
74
+ select_statement = Product.all.to_sql
75
+ shared_base.create_view(view_name) { Product.all }.must_match(/#{Regexp.escape(select_statement)}/)
76
76
  end
77
77
 
78
78
  it "can use a String from the yield" do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  shared_examples_for "a view model" do
4
- ActiveRecord::Base.connection.create_view(:new_product_users) do
4
+ ActiveRecord::Base.connection.create_view(:new_product_users) do
5
5
  "SELECT name AS product_name, first_name AS username FROM
6
6
  products JOIN users ON users.id = products.user_id"
7
7
  end
@@ -9,7 +9,7 @@ shared_examples_for "a view model" do
9
9
  class NewProductUser < Spectacles::View
10
10
  scope :duck_lovers, where(:product_name => 'Rubber Duck')
11
11
  end
12
-
12
+
13
13
  describe "Spectacles::View" do
14
14
  describe "inherited class" do
15
15
  it "can has scopes" do
@@ -18,9 +18,9 @@ shared_examples_for "a view model" do
18
18
  @john = User.create(:first_name => 'John', :last_name => 'Doe')
19
19
  @john.products.create(:name => 'Rubber Duck', :value => 10)
20
20
 
21
- NewProductUser.duck_lovers.first.username.must_be @john.first_name
21
+ NewProductUser.duck_lovers.load.first.username.must_be @john.first_name
22
22
  end
23
-
23
+
24
24
  describe "an instance" do
25
25
  it "is readonly" do
26
26
  NewProductUser.new.readonly?.must_be true
@@ -20,25 +20,12 @@ Gem::Specification.new do |gem|
20
20
  ##
21
21
  # Dependencies
22
22
  #
23
- gem.add_dependency "activerecord"
24
- gem.add_dependency "activesupport"
23
+ gem.add_dependency "activerecord", ">= 3.2.0"
24
+ gem.add_dependency "activesupport", ">= 3.2.0"
25
25
 
26
26
  ##
27
27
  # Development dependencies
28
28
  #
29
29
  gem.add_development_dependency "rake"
30
30
  gem.add_development_dependency "minitest"
31
-
32
- if defined?(JRUBY_VERSION)
33
- gem.add_development_dependency "activerecord-jdbcmysql-adapter"
34
- gem.add_development_dependency "activerecord-jdbcpostgresql-adapter"
35
- gem.add_development_dependency "activerecord-jdbcsqlite3-adapter"
36
-
37
- gem.platform = Gem::Platform.new('java')
38
- else
39
- gem.add_development_dependency "mysql"
40
- gem.add_development_dependency "mysql2"
41
- gem.add_development_dependency "pg"
42
- gem.add_development_dependency "sqlite3"
43
- end
44
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spectacles
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Hutchison, Brandon Dewitt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-22 00:00:00.000000000 Z
11
+ date: 2013-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 3.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 3.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '>='
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 3.2.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '>='
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 3.2.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,62 +66,6 @@ dependencies:
66
66
  - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: mysql
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - '>='
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - '>='
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: mysql2
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - '>='
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - '>='
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: pg
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - '>='
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - '>='
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: sqlite3
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - '>='
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - '>='
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
69
  description: Still working out some of the kinks. Almost ready for Prime Time(TM).
126
70
  If you decide to use it and have problems, please report them at github.com/liveh2o/spectactles/issues
127
71
  email:
@@ -132,6 +76,7 @@ extra_rdoc_files: []
132
76
  files:
133
77
  - .gitignore
134
78
  - Gemfile
79
+ - LICENSE
135
80
  - Rakefile
136
81
  - Readme.rdoc
137
82
  - lib/spectacles.rb
@@ -143,6 +88,7 @@ files:
143
88
  - lib/spectacles/schema_statements/mysql2_adapter.rb
144
89
  - lib/spectacles/schema_statements/mysql_adapter.rb
145
90
  - lib/spectacles/schema_statements/postgresql_adapter.rb
91
+ - lib/spectacles/schema_statements/sqlite3_adapter.rb
146
92
  - lib/spectacles/schema_statements/sqlite_adapter.rb
147
93
  - lib/spectacles/schema_statements/sqlserver_adapter.rb
148
94
  - lib/spectacles/version.rb
@@ -150,6 +96,7 @@ files:
150
96
  - specs/adapters/mysql2_adapter_spec.rb
151
97
  - specs/adapters/mysql_adapter_spec.rb
152
98
  - specs/adapters/postgresql_adapter_spec.rb
99
+ - specs/adapters/sqlite3_adapter_spec.rb
153
100
  - specs/adapters/sqlite_adapter_spec.rb
154
101
  - specs/spec_helper.rb
155
102
  - specs/spectacles/schema_statements/abstract_adapter_spec.rb
@@ -173,12 +120,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
173
120
  version: '0'
174
121
  required_rubygems_version: !ruby/object:Gem::Requirement
175
122
  requirements:
176
- - - '>='
123
+ - - '>'
177
124
  - !ruby/object:Gem::Version
178
- version: '0'
125
+ version: 1.3.1
179
126
  requirements: []
180
127
  rubyforge_project:
181
- rubygems_version: 2.0.3
128
+ rubygems_version: 2.0.6
182
129
  signing_key:
183
130
  specification_version: 4
184
131
  summary: Spectacles (derived from RailsSQLViews) adds database view functionality