neo4apis-activerecord 0.5.3 → 0.6.0
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 +4 -4
- data/Gemfile +1 -0
- data/lib/neo4apis/activerecord.rb +17 -3
- data/lib/neo4apis/cli/activerecord.rb +24 -14
- data/lib/neo4apis/table_resolver.rb +39 -0
- data/neo4apis-activerecord.gemspec +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 580b65a076134da3d58184846112a0f2c3691d62
|
4
|
+
data.tar.gz: 9cb375fca65896d8a0bd1a8f042cd7a98041bb8e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc590521e76c4310d35ad43f93d8e81c3dc8aca85312d823564c15595247a91654fff30e27712771975fb6fde8edad557393bd3ee1e2167364e1a0730cb93bc1
|
7
|
+
data.tar.gz: c868742cd693db9b2fe514209d995dcdf7bbfa295d1a78a25a82d7f778a6dc6868f7290e02a010b305578786d836ece668a6fddc0e83a4a7d47529c41571f60b
|
data/Gemfile
CHANGED
@@ -8,6 +8,7 @@ module Neo4Apis
|
|
8
8
|
batch_size 1000
|
9
9
|
|
10
10
|
def self.model_importer(model_class)
|
11
|
+
return if model_class.primary_key.nil?
|
11
12
|
uuid model_class.name.to_sym, model_class.primary_key
|
12
13
|
|
13
14
|
importer model_class.name.to_sym do |object|
|
@@ -41,12 +42,25 @@ module Neo4Apis
|
|
41
42
|
def add_model_node(model_class, object)
|
42
43
|
object_data = OpenStruct.new
|
43
44
|
|
44
|
-
object.
|
45
|
-
|
46
|
-
object_data.send("#{column}=", v)
|
45
|
+
object.class.column_names.each do |column_name|
|
46
|
+
object_data.send("#{column_name}=", attribute_for_coder(object, column_name))
|
47
47
|
end
|
48
48
|
|
49
49
|
add_node model_class.name.to_sym, object_data, model_class.column_names
|
50
50
|
end
|
51
|
+
|
52
|
+
def attribute_for_coder(object, column_name)
|
53
|
+
column = object.class.columns_hash[column_name]
|
54
|
+
if column.respond_to?(:cast_type)
|
55
|
+
column.cast_type.type_cast_from_user(object.attributes[column_name])
|
56
|
+
else
|
57
|
+
value = object.attributes[column_name]
|
58
|
+
if coder = object.class.serialized_attributes[column_name]
|
59
|
+
coder.dump(value)
|
60
|
+
else
|
61
|
+
value
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
51
65
|
end
|
52
66
|
end
|
@@ -2,10 +2,14 @@ require 'active_record'
|
|
2
2
|
require 'active_support/inflector'
|
3
3
|
require 'thor'
|
4
4
|
require 'colorize'
|
5
|
+
require 'neo4apis/table_resolver'
|
6
|
+
require 'neo4apis/cli/base'
|
5
7
|
|
6
8
|
module Neo4Apis
|
7
9
|
module CLI
|
8
|
-
class ActiveRecord <
|
10
|
+
class ActiveRecord < CLI::Base
|
11
|
+
include TableResolver
|
12
|
+
|
9
13
|
class_option :import_all_associations, type: :boolean, default: false, desc: 'Shortcut for --import-belongs-to --import-has-many --import-has-one'
|
10
14
|
class_option :import_belongs_to, type: :boolean, default: nil
|
11
15
|
class_option :import_has_one, type: :boolean, default: nil
|
@@ -61,7 +65,15 @@ module Neo4Apis
|
|
61
65
|
|
62
66
|
neo4apis_client.batch do
|
63
67
|
model_classes.each do |model_class|
|
64
|
-
model_class.
|
68
|
+
query = model_class.all
|
69
|
+
|
70
|
+
# Eager load association for faster import
|
71
|
+
include_list = model_class.reflect_on_all_associations.map do |association_reflection|
|
72
|
+
association_reflection.name if import_association?(association_reflection.macro)
|
73
|
+
end.compact
|
74
|
+
query = query.includes(*include_list.map(&:to_sym)) if include_list.present?
|
75
|
+
|
76
|
+
query.find_each do |object|
|
65
77
|
neo4apis_client.import model_class.name.to_sym, object
|
66
78
|
end
|
67
79
|
end
|
@@ -101,9 +113,9 @@ module Neo4Apis
|
|
101
113
|
end
|
102
114
|
|
103
115
|
def get_model_class(model_or_table_name)
|
104
|
-
return model_or_table_name if model_or_table_name.ancestors.include?(::ActiveRecord::Base)
|
116
|
+
return model_or_table_name if model_or_table_name.is_a?(Class) && model_or_table_name.ancestors.include?(::ActiveRecord::Base)
|
105
117
|
|
106
|
-
model_class = model_or_table_name
|
118
|
+
model_class = model_or_table_name.gsub(/\s+/, '_')
|
107
119
|
model_class = model_or_table_name.classify unless model_or_table_name.match(/^[A-Z]/)
|
108
120
|
model_class.constantize
|
109
121
|
rescue NameError
|
@@ -116,24 +128,24 @@ module Neo4Apis
|
|
116
128
|
next if not match
|
117
129
|
|
118
130
|
begin
|
119
|
-
base = match[1].tableize
|
131
|
+
base = match[1].gsub(/ +/, '_').tableize
|
120
132
|
|
121
|
-
if
|
133
|
+
if identify_table_name(tables, base.classify) && model_class.name != base.classify
|
122
134
|
model_class.belongs_to base.singularize.to_sym, foreign_key: column.name, class_name: base.classify
|
123
135
|
end
|
124
|
-
rescue
|
136
|
+
rescue UnfoundTableError
|
137
|
+
nil
|
125
138
|
end
|
126
139
|
end
|
127
140
|
end
|
128
141
|
|
129
142
|
def apply_identified_table_name!(model_class)
|
130
|
-
identity =
|
143
|
+
identity = identify_table_name(tables, model_class.name)
|
131
144
|
model_class.table_name = identity if identity
|
132
145
|
end
|
133
146
|
|
134
147
|
def apply_identified_primary_key!(model_class)
|
135
|
-
|
136
|
-
identity = (model_class.column_names & ['id', name.foreign_key, name.foreign_key.classify, 'uuid']).first
|
148
|
+
identity = identify_primary_key(model_class.column_names, model_class.name)
|
137
149
|
model_class.primary_key = identity if identity
|
138
150
|
end
|
139
151
|
|
@@ -143,10 +155,8 @@ module Neo4Apis
|
|
143
155
|
YAML.load(File.read(options[:active_record_config_path]))[options[:active_record_environment]]
|
144
156
|
end
|
145
157
|
|
146
|
-
|
147
|
-
|
148
|
-
def identified_table_name(model_name)
|
149
|
-
(::ActiveRecord::Base.connection.tables & [model_name.tableize, model_name.classify, model_name.tableize.singularize, model_name.classify.pluralize]).first
|
158
|
+
def tables
|
159
|
+
::ActiveRecord::Base.connection.tables
|
150
160
|
end
|
151
161
|
end
|
152
162
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
|
2
|
+
module Neo4Apis
|
3
|
+
module TableResolver
|
4
|
+
class UnfoundTableError < StandardError
|
5
|
+
end
|
6
|
+
|
7
|
+
class UnfoundPrimaryKeyError < StandardError
|
8
|
+
end
|
9
|
+
|
10
|
+
def identify_table_name(tables, class_name)
|
11
|
+
potential_table_comparisons = [class_name.tableize, class_name.tableize.singularize].map(&method(:standardize))
|
12
|
+
tables.detect do |table_name|
|
13
|
+
potential_table_comparisons.include?(standardize(table_name))
|
14
|
+
end.tap do |found_name| # rubocop:disable Style/MultilineBlockChain
|
15
|
+
fail UnfoundTableError, "Could not find a table for #{class_name}." if found_name.nil?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def identify_primary_key(columns, class_name)
|
20
|
+
(columns & %w(id uuid)).first
|
21
|
+
columns.detect do |column|
|
22
|
+
case standardize(column)
|
23
|
+
when 'id', 'uuid'
|
24
|
+
true
|
25
|
+
when /#{standardize(class_name)}id/
|
26
|
+
true
|
27
|
+
end
|
28
|
+
end.tap do |found_key| # rubocop:disable Style/MultilineBlockChain
|
29
|
+
fail UnfoundPrimaryKeyError, "Could not find a primary key for #{class_name}." if found_key.nil?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def standardize(string)
|
36
|
+
string.downcase.gsub(/[ _]+/, '')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: neo4apis-activerecord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Underwood
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: neo4apis
|
@@ -50,6 +50,7 @@ files:
|
|
50
50
|
- lib/neo4apis-activerecord.rb
|
51
51
|
- lib/neo4apis/activerecord.rb
|
52
52
|
- lib/neo4apis/cli/activerecord.rb
|
53
|
+
- lib/neo4apis/table_resolver.rb
|
53
54
|
- neo4apis-activerecord.gemspec
|
54
55
|
homepage: https://github.com/neo4jrb/neo4apis-activerecord/
|
55
56
|
licenses:
|