activerecord-postgres-json 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/activerecord-postgres-json.gemspec +4 -3
- data/db/ar_postgre_json_test.sql +43 -0
- data/lib/activerecord-postgres-json/activerecord.rb +12 -7
- data/spec/activerecord-postgres-json_spec.rb +34 -29
- data/spec/support/database_setup.rb +23 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e25b4dcf74b8f989c6a5bfe4b54e48ee733e5def17452dfca59d61c756b3db2
|
4
|
+
data.tar.gz: 0a9eae8d07eaf12f97688f50fa19952d3d76082148a3d55f587157176c25247c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a6c3a987892882a1f4887ffa39bcf502845efc4863cb461cf047c8d829ca7a4da1b3f00f5c51e6274c31720cbab75b56efde55efa6a7d9be97690c4a70900988
|
7
|
+
data.tar.gz: c6571acbf93ea8647e7acaeb95dd9a81bf3130fb16e9468a4c8d11069f49558c9e2e018bf44304184b971aa95e77bc444ec1b49d09bd5bfe46d7a810db6bf7d8
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.3
|
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: activerecord-postgres-json 0.2.
|
5
|
+
# stub: activerecord-postgres-json 0.2.3 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "activerecord-postgres-json".freeze
|
9
|
-
s.version = "0.2.
|
9
|
+
s.version = "0.2.3"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Roman Shterenzon".freeze]
|
14
|
-
s.date = "2020-09-
|
14
|
+
s.date = "2020-09-15"
|
15
15
|
s.description = "Active Record support for PostgreSQL JSON type".freeze
|
16
16
|
s.email = "romanbsd@yahoo.com".freeze
|
17
17
|
s.extra_rdoc_files = [
|
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
"Rakefile",
|
29
29
|
"VERSION",
|
30
30
|
"activerecord-postgres-json.gemspec",
|
31
|
+
"db/ar_postgre_json_test.sql",
|
31
32
|
"lib/activerecord-postgres-json.rb",
|
32
33
|
"lib/activerecord-postgres-json/activerecord.rb",
|
33
34
|
"lib/activerecord-postgres-json/coders.rb",
|
@@ -0,0 +1,43 @@
|
|
1
|
+
SET statement_timeout = 0;
|
2
|
+
SET lock_timeout = 0;
|
3
|
+
SET idle_in_transaction_session_timeout = 0;
|
4
|
+
SET client_encoding = 'UTF8';
|
5
|
+
SET standard_conforming_strings = on;
|
6
|
+
SELECT pg_catalog.set_config('search_path', '', false);
|
7
|
+
SET check_function_bodies = false;
|
8
|
+
SET xmloption = content;
|
9
|
+
SET client_min_messages = warning;
|
10
|
+
SET row_security = off;
|
11
|
+
|
12
|
+
SET default_tablespace = '';
|
13
|
+
|
14
|
+
CREATE TABLE public.posts (
|
15
|
+
id integer NOT NULL,
|
16
|
+
old_data json,
|
17
|
+
data jsonb
|
18
|
+
);
|
19
|
+
|
20
|
+
CREATE INDEX index_posts_data_gin ON public.posts USING gin (data);
|
21
|
+
|
22
|
+
CREATE VIEW public.post_questions AS
|
23
|
+
SELECT posts.id,
|
24
|
+
(posts.data ->> 'title'::text) AS title,
|
25
|
+
(posts.data #>> '{author,name}'::text[]) AS author_name,
|
26
|
+
(posts.data #>> '{author,email}'::text[]) AS author_email,
|
27
|
+
((posts.data ->> 'tags'::text))::jsonb AS tags,
|
28
|
+
((posts.data ->> 'draft'::text))::boolean AS draft
|
29
|
+
FROM public.posts;
|
30
|
+
|
31
|
+
CREATE SEQUENCE public.posts_id_seq
|
32
|
+
AS integer
|
33
|
+
START WITH 1
|
34
|
+
INCREMENT BY 1
|
35
|
+
NO MINVALUE
|
36
|
+
NO MAXVALUE
|
37
|
+
CACHE 1;
|
38
|
+
|
39
|
+
ALTER SEQUENCE public.posts_id_seq OWNED BY public.posts.id;
|
40
|
+
|
41
|
+
ALTER TABLE ONLY public.posts ALTER COLUMN id SET DEFAULT nextval('public.posts_id_seq'::regclass);
|
42
|
+
|
43
|
+
ALTER TABLE ONLY public.posts ADD CONSTRAINT posts_pkey PRIMARY KEY (id);
|
@@ -5,15 +5,20 @@ require 'active_record/connection_adapters/postgresql_adapter'
|
|
5
5
|
|
6
6
|
module ActiveRecord
|
7
7
|
module ConnectionAdapters
|
8
|
-
|
8
|
+
# jsonb type isn't known by Rails 3.2.x, 4.0.x and 4.1.x, so the gem is defining it
|
9
9
|
PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:jsonb] = { name: 'jsonb' }
|
10
10
|
|
11
|
-
if
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
if ActiveRecord.respond_to?(:version)
|
12
|
+
if ::ActiveRecord.version >= Gem::Version.new('4.0.0') && ::ActiveRecord.version < Gem::Version.new('4.2.0')
|
13
|
+
# As suggested here:
|
14
|
+
# http://www.innovationontherun.com/fixing-unknown-oid-geography-errors-with-postgis-and-rails-4-0/
|
15
|
+
# to prevent the Rails 4.0/4.1 error of "unknown OID: {field}"
|
16
|
+
PostgreSQLAdapter::OID.register_type('jsonb', PostgreSQLAdapter::OID::Identity.new)
|
17
|
+
end
|
18
|
+
elsif ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 2
|
19
|
+
# json type isn't known by Rails 3.2.x, so the gem is defining it.
|
20
|
+
# Rails 4.0.x and 4.1.x already have it defined
|
21
|
+
PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:json] = { name: 'json' }
|
17
22
|
end
|
18
23
|
|
19
24
|
class PostgreSQLColumn < Column
|
@@ -3,6 +3,9 @@ require File.expand_path(File.dirname(__FILE__) + '/support/database_setup')
|
|
3
3
|
|
4
4
|
class Post < ActiveRecord::Base
|
5
5
|
serialize :data, ActiveRecord::Coders::JSON.new(symbolize_keys: true)
|
6
|
+
|
7
|
+
# For Rails 3.2.x the json serializer should be explicitly specified, because it is unknown by Rails
|
8
|
+
serialize :old_data, ActiveRecord::Coders::JSON.new(symbolize_keys: true) unless ActiveRecord.respond_to?(:version)
|
6
9
|
end
|
7
10
|
|
8
11
|
class PostQuestions < ActiveRecord::Base
|
@@ -10,36 +13,11 @@ class PostQuestions < ActiveRecord::Base
|
|
10
13
|
end
|
11
14
|
|
12
15
|
describe 'ActiverecordPostgresJson', db: true do
|
13
|
-
before(:all) do
|
14
|
-
ActiveRecord::Schema.define do
|
15
|
-
create_table :posts, force: true do |t|
|
16
|
-
t.column :data, :jsonb
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
Post.reset_column_information
|
21
|
-
|
22
|
-
ActiveRecord::Base.connection.execute <<-SQL
|
23
|
-
CREATE INDEX index_posts_data_gin ON posts
|
24
|
-
USING gin (data);
|
25
|
-
SQL
|
26
|
-
|
27
|
-
ActiveRecord::Base.connection.execute <<-SQL
|
28
|
-
CREATE OR REPLACE VIEW post_questions as
|
29
|
-
SELECT
|
30
|
-
id,
|
31
|
-
data ->> 'title' AS title,
|
32
|
-
data #>> '{author,name}' AS author_name,
|
33
|
-
data #>> '{author,email}' AS author_email,
|
34
|
-
(data ->> 'tags')::jsonb AS tags,
|
35
|
-
(data ->> 'draft')::boolean AS draft
|
36
|
-
FROM posts
|
37
|
-
SQL
|
38
|
-
end
|
39
|
-
|
40
16
|
after(:all) do
|
41
|
-
|
42
|
-
ActiveRecord::Base.connection.execute
|
17
|
+
db_config = YAML.load_file(File.expand_path('../database.yml', __FILE__))
|
18
|
+
ActiveRecord::Base.connection.execute "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'mydb'"
|
19
|
+
ActiveRecord::Base.establish_connection(db_config['test'].merge('database' => 'postgres', 'schema_search_path' => 'public'))
|
20
|
+
ActiveRecord::Base.connection.execute 'DROP DATABASE IF EXISTS ar_postgres_json_test'
|
43
21
|
end
|
44
22
|
|
45
23
|
before { Post.delete_all }
|
@@ -100,4 +78,31 @@ describe 'ActiverecordPostgresJson', db: true do
|
|
100
78
|
it 'when search in objects array' do
|
101
79
|
expect(Post.where('data @> \'[{"f1":6}]\'').count).to eq(1)
|
102
80
|
end
|
81
|
+
|
82
|
+
context 'when the column is of json type' do
|
83
|
+
let!(:plain_json) do
|
84
|
+
Post.create!(data: { title: 'Plain JSON support'},
|
85
|
+
old_data: { title: 'Old JSON is supported too',
|
86
|
+
author: { name: 'Aurel', email: 'aurel@example.com'},
|
87
|
+
draft: true }).reload
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'process plain JSON columns, ' do
|
91
|
+
post = Post.all.to_a[4]
|
92
|
+
|
93
|
+
# Rails 4.0.x and 4.1.x will serialize plain json fields without symbolizing keys with their own serializer
|
94
|
+
if ActiveRecord.respond_to?(:version)
|
95
|
+
if ::ActiveRecord.version >= Gem::Version.new('4.0.0') && ::ActiveRecord.version < Gem::Version.new('4.2.0')
|
96
|
+
expect(post.old_data).to eq({ 'title' => 'Old JSON is supported too',
|
97
|
+
'author' => { 'name' => 'Aurel', 'email' => 'aurel@example.com'},
|
98
|
+
'draft' => true })
|
99
|
+
end
|
100
|
+
# Rails 3.2.x will serialize plain json fields symbolizing keys using this gem
|
101
|
+
elsif ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 2
|
102
|
+
expect(post.old_data).to eq({ title: 'Old JSON is supported too',
|
103
|
+
author: { name: 'Aurel', email: 'aurel@example.com'},
|
104
|
+
draft: true })
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
103
108
|
end
|
@@ -3,16 +3,37 @@ require 'pg'
|
|
3
3
|
require 'yaml'
|
4
4
|
|
5
5
|
db_config = YAML.load_file(File.expand_path('../../database.yml', __FILE__))
|
6
|
+
structure_sql_filename = 'db/ar_postgre_json_test.sql'
|
6
7
|
|
7
8
|
begin
|
8
9
|
ActiveRecord::Base.establish_connection db_config['test']
|
9
10
|
ActiveRecord::Base.connection.active?
|
10
|
-
rescue Exception =>
|
11
|
+
rescue Exception => _e
|
11
12
|
encoding = db_config['test']['encoding'] || ENV['CHARSET'] || 'utf8'
|
12
13
|
begin
|
13
14
|
ActiveRecord::Base.establish_connection(db_config['test'].merge('database' => 'postgres', 'schema_search_path' => 'public'))
|
14
|
-
ActiveRecord::Base.connection.
|
15
|
+
ActiveRecord::Base.connection.recreate_database(db_config['test']['database'], db_config['test'].merge('encoding' => encoding))
|
15
16
|
ActiveRecord::Base.establish_connection(db_config['test'])
|
17
|
+
|
18
|
+
ActiveRecord::Base.configurations = db_config
|
19
|
+
if ActiveRecord.respond_to?(:version)
|
20
|
+
require 'active_record/tasks/database_tasks'
|
21
|
+
|
22
|
+
if ::ActiveRecord.version >= Gem::Version.new('4.1.0') && ::ActiveRecord.version < Gem::Version.new('4.2.0')
|
23
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:sql, structure_sql_filename, 'test')
|
24
|
+
elsif ::ActiveRecord.version >= Gem::Version.new('4.0.0') && ::ActiveRecord.version < Gem::Version.new('4.1.0')
|
25
|
+
ActiveRecord::Tasks::DatabaseTasks.structure_load(db_config['test'], structure_sql_filename)
|
26
|
+
end
|
27
|
+
elsif ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR == 2
|
28
|
+
require "active_record/base"
|
29
|
+
require "rake"
|
30
|
+
require "rake/dsl_definition"
|
31
|
+
load "active_record/railties/databases.rake"
|
32
|
+
|
33
|
+
set_psql_env(db_config)
|
34
|
+
`psql -f "#{structure_sql_filename}" #{db_config['test']['database']}`
|
35
|
+
end
|
36
|
+
|
16
37
|
rescue Exception => ec
|
17
38
|
$stderr.puts ec, *(ec.backtrace)
|
18
39
|
$stderr.puts "Couldn't create database for #{db_config['test'].inspect}"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-postgres-json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roman Shterenzon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-09-
|
11
|
+
date: 2020-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -145,6 +145,7 @@ files:
|
|
145
145
|
- Rakefile
|
146
146
|
- VERSION
|
147
147
|
- activerecord-postgres-json.gemspec
|
148
|
+
- db/ar_postgre_json_test.sql
|
148
149
|
- lib/activerecord-postgres-json.rb
|
149
150
|
- lib/activerecord-postgres-json/activerecord.rb
|
150
151
|
- lib/activerecord-postgres-json/coders.rb
|