activerecord-postgres-json 0.1.0 → 0.2.2
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.
- checksums.yaml +5 -5
- data/.rubocop.yml +29 -0
- data/Gemfile +11 -5
- data/README.md +5 -4
- data/VERSION +1 -1
- data/activerecord-postgres-json.gemspec +36 -39
- data/lib/activerecord-postgres-json.rb +5 -1
- data/lib/activerecord-postgres-json/activerecord.rb +70 -30
- data/lib/activerecord-postgres-json/coders.rb +24 -6
- data/spec/activerecord-postgres-json_spec.rb +100 -1
- data/spec/coder_spec.rb +13 -0
- data/spec/database.yml +4 -0
- data/spec/spec_helper.rb +15 -18
- data/spec/support/database_setup.rb +23 -0
- metadata +36 -20
- data/Gemfile.lock +0 -81
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 407ecfb24032a8c34bce6bc34eb02e6ce4845b13ea1d663b41476d8cb59fa3f4
|
4
|
+
data.tar.gz: 1c8e108f8126b9831b20d8f78f2ccac0d00857b4f3c573345d6ebacaa727b43c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f497075d5d89ff8b487d5dd13246cf11ec222d4b681f67b8a48c136f5b3cce4f1fe0edb2bbafe4b6be31630db8e34eca19ad56be72e80eca0415af8542a5329e
|
7
|
+
data.tar.gz: 8061bde4477a992fc2dbac854c2c378f88278eba07c97b531b76f36f3acc70bccd89f75449105a95efbcbceca882a555ffdec4a7eb14178a00674afcb9d36df0
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
LineLength:
|
2
|
+
Max: 200
|
3
|
+
|
4
|
+
HashSyntax:
|
5
|
+
EnforcedStyle: ruby19
|
6
|
+
|
7
|
+
Layout/SpaceBeforeFirstArg:
|
8
|
+
Enabled: false
|
9
|
+
|
10
|
+
Metrics/AbcSize:
|
11
|
+
Max: 26
|
12
|
+
|
13
|
+
Style/Documentation:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
Metrics/ClassLength:
|
17
|
+
Max: 150
|
18
|
+
|
19
|
+
Metrics/MethodLength:
|
20
|
+
Max: 20
|
21
|
+
|
22
|
+
Naming/FileName:
|
23
|
+
Enabled: false
|
24
|
+
|
25
|
+
AllCops:
|
26
|
+
Exclude:
|
27
|
+
- '**/*.gemspec'
|
28
|
+
- 'spec/**/*'
|
29
|
+
- '**/Rakefile'
|
data/Gemfile
CHANGED
@@ -1,12 +1,18 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
source 'https://rubygems.org'
|
4
|
+
|
5
|
+
gem 'activerecord', '>= 3.2', '< 4.2'
|
4
6
|
gem 'multi_json'
|
5
|
-
gem 'hashie'
|
6
7
|
|
7
|
-
group :development do
|
8
|
+
group :development, :test do
|
9
|
+
gem 'pg', '~> 0.20.0'
|
8
10
|
gem 'rspec'
|
9
|
-
|
11
|
+
end
|
12
|
+
|
13
|
+
group :development do
|
10
14
|
gem 'bundler'
|
11
15
|
gem 'jeweler'
|
16
|
+
gem 'rdoc'
|
17
|
+
gem 'rubocop'
|
12
18
|
end
|
data/README.md
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
# activerecord-postgres-json
|
2
2
|
|
3
|
-
A minimal JSON column type support for ActiveRecord 3.2.x
|
3
|
+
A minimal JSON/JSONB column type support for ActiveRecord 3.2.x
|
4
4
|
This gem adds the following support:
|
5
5
|
|
6
|
-
1. Using json column type in migrations, e.g. `add_column :foo, :bar, :json`
|
6
|
+
1. Using json/jsonb column type in migrations, e.g. `add_column :foo, :bar, :json` or `add_column :foo, :bar, :jsonb`
|
7
7
|
2. json field support in the schema definitions
|
8
8
|
3. JSON coder for using with the `serialize` class method:
|
9
9
|
|
10
10
|
```ruby
|
11
11
|
class User < ActiveRecord::Base
|
12
12
|
serialize :settings, ActiveRecord::Coders::JSON
|
13
|
+
serialize :settings, ActiveRecord::Coders::JSON.new(symbolize_keys: true) # for symbolize keys
|
13
14
|
end
|
14
15
|
|
15
|
-
User.first.settings.class # =>
|
16
|
-
User.first.settings
|
16
|
+
User.first.settings.class # => Hash
|
17
|
+
User.first.settings[:show_popups] # => true
|
17
18
|
...
|
18
19
|
```
|
19
20
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.2
|
@@ -2,18 +2,18 @@
|
|
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.
|
5
|
+
# stub: activerecord-postgres-json 0.2.2 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
|
-
s.name = "activerecord-postgres-json"
|
9
|
-
s.version = "0.
|
8
|
+
s.name = "activerecord-postgres-json".freeze
|
9
|
+
s.version = "0.2.2"
|
10
10
|
|
11
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
-
s.require_paths = ["lib"]
|
13
|
-
s.authors = ["Roman Shterenzon"]
|
14
|
-
s.date = "
|
15
|
-
s.description = "Active Record support for PostgreSQL JSON type"
|
16
|
-
s.email = "romanbsd@yahoo.com"
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib".freeze]
|
13
|
+
s.authors = ["Roman Shterenzon".freeze]
|
14
|
+
s.date = "2020-09-14"
|
15
|
+
s.description = "Active Record support for PostgreSQL JSON type".freeze
|
16
|
+
s.email = "romanbsd@yahoo.com".freeze
|
17
17
|
s.extra_rdoc_files = [
|
18
18
|
"LICENSE.txt",
|
19
19
|
"README.md"
|
@@ -21,8 +21,8 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.files = [
|
22
22
|
".document",
|
23
23
|
".rspec",
|
24
|
+
".rubocop.yml",
|
24
25
|
"Gemfile",
|
25
|
-
"Gemfile.lock",
|
26
26
|
"LICENSE.txt",
|
27
27
|
"README.md",
|
28
28
|
"Rakefile",
|
@@ -32,41 +32,38 @@ Gem::Specification.new do |s|
|
|
32
32
|
"lib/activerecord-postgres-json/activerecord.rb",
|
33
33
|
"lib/activerecord-postgres-json/coders.rb",
|
34
34
|
"spec/activerecord-postgres-json_spec.rb",
|
35
|
-
"spec/
|
35
|
+
"spec/coder_spec.rb",
|
36
|
+
"spec/database.yml",
|
37
|
+
"spec/spec_helper.rb",
|
38
|
+
"spec/support/database_setup.rb"
|
36
39
|
]
|
37
|
-
s.homepage = "http://github.com/romanbsd/activerecord-postgres-json"
|
38
|
-
s.licenses = ["MIT"]
|
39
|
-
s.rubygems_version = "
|
40
|
-
s.summary = "Active Record support for PostgreSQL JSON type"
|
40
|
+
s.homepage = "http://github.com/romanbsd/activerecord-postgres-json".freeze
|
41
|
+
s.licenses = ["MIT".freeze]
|
42
|
+
s.rubygems_version = "3.1.2".freeze
|
43
|
+
s.summary = "Active Record support for PostgreSQL JSON type".freeze
|
41
44
|
|
42
45
|
if s.respond_to? :specification_version then
|
43
46
|
s.specification_version = 4
|
47
|
+
end
|
44
48
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
s.add_dependency(%q<activerecord>, ["< 4", ">= 3.2"])
|
55
|
-
s.add_dependency(%q<multi_json>, [">= 0"])
|
56
|
-
s.add_dependency(%q<hashie>, [">= 0"])
|
57
|
-
s.add_dependency(%q<rspec>, [">= 0"])
|
58
|
-
s.add_dependency(%q<rdoc>, [">= 0"])
|
59
|
-
s.add_dependency(%q<bundler>, [">= 0"])
|
60
|
-
s.add_dependency(%q<jeweler>, [">= 0"])
|
61
|
-
end
|
49
|
+
if s.respond_to? :add_runtime_dependency then
|
50
|
+
s.add_runtime_dependency(%q<activerecord>.freeze, [">= 3.2", "< 4.2"])
|
51
|
+
s.add_runtime_dependency(%q<multi_json>.freeze, [">= 0"])
|
52
|
+
s.add_development_dependency(%q<pg>.freeze, ["~> 0.20.0"])
|
53
|
+
s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
|
54
|
+
s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
|
55
|
+
s.add_development_dependency(%q<jeweler>.freeze, [">= 0"])
|
56
|
+
s.add_development_dependency(%q<rdoc>.freeze, [">= 0"])
|
57
|
+
s.add_development_dependency(%q<rubocop>.freeze, [">= 0"])
|
62
58
|
else
|
63
|
-
s.add_dependency(%q<activerecord
|
64
|
-
s.add_dependency(%q<multi_json
|
65
|
-
s.add_dependency(%q<
|
66
|
-
s.add_dependency(%q<rspec
|
67
|
-
s.add_dependency(%q<
|
68
|
-
s.add_dependency(%q<
|
69
|
-
s.add_dependency(%q<
|
59
|
+
s.add_dependency(%q<activerecord>.freeze, [">= 3.2", "< 4.2"])
|
60
|
+
s.add_dependency(%q<multi_json>.freeze, [">= 0"])
|
61
|
+
s.add_dependency(%q<pg>.freeze, ["~> 0.20.0"])
|
62
|
+
s.add_dependency(%q<rspec>.freeze, [">= 0"])
|
63
|
+
s.add_dependency(%q<bundler>.freeze, [">= 0"])
|
64
|
+
s.add_dependency(%q<jeweler>.freeze, [">= 0"])
|
65
|
+
s.add_dependency(%q<rdoc>.freeze, [">= 0"])
|
66
|
+
s.add_dependency(%q<rubocop>.freeze, [">= 0"])
|
70
67
|
end
|
71
68
|
end
|
72
69
|
|
@@ -1,50 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_record'
|
2
4
|
require 'active_record/connection_adapters/postgresql_adapter'
|
3
5
|
|
4
6
|
module ActiveRecord
|
5
|
-
|
6
7
|
module ConnectionAdapters
|
7
|
-
PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:json]
|
8
|
+
PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:json] = { name: 'json' }
|
9
|
+
PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:jsonb] = { name: 'jsonb' }
|
10
|
+
|
11
|
+
if ::ActiveRecord.version >= Gem::Version.new('4.0.0')
|
12
|
+
# As suggested here: http://www.innovationontherun.com/fixing-unknown-oid-geography-errors-with-postgis-and-rails-4-0/
|
13
|
+
# to prevent the Rails 4.0/4.1 error of
|
14
|
+
# "unknown OID: {field}"
|
15
|
+
PostgreSQLAdapter::OID.register_type('json', PostgreSQLAdapter::OID::Identity.new)
|
16
|
+
PostgreSQLAdapter::OID.register_type('jsonb', PostgreSQLAdapter::OID::Identity.new)
|
17
|
+
end
|
8
18
|
|
9
19
|
class PostgreSQLColumn < Column
|
10
20
|
# Adds the json type for the column.
|
11
21
|
def simplified_type_with_json(field_type)
|
12
|
-
|
22
|
+
case field_type
|
23
|
+
when 'json'
|
24
|
+
:json
|
25
|
+
when 'jsonb'
|
26
|
+
:jsonb
|
27
|
+
else
|
28
|
+
simplified_type_without_json(field_type)
|
29
|
+
end
|
13
30
|
end
|
14
31
|
|
15
32
|
alias_method_chain :simplified_type, :json
|
33
|
+
|
34
|
+
class << self
|
35
|
+
def extract_value_from_default_with_json(default)
|
36
|
+
case default
|
37
|
+
when "'{}'::json", "'{}'::jsonb"
|
38
|
+
'{}'
|
39
|
+
when "'[]'::json", "'[]'::jsonb"
|
40
|
+
'[]'
|
41
|
+
else
|
42
|
+
extract_value_from_default_without_json(default)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
alias_method_chain :extract_value_from_default, :json
|
47
|
+
end
|
16
48
|
end
|
17
|
-
end
|
18
49
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
50
|
+
class TableDefinition
|
51
|
+
# Adds json type for migrations. So you can add columns to a table like:
|
52
|
+
# create_table :people do |t|
|
53
|
+
# ...
|
54
|
+
# t.json :info
|
55
|
+
# ...
|
56
|
+
# end
|
57
|
+
def json(*args)
|
58
|
+
options = args.extract_options!
|
59
|
+
column_names = args
|
60
|
+
column_names.each { |name| column(name, 'json', options) }
|
61
|
+
end
|
62
|
+
|
63
|
+
def jsonb(*args)
|
64
|
+
options = args.extract_options!
|
65
|
+
column_names = args
|
66
|
+
column_names.each { |name| column(name, 'jsonb', options) }
|
67
|
+
end
|
31
68
|
end
|
32
69
|
|
33
|
-
|
70
|
+
class Table
|
71
|
+
# Adds json type for migrations. So you can add columns to a table like:
|
72
|
+
# change_table :people do |t|
|
73
|
+
# ...
|
74
|
+
# t.json :info
|
75
|
+
# ...
|
76
|
+
# end
|
77
|
+
def json(*args)
|
78
|
+
options = args.extract_options!
|
79
|
+
column_names = args
|
80
|
+
column_names.each { |name| column(name, 'json', options) }
|
81
|
+
end
|
34
82
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
# t.json :info
|
41
|
-
# ...
|
42
|
-
# end
|
43
|
-
def json(*args)
|
44
|
-
options = args.extract_options!
|
45
|
-
column_names = args
|
46
|
-
column_names.each { |name| column(name, 'json', options) }
|
83
|
+
def jsonb(*args)
|
84
|
+
options = args.extract_options!
|
85
|
+
column_names = args
|
86
|
+
column_names.each { |name| column(name, 'jsonb', options) }
|
87
|
+
end
|
47
88
|
end
|
48
89
|
end
|
49
|
-
|
50
90
|
end
|
@@ -1,5 +1,6 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'multi_json'
|
2
|
-
require 'hashie'
|
3
4
|
|
4
5
|
module ActiveRecord
|
5
6
|
module Coders
|
@@ -12,12 +13,20 @@ module ActiveRecord
|
|
12
13
|
new.dump(json)
|
13
14
|
end
|
14
15
|
|
15
|
-
def initialize(
|
16
|
-
@default =
|
16
|
+
def initialize(params = {})
|
17
|
+
@default = {}
|
18
|
+
return unless params.class.name == 'Hash'
|
19
|
+
|
20
|
+
@default = params[:default] if params[:default]
|
21
|
+
@symbolize_keys = params[:symbolize_keys] if params[:symbolize_keys]
|
17
22
|
end
|
18
23
|
|
19
24
|
def dump(obj)
|
20
|
-
obj.nil?
|
25
|
+
if obj.nil?
|
26
|
+
@default.nil? ? nil : to_json(@default)
|
27
|
+
else
|
28
|
+
to_json(obj)
|
29
|
+
end
|
21
30
|
end
|
22
31
|
|
23
32
|
def load(json)
|
@@ -25,13 +34,22 @@ module ActiveRecord
|
|
25
34
|
end
|
26
35
|
|
27
36
|
private
|
37
|
+
|
28
38
|
def to_json(obj)
|
29
39
|
MultiJson.dump(obj)
|
30
40
|
end
|
31
41
|
|
32
|
-
# FIXME: support arrays
|
33
42
|
def from_json(json)
|
34
|
-
|
43
|
+
convert_object MultiJson.load(json, symbolize_keys: @symbolize_keys)
|
44
|
+
end
|
45
|
+
|
46
|
+
def convert_object(obj)
|
47
|
+
case obj
|
48
|
+
when Array
|
49
|
+
obj.map { |member| convert_object(member) }
|
50
|
+
else
|
51
|
+
obj
|
52
|
+
end
|
35
53
|
end
|
36
54
|
end
|
37
55
|
end
|
@@ -1,4 +1,103 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/support/database_setup')
|
2
3
|
|
3
|
-
|
4
|
+
class Post < ActiveRecord::Base
|
5
|
+
serialize :data, ActiveRecord::Coders::JSON.new(symbolize_keys: true)
|
6
|
+
end
|
7
|
+
|
8
|
+
class PostQuestions < ActiveRecord::Base
|
9
|
+
serialize :tags, ActiveRecord::Coders::JSON
|
10
|
+
end
|
11
|
+
|
12
|
+
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
|
+
after(:all) do
|
41
|
+
ActiveRecord::Base.connection.execute 'DROP INDEX IF EXISTS index_posts_data_gin'
|
42
|
+
ActiveRecord::Base.connection.execute 'DROP VIEW IF EXISTS post_questions'
|
43
|
+
end
|
44
|
+
|
45
|
+
before { Post.delete_all }
|
46
|
+
|
47
|
+
let!(:hdd) do
|
48
|
+
Post.create!(data: [
|
49
|
+
{f1: 6, f2: 5, value: true, intencity: 2.0},
|
50
|
+
{f1: 9, f2: 3, value: false, intencity: 1.0}
|
51
|
+
]).reload
|
52
|
+
end
|
53
|
+
|
54
|
+
let!(:tdd) do
|
55
|
+
Post.create!(data: [
|
56
|
+
{f1: 1, f2: 2, value: false, intencity: 2.0},
|
57
|
+
{f1: 1, f2: 4, value: true, intencity: 1.0}
|
58
|
+
]).reload
|
59
|
+
end
|
60
|
+
|
61
|
+
let!(:bdd) do
|
62
|
+
Post.create!(data: {
|
63
|
+
title: 'BDD is woot',
|
64
|
+
author: { name: 'Philippe', email: 'philippe@example.com'},
|
65
|
+
tags: ['bdd', 'testing', 'woot', true],
|
66
|
+
word_count: 42
|
67
|
+
}).reload
|
68
|
+
end
|
69
|
+
|
70
|
+
let!(:foo) do
|
71
|
+
Post.create!(data: {
|
72
|
+
title: 'FOO is bar',
|
73
|
+
author: { name: 'Philippe', email: 'philippe@example.com'},
|
74
|
+
tags: ['foo', 'bar', 42],
|
75
|
+
draft: true
|
76
|
+
}).reload
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'maps fields' do
|
80
|
+
post = PostQuestions.find_by_title! 'FOO is bar'
|
81
|
+
expect(post.author_name).to eq('Philippe')
|
82
|
+
expect(post.author_email).to eq('philippe@example.com')
|
83
|
+
expect(post.tags).to eq ['foo', 'bar', 42]
|
84
|
+
expect(post).to be_draft
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'provides search as if it was a good old table' do
|
88
|
+
expect(PostQuestions.where(author_name: 'Philippe').pluck(:title)).to eq ['BDD is woot', 'FOO is bar']
|
89
|
+
expect(PostQuestions.where(draft: true).count).to eq(1)
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'when retrieve objects as array' do
|
93
|
+
expect(Post.where('data @> \'[{"f1":1}]\'').first.data)
|
94
|
+
.to eq [
|
95
|
+
{f1: 1, f2: 2, value: false, intencity: 2.0},
|
96
|
+
{f1: 1, f2: 4, value: true, intencity: 1.0}
|
97
|
+
]
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'when search in objects array' do
|
101
|
+
expect(Post.where('data @> \'[{"f1":6}]\'').count).to eq(1)
|
102
|
+
end
|
4
103
|
end
|
data/spec/coder_spec.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActiveRecord::Coders::JSON do
|
4
|
+
it 'converts hashes' do
|
5
|
+
res = described_class.load('{"foo":"bar", "bar":[1,2]}')
|
6
|
+
expect(res).to eq('foo' => 'bar', 'bar' => [1,2])
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'converts arrays' do
|
10
|
+
res = described_class.load('[{"foo":"bar"}, [{"bar":"baz"}], [[1,2],{"baz":"foo"}]]')
|
11
|
+
expect(res).to eq([{'foo' => 'bar'}, [{'bar' => 'baz'}], [[1,2], {'baz' => 'foo'}]])
|
12
|
+
end
|
13
|
+
end
|
data/spec/database.yml
ADDED
data/spec/spec_helper.rb
CHANGED
@@ -1,29 +1,26 @@
|
|
1
|
-
require 'simplecov'
|
2
|
-
|
3
|
-
module SimpleCov::Configuration
|
4
|
-
def clean_filters
|
5
|
-
@filters = []
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
SimpleCov.configure do
|
10
|
-
clean_filters
|
11
|
-
load_adapter 'test_frameworks'
|
12
|
-
end
|
13
|
-
|
14
|
-
ENV["COVERAGE"] && SimpleCov.start do
|
15
|
-
add_filter "/.rvm/"
|
16
|
-
end
|
17
1
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
18
2
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
19
3
|
|
20
4
|
require 'rspec'
|
5
|
+
require 'active_record'
|
21
6
|
require 'activerecord-postgres-json'
|
22
7
|
|
23
8
|
# Requires supporting files with custom matchers and macros, etc,
|
24
9
|
# in ./support/ and its subdirectories.
|
25
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
10
|
+
# Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
26
11
|
|
27
12
|
RSpec.configure do |config|
|
28
|
-
|
13
|
+
config.around db: true do |example|
|
14
|
+
if example.metadata[:disable_transactions]
|
15
|
+
example.call
|
16
|
+
else
|
17
|
+
ActiveRecord::Base.transaction do
|
18
|
+
begin
|
19
|
+
example.call
|
20
|
+
ensure
|
21
|
+
raise ActiveRecord::Rollback
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
29
26
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'pg'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
db_config = YAML.load_file(File.expand_path('../../database.yml', __FILE__))
|
6
|
+
|
7
|
+
begin
|
8
|
+
ActiveRecord::Base.establish_connection db_config['test']
|
9
|
+
ActiveRecord::Base.connection.active?
|
10
|
+
rescue Exception => e
|
11
|
+
encoding = db_config['test']['encoding'] || ENV['CHARSET'] || 'utf8'
|
12
|
+
begin
|
13
|
+
ActiveRecord::Base.establish_connection(db_config['test'].merge('database' => 'postgres', 'schema_search_path' => 'public'))
|
14
|
+
ActiveRecord::Base.connection.create_database(db_config['test']['database'], db_config['test'].merge('encoding' => encoding))
|
15
|
+
ActiveRecord::Base.establish_connection(db_config['test'])
|
16
|
+
rescue Exception => ec
|
17
|
+
$stderr.puts ec, *(ec.backtrace)
|
18
|
+
$stderr.puts "Couldn't create database for #{db_config['test'].inspect}"
|
19
|
+
end
|
20
|
+
ensure
|
21
|
+
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
22
|
+
ActiveRecord::Base.logger.formatter = ->(_, _, _, msg) { "#{msg}\n" }
|
23
|
+
end
|
metadata
CHANGED
@@ -1,35 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-postgres-json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roman Shterenzon
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-09-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "<"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '4'
|
20
17
|
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: '3.2'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '4.2'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
-
- - "<"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '4'
|
30
27
|
- - ">="
|
31
28
|
- !ruby/object:Gem::Version
|
32
29
|
version: '3.2'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '4.2'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: multi_json
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -45,13 +45,27 @@ dependencies:
|
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '0'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
48
|
+
name: pg
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.20.0
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 0.20.0
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rspec
|
49
63
|
requirement: !ruby/object:Gem::Requirement
|
50
64
|
requirements:
|
51
65
|
- - ">="
|
52
66
|
- !ruby/object:Gem::Version
|
53
67
|
version: '0'
|
54
|
-
type: :
|
68
|
+
type: :development
|
55
69
|
prerelease: false
|
56
70
|
version_requirements: !ruby/object:Gem::Requirement
|
57
71
|
requirements:
|
@@ -59,7 +73,7 @@ dependencies:
|
|
59
73
|
- !ruby/object:Gem::Version
|
60
74
|
version: '0'
|
61
75
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
76
|
+
name: bundler
|
63
77
|
requirement: !ruby/object:Gem::Requirement
|
64
78
|
requirements:
|
65
79
|
- - ">="
|
@@ -73,7 +87,7 @@ dependencies:
|
|
73
87
|
- !ruby/object:Gem::Version
|
74
88
|
version: '0'
|
75
89
|
- !ruby/object:Gem::Dependency
|
76
|
-
name:
|
90
|
+
name: jeweler
|
77
91
|
requirement: !ruby/object:Gem::Requirement
|
78
92
|
requirements:
|
79
93
|
- - ">="
|
@@ -87,7 +101,7 @@ dependencies:
|
|
87
101
|
- !ruby/object:Gem::Version
|
88
102
|
version: '0'
|
89
103
|
- !ruby/object:Gem::Dependency
|
90
|
-
name:
|
104
|
+
name: rdoc
|
91
105
|
requirement: !ruby/object:Gem::Requirement
|
92
106
|
requirements:
|
93
107
|
- - ">="
|
@@ -101,7 +115,7 @@ dependencies:
|
|
101
115
|
- !ruby/object:Gem::Version
|
102
116
|
version: '0'
|
103
117
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
118
|
+
name: rubocop
|
105
119
|
requirement: !ruby/object:Gem::Requirement
|
106
120
|
requirements:
|
107
121
|
- - ">="
|
@@ -124,8 +138,8 @@ extra_rdoc_files:
|
|
124
138
|
files:
|
125
139
|
- ".document"
|
126
140
|
- ".rspec"
|
141
|
+
- ".rubocop.yml"
|
127
142
|
- Gemfile
|
128
|
-
- Gemfile.lock
|
129
143
|
- LICENSE.txt
|
130
144
|
- README.md
|
131
145
|
- Rakefile
|
@@ -135,12 +149,15 @@ files:
|
|
135
149
|
- lib/activerecord-postgres-json/activerecord.rb
|
136
150
|
- lib/activerecord-postgres-json/coders.rb
|
137
151
|
- spec/activerecord-postgres-json_spec.rb
|
152
|
+
- spec/coder_spec.rb
|
153
|
+
- spec/database.yml
|
138
154
|
- spec/spec_helper.rb
|
155
|
+
- spec/support/database_setup.rb
|
139
156
|
homepage: http://github.com/romanbsd/activerecord-postgres-json
|
140
157
|
licenses:
|
141
158
|
- MIT
|
142
159
|
metadata: {}
|
143
|
-
post_install_message:
|
160
|
+
post_install_message:
|
144
161
|
rdoc_options: []
|
145
162
|
require_paths:
|
146
163
|
- lib
|
@@ -155,9 +172,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
155
172
|
- !ruby/object:Gem::Version
|
156
173
|
version: '0'
|
157
174
|
requirements: []
|
158
|
-
|
159
|
-
|
160
|
-
signing_key:
|
175
|
+
rubygems_version: 3.1.2
|
176
|
+
signing_key:
|
161
177
|
specification_version: 4
|
162
178
|
summary: Active Record support for PostgreSQL JSON type
|
163
179
|
test_files: []
|
data/Gemfile.lock
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: http://rubygems.org/
|
3
|
-
specs:
|
4
|
-
activemodel (3.2.18)
|
5
|
-
activesupport (= 3.2.18)
|
6
|
-
builder (~> 3.0.0)
|
7
|
-
activerecord (3.2.18)
|
8
|
-
activemodel (= 3.2.18)
|
9
|
-
activesupport (= 3.2.18)
|
10
|
-
arel (~> 3.0.2)
|
11
|
-
tzinfo (~> 0.3.29)
|
12
|
-
activesupport (3.2.18)
|
13
|
-
i18n (~> 0.6, >= 0.6.4)
|
14
|
-
multi_json (~> 1.0)
|
15
|
-
addressable (2.3.6)
|
16
|
-
arel (3.0.3)
|
17
|
-
builder (3.0.4)
|
18
|
-
descendants_tracker (0.0.4)
|
19
|
-
thread_safe (~> 0.3, >= 0.3.1)
|
20
|
-
diff-lcs (1.2.5)
|
21
|
-
faraday (0.9.0)
|
22
|
-
multipart-post (>= 1.2, < 3)
|
23
|
-
git (1.2.6)
|
24
|
-
github_api (0.11.3)
|
25
|
-
addressable (~> 2.3)
|
26
|
-
descendants_tracker (~> 0.0.1)
|
27
|
-
faraday (~> 0.8, < 0.10)
|
28
|
-
hashie (>= 1.2)
|
29
|
-
multi_json (>= 1.7.5, < 2.0)
|
30
|
-
nokogiri (~> 1.6.0)
|
31
|
-
oauth2
|
32
|
-
hashie (2.1.1)
|
33
|
-
highline (1.6.21)
|
34
|
-
i18n (0.6.9)
|
35
|
-
jeweler (2.0.1)
|
36
|
-
builder
|
37
|
-
bundler (>= 1.0)
|
38
|
-
git (>= 1.2.5)
|
39
|
-
github_api
|
40
|
-
highline (>= 1.6.15)
|
41
|
-
nokogiri (>= 1.5.10)
|
42
|
-
rake
|
43
|
-
rdoc
|
44
|
-
jwt (1.0.0)
|
45
|
-
mini_portile (0.6.0)
|
46
|
-
multi_json (1.10.1)
|
47
|
-
multi_xml (0.5.5)
|
48
|
-
multipart-post (2.0.0)
|
49
|
-
nokogiri (1.6.2.1)
|
50
|
-
mini_portile (= 0.6.0)
|
51
|
-
oauth2 (0.9.4)
|
52
|
-
faraday (>= 0.8, < 0.10)
|
53
|
-
jwt (~> 1.0)
|
54
|
-
multi_json (~> 1.3)
|
55
|
-
multi_xml (~> 0.5)
|
56
|
-
rack (~> 1.2)
|
57
|
-
rack (1.5.2)
|
58
|
-
rake (10.3.2)
|
59
|
-
rdoc (4.1.0)
|
60
|
-
rspec (2.14.1)
|
61
|
-
rspec-core (~> 2.14.0)
|
62
|
-
rspec-expectations (~> 2.14.0)
|
63
|
-
rspec-mocks (~> 2.14.0)
|
64
|
-
rspec-core (2.14.8)
|
65
|
-
rspec-expectations (2.14.5)
|
66
|
-
diff-lcs (>= 1.1.3, < 2.0)
|
67
|
-
rspec-mocks (2.14.6)
|
68
|
-
thread_safe (0.3.4)
|
69
|
-
tzinfo (0.3.39)
|
70
|
-
|
71
|
-
PLATFORMS
|
72
|
-
ruby
|
73
|
-
|
74
|
-
DEPENDENCIES
|
75
|
-
activerecord (>= 3.2, < 4)
|
76
|
-
bundler
|
77
|
-
hashie
|
78
|
-
jeweler
|
79
|
-
multi_json
|
80
|
-
rdoc
|
81
|
-
rspec
|