cdq 0.1.8 → 0.1.9
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 +8 -8
- data/lib/cdq/generators.rb +2 -1
- data/lib/cdq/version.rb +1 -1
- data/motion/cdq.rb +3 -1
- data/motion/cdq/config.rb +19 -3
- data/motion/cdq/relationship_query.rb +18 -6
- data/motion/cdq/store.rb +12 -0
- data/motion/cdq/targeted_query.rb +5 -36
- data/motion/managed_object.rb +69 -8
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
!binary "U0hBMQ==":
|
|
3
3
|
metadata.gz: !binary |-
|
|
4
|
-
|
|
4
|
+
YTZiZDlhMzI5ODBiZWVmYjYyZWViNDA4YzhhODMyZDEwOTRlOWUyYQ==
|
|
5
5
|
data.tar.gz: !binary |-
|
|
6
|
-
|
|
6
|
+
MzBmOGI2MGQxY2RjYzFlZGNkMDdlNzg4NDc5MTAxY2QxZWIwODkzOA==
|
|
7
7
|
SHA512:
|
|
8
8
|
metadata.gz: !binary |-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
MGUxZDhiODMyYjE5NjlkMzc1YTJjMTc0Mzg2MDc4NjhhNDAxOTk5OTRhMzg3
|
|
10
|
+
MWU0NGVjODUyZDAzODNlZDlkYTllNTRhMjBmYzQ0Y2Q5ODBjYWU5MDFhNzVk
|
|
11
|
+
MzEyMGFiNDQ2ODAyNjhiODBkZWI4YmUxNWRmOWNhYzhkYzBmZmU=
|
|
12
12
|
data.tar.gz: !binary |-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
ZjUwMmNlMzdjM2VkYjU2MWQyMzk1ZmY1ZTRiNWJiZDllYTZiZjJmM2Y0MDE1
|
|
14
|
+
NmFlMTIyZTU4M2I2ZGY4NDljOTY2NTk4MWU4NzRmZGJjMmI4NjAxNDU4YjU5
|
|
15
|
+
NDRmNDdlNDZkZDRmMjk1Mzc0OGNmMzZjZWE3OTY4MmM5M2Q5NzY=
|
data/lib/cdq/generators.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
|
|
2
|
+
require 'fileutils'
|
|
2
3
|
|
|
3
4
|
module CDQ
|
|
4
5
|
class Generator
|
|
@@ -57,7 +58,7 @@ module CDQ
|
|
|
57
58
|
puts " Using existing directory: #{@in_app_path}"
|
|
58
59
|
else
|
|
59
60
|
puts " \u0394 Creating directory: #{@in_app_path}"
|
|
60
|
-
|
|
61
|
+
FileUtils.mkdir_p(@in_app_path) unless @dry_run
|
|
61
62
|
end
|
|
62
63
|
|
|
63
64
|
results = load_and_parse_erb(template_file_path_and_name)
|
data/lib/cdq/version.rb
CHANGED
data/motion/cdq.rb
CHANGED
|
@@ -51,7 +51,9 @@ module CDQ
|
|
|
51
51
|
case obj
|
|
52
52
|
when Class
|
|
53
53
|
if obj.isSubclassOfClass(NSManagedObject)
|
|
54
|
-
entity_description =
|
|
54
|
+
entity_description =
|
|
55
|
+
@@base_object.models.current.entitiesByName[obj.name] ||
|
|
56
|
+
@@base_object.models.current.entitiesByName[obj.ancestors[1].name]
|
|
55
57
|
if entity_description.nil?
|
|
56
58
|
raise "Cannot find an entity named #{obj.name}"
|
|
57
59
|
end
|
data/motion/cdq/config.rb
CHANGED
|
@@ -9,7 +9,8 @@ module CDQ
|
|
|
9
9
|
# root of your resources directory. It supports the following top-level keys:
|
|
10
10
|
#
|
|
11
11
|
# [name] The root name for both database and model
|
|
12
|
-
# [
|
|
12
|
+
# [database_dir] The root name for the database directory (NSDocumentDirectory or NSApplicationSupportDirectory)
|
|
13
|
+
# [database_name] The root name for the database file (relative to the database_dir)
|
|
13
14
|
# [model_name] The root name for the model file (relative to the bundle directory)
|
|
14
15
|
#
|
|
15
16
|
# Using the config file is not necessary. If you do not include it, the bundle display name
|
|
@@ -21,7 +22,7 @@ module CDQ
|
|
|
21
22
|
#
|
|
22
23
|
class CDQConfig
|
|
23
24
|
|
|
24
|
-
attr_reader :config_file, :database_name, :model_name, :name
|
|
25
|
+
attr_reader :config_file, :database_name, :database_dir, :model_name, :name
|
|
25
26
|
|
|
26
27
|
def initialize(config_file)
|
|
27
28
|
case config_file
|
|
@@ -39,12 +40,13 @@ module CDQ
|
|
|
39
40
|
end
|
|
40
41
|
|
|
41
42
|
@name = h['name'] || h[:name] || NSBundle.mainBundle.objectForInfoDictionaryKey("CFBundleDisplayName")
|
|
43
|
+
@database_dir = search_directory_for h['database_dir'] || h[:database_dir]
|
|
42
44
|
@database_name = h['database_name'] || h[:database_name] || name
|
|
43
45
|
@model_name = h['model_name'] || h[:model_name] || name
|
|
44
46
|
end
|
|
45
47
|
|
|
46
48
|
def database_url
|
|
47
|
-
dir = NSSearchPathForDirectoriesInDomains(
|
|
49
|
+
dir = NSSearchPathForDirectoriesInDomains(database_dir, NSUserDomainMask, true).last
|
|
48
50
|
path = File.join(dir, database_name + '.sqlite')
|
|
49
51
|
NSURL.fileURLWithPath(path)
|
|
50
52
|
end
|
|
@@ -60,6 +62,20 @@ module CDQ
|
|
|
60
62
|
new(cf_file)
|
|
61
63
|
end
|
|
62
64
|
end
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
|
|
69
|
+
def search_directory_for dir_name
|
|
70
|
+
supported_dirs = {
|
|
71
|
+
"NSDocumentDirectory" => NSDocumentDirectory,
|
|
72
|
+
:NSDocumentDirectory => NSDocumentDirectory,
|
|
73
|
+
"NSApplicationSupportDirectory" => NSApplicationSupportDirectory,
|
|
74
|
+
:NSApplicationSupportDirectory => NSApplicationSupportDirectory,
|
|
75
|
+
}
|
|
76
|
+
supported_dirs[dir_name] || NSDocumentDirectory
|
|
77
|
+
end
|
|
78
|
+
|
|
63
79
|
end
|
|
64
80
|
|
|
65
81
|
end
|
|
@@ -6,8 +6,15 @@ module CDQ
|
|
|
6
6
|
def initialize(owner, name, set = nil, opts = {})
|
|
7
7
|
@owner = owner
|
|
8
8
|
@relationship_name = name
|
|
9
|
-
@set = set
|
|
9
|
+
@set = set
|
|
10
10
|
relationship = owner.entity.relationshipsByName[name]
|
|
11
|
+
if relationship.isToMany
|
|
12
|
+
if @owner.ordered_set?(name)
|
|
13
|
+
@set ||= @owner.mutableOrderedSetValueForKey(name)
|
|
14
|
+
else
|
|
15
|
+
@set ||= @owner.mutableSetValueForKey(name)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
11
18
|
@inverse_rel = relationship.inverseRelationship
|
|
12
19
|
entity_description = relationship.destinationEntity
|
|
13
20
|
target_class = constantize(entity_description.managedObjectClassName)
|
|
@@ -30,15 +37,16 @@ module CDQ
|
|
|
30
37
|
# Add an existing object to the relationship
|
|
31
38
|
#
|
|
32
39
|
def add(obj)
|
|
33
|
-
if @inverse_rel.isToMany
|
|
34
|
-
obj.send(@inverse_rel.name).addObject(@owner)
|
|
35
|
-
else
|
|
36
|
-
obj.send("#{@inverse_rel.name}=", @owner)
|
|
37
|
-
end
|
|
38
40
|
@set.addObject obj
|
|
39
41
|
end
|
|
40
42
|
alias_method :<<, :add
|
|
41
43
|
|
|
44
|
+
# Remove objects from the relationship
|
|
45
|
+
#
|
|
46
|
+
def remove(obj)
|
|
47
|
+
@set.removeObject obj
|
|
48
|
+
end
|
|
49
|
+
|
|
42
50
|
def self.extend_set(set, owner, name)
|
|
43
51
|
set.extend SetExt
|
|
44
52
|
set.extend Enumerable
|
|
@@ -87,6 +95,10 @@ module CDQ
|
|
|
87
95
|
@__query__.new(opts)
|
|
88
96
|
end
|
|
89
97
|
|
|
98
|
+
def remove(opts = {})
|
|
99
|
+
@__query__.remove(opts)
|
|
100
|
+
end
|
|
101
|
+
|
|
90
102
|
def where(*args)
|
|
91
103
|
@__query__.where(*args)
|
|
92
104
|
end
|
data/motion/cdq/store.rb
CHANGED
|
@@ -33,6 +33,7 @@ module CDQ
|
|
|
33
33
|
options = { NSMigratePersistentStoresAutomaticallyOption => true,
|
|
34
34
|
NSInferMappingModelAutomaticallyOption => true }
|
|
35
35
|
url = @config.database_url
|
|
36
|
+
mkdir_p File.dirname(url.path)
|
|
36
37
|
store = coordinator.addPersistentStoreWithType(NSSQLiteStoreType,
|
|
37
38
|
configuration:nil,
|
|
38
39
|
URL:url,
|
|
@@ -47,6 +48,17 @@ module CDQ
|
|
|
47
48
|
coordinator
|
|
48
49
|
end
|
|
49
50
|
end
|
|
51
|
+
|
|
52
|
+
def mkdir_p dir
|
|
53
|
+
error = Pointer.new(:object)
|
|
54
|
+
m = NSFileManager.defaultManager
|
|
55
|
+
r = m.createDirectoryAtPath dir, withIntermediateDirectories:true, attributes:nil, error:error
|
|
56
|
+
unless r
|
|
57
|
+
NSLog "#{error[0].localizedDescription}"
|
|
58
|
+
raise error[0].localizedDescription
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
50
62
|
end
|
|
51
63
|
|
|
52
64
|
end
|
|
@@ -83,8 +83,8 @@ module CDQ #:nodoc:
|
|
|
83
83
|
#
|
|
84
84
|
# Causes execution.
|
|
85
85
|
#
|
|
86
|
-
def each(&block)
|
|
87
|
-
array.each(&block)
|
|
86
|
+
def each(*args, &block)
|
|
87
|
+
array.each(*args, &block)
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
# Returns the fully-contstructed fetch request, which can be executed outside of CDQ.
|
|
@@ -159,10 +159,7 @@ module CDQ #:nodoc:
|
|
|
159
159
|
line = " \n- - - - - - - - - - - | - - - - - - - - - - | - - - - - - - - - - - - - - - |"
|
|
160
160
|
out << line
|
|
161
161
|
|
|
162
|
-
|
|
163
|
-
rbn = entity_description.relationshipsByName
|
|
164
|
-
|
|
165
|
-
abn.each do |name, desc|
|
|
162
|
+
entity_description.attributesByName.each do |name, desc|
|
|
166
163
|
out << " \n #{name.ljust(21)}|"
|
|
167
164
|
out << " #{desc.attributeValueClassName.ljust(20)}|"
|
|
168
165
|
out << " #{desc.defaultValue.to_s.ljust(30)}|"
|
|
@@ -172,32 +169,7 @@ module CDQ #:nodoc:
|
|
|
172
169
|
out << "\n\n"
|
|
173
170
|
|
|
174
171
|
self.each do |o|
|
|
175
|
-
out <<
|
|
176
|
-
out << oid(o)
|
|
177
|
-
out << "\n"
|
|
178
|
-
|
|
179
|
-
awidth = abn.keys.map(&:length).max
|
|
180
|
-
rwidth = rbn.keys.map(&:length).max
|
|
181
|
-
width = [awidth, rwidth].max
|
|
182
|
-
|
|
183
|
-
abn.each do |name, desc|
|
|
184
|
-
out << " #{name.ljust(width)} : "
|
|
185
|
-
out << o.send(name).inspect[0,95 - width]
|
|
186
|
-
out << "\n"
|
|
187
|
-
end
|
|
188
|
-
rbn.each do |name, desc|
|
|
189
|
-
rel = CDQRelationshipQuery.new(o, name)
|
|
190
|
-
if desc.isToMany
|
|
191
|
-
out << " #{name.ljust(width)} : "
|
|
192
|
-
out << rel.count.to_s
|
|
193
|
-
out << ' (count)'
|
|
194
|
-
else
|
|
195
|
-
out << " #{name.ljust(width)} : "
|
|
196
|
-
out << oid(rel.first)
|
|
197
|
-
end
|
|
198
|
-
out << "\n"
|
|
199
|
-
end
|
|
200
|
-
out << "\n"
|
|
172
|
+
out << o.log(:string)
|
|
201
173
|
end
|
|
202
174
|
|
|
203
175
|
if log_type == :string
|
|
@@ -205,15 +177,12 @@ module CDQ #:nodoc:
|
|
|
205
177
|
else
|
|
206
178
|
NSLog out
|
|
207
179
|
end
|
|
208
|
-
|
|
209
|
-
rescue Exception => e
|
|
210
|
-
p e
|
|
211
180
|
end
|
|
212
181
|
|
|
213
182
|
private
|
|
214
183
|
|
|
215
184
|
def oid(obj)
|
|
216
|
-
obj ? obj.
|
|
185
|
+
obj ? obj.oid : "nil"
|
|
217
186
|
end
|
|
218
187
|
|
|
219
188
|
def named_scopes
|
data/motion/managed_object.rb
CHANGED
|
@@ -36,12 +36,6 @@ class CDQManagedObject < CoreDataQueryManagedObjectBase
|
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
-
# Shortcut to look up the entity description for this class
|
|
40
|
-
#
|
|
41
|
-
def entity_description
|
|
42
|
-
cdq.models.current.entitiesByName[name]
|
|
43
|
-
end
|
|
44
|
-
|
|
45
39
|
# Creates a CDQ scope, but also defines a method on the class that returns the
|
|
46
40
|
# query directly.
|
|
47
41
|
#
|
|
@@ -68,10 +62,21 @@ class CDQManagedObject < CoreDataQueryManagedObjectBase
|
|
|
68
62
|
cdq.send(name, *args, &block)
|
|
69
63
|
end
|
|
70
64
|
|
|
71
|
-
def
|
|
65
|
+
def respond_to?(name)
|
|
72
66
|
super || cdq.respond_to?(name)
|
|
73
67
|
end
|
|
74
68
|
|
|
69
|
+
def destroy_all
|
|
70
|
+
self.all.array.each do |instance|
|
|
71
|
+
instance.destroy
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def destroy_all!
|
|
76
|
+
destroy_all
|
|
77
|
+
cdq.save
|
|
78
|
+
end
|
|
79
|
+
|
|
75
80
|
end
|
|
76
81
|
|
|
77
82
|
# Register this object for destruction with the current context. Will not
|
|
@@ -85,14 +90,70 @@ class CDQManagedObject < CoreDataQueryManagedObjectBase
|
|
|
85
90
|
description
|
|
86
91
|
end
|
|
87
92
|
|
|
93
|
+
def log(log_type = nil)
|
|
94
|
+
out = "\nOID: "
|
|
95
|
+
out << oid
|
|
96
|
+
out << "\n"
|
|
97
|
+
|
|
98
|
+
atts = entity.attributesByName
|
|
99
|
+
rels = entity.relationshipsByName
|
|
100
|
+
|
|
101
|
+
width = (atts.keys.map(&:length) + rels.keys.map(&:length)).max || 0
|
|
102
|
+
|
|
103
|
+
atts.each do |name, desc|
|
|
104
|
+
out << " #{name.ljust(width)} : "
|
|
105
|
+
out << send(name).inspect[0,95 - width]
|
|
106
|
+
out << "\n"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
rels.each do |name, desc|
|
|
110
|
+
rel = CDQRelationshipQuery.new(self, name, nil, context: managedObjectContext)
|
|
111
|
+
if desc.isToMany
|
|
112
|
+
out << " #{name.ljust(width)} : "
|
|
113
|
+
out << rel.count.to_s
|
|
114
|
+
out << ' (count)'
|
|
115
|
+
else
|
|
116
|
+
out << " #{name.ljust(width)} : "
|
|
117
|
+
out << (rel.first && rel.first.oid || "nil")
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
out << "\n"
|
|
121
|
+
|
|
122
|
+
if log_type == :string
|
|
123
|
+
out
|
|
124
|
+
else
|
|
125
|
+
NSLog out
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def ordered_set?(name)
|
|
130
|
+
# isOrdered is returning 0/1 instead of documented BOOL
|
|
131
|
+
ordered = entity.relationshipsByName[name].isOrdered
|
|
132
|
+
return true if ordered == true || ordered == 1
|
|
133
|
+
return false if ordered == false || ordered == 0
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def set_to_extend(name)
|
|
137
|
+
if ordered_set?(name)
|
|
138
|
+
mutableOrderedSetValueForKey(name)
|
|
139
|
+
else
|
|
140
|
+
mutableSetValueForKey(name)
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def oid
|
|
145
|
+
objectID.URIRepresentation.absoluteString.inspect
|
|
146
|
+
end
|
|
147
|
+
|
|
88
148
|
protected
|
|
89
149
|
|
|
90
150
|
# Called from method that's dynamically added from
|
|
91
151
|
# +[CoreDataManagedObjectBase defineRelationshipMethod:]
|
|
92
152
|
def relationshipByName(name)
|
|
93
153
|
willAccessValueForKey(name)
|
|
94
|
-
set = CDQRelationshipQuery.extend_set(
|
|
154
|
+
set = CDQRelationshipQuery.extend_set(set_to_extend(name), self, name)
|
|
95
155
|
didAccessValueForKey(name)
|
|
96
156
|
set
|
|
97
157
|
end
|
|
158
|
+
|
|
98
159
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cdq
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.9
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- infinitered
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2014-
|
|
12
|
+
date: 2014-06-13 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: ruby-xcdm
|