map 6.0.0 → 6.0.1
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.
- data/lib/map.rb +1 -1
- data/lib/map/integrations/active_record.rb +140 -0
- data/map.gemspec +3 -1
- metadata +3 -2
data/lib/map.rb
CHANGED
@@ -0,0 +1,140 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
class Map
|
3
|
+
module Integrations
|
4
|
+
module ActiveRecord
|
5
|
+
def self.included( klass )
|
6
|
+
klass.extend ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def to_map( record , *args )
|
11
|
+
# prep
|
12
|
+
model = record.class
|
13
|
+
map = Map.new
|
14
|
+
map[ :model ] = model.name.underscore
|
15
|
+
map[ :id ] = record.id
|
16
|
+
|
17
|
+
# yank out options if they are patently obvious...
|
18
|
+
if args.size == 2 and args.first.is_a?( Array ) and args.last.is_a?( Hash )
|
19
|
+
options = Map.for args.last
|
20
|
+
args = args.first
|
21
|
+
else
|
22
|
+
options = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
# get base to_dao from class
|
26
|
+
base = column_names
|
27
|
+
|
28
|
+
# available options keys
|
29
|
+
opts = %w( include includes with exclude excludes without )
|
30
|
+
|
31
|
+
# proc to remove options
|
32
|
+
extract_options =
|
33
|
+
proc do |array|
|
34
|
+
to_return = Map.new
|
35
|
+
last = array.last
|
36
|
+
if last.is_a?( Hash )
|
37
|
+
last = Map.for last
|
38
|
+
if opts.any? { | opt | last.has_key? opt }
|
39
|
+
array.pop
|
40
|
+
to_return = last
|
41
|
+
end
|
42
|
+
end
|
43
|
+
to_return
|
44
|
+
end
|
45
|
+
|
46
|
+
# handle case where options are bundled in args...
|
47
|
+
options ||= extract_options[args]
|
48
|
+
|
49
|
+
# use base options iff none provided
|
50
|
+
base_options = extract_options[base]
|
51
|
+
if options.blank? and !base_options.blank?
|
52
|
+
options = base_options
|
53
|
+
end
|
54
|
+
|
55
|
+
# refine the args with includes iff found in options
|
56
|
+
include_opts = [ :include , :includes , :with ]
|
57
|
+
if options.any? { | option | include_opts.include? option.to_sym }
|
58
|
+
args.replace( base ) if args.empty?
|
59
|
+
args.push( options[ :include ] ) if options[ :include ]
|
60
|
+
args.push( options[ :includes ] ) if options[ :includes ]
|
61
|
+
args.push( options[ :with ] ) if options[ :with ]
|
62
|
+
end
|
63
|
+
|
64
|
+
# take passed in args or model defaults
|
65
|
+
list = args.empty? ? base : args
|
66
|
+
list = column_names if list.empty?
|
67
|
+
|
68
|
+
# proc to ensure we're all mapped out
|
69
|
+
map_nested =
|
70
|
+
proc do | value , *args |
|
71
|
+
if value.is_a?( Array )
|
72
|
+
value.map { | v | map_nested[ v , *args ] }
|
73
|
+
else
|
74
|
+
if value.respond_to? :to_map
|
75
|
+
value.to_map *args
|
76
|
+
else
|
77
|
+
value
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# okay - go!
|
83
|
+
list.flatten.each do | attr |
|
84
|
+
if attr.is_a?( Array )
|
85
|
+
related , *argv = attr
|
86
|
+
v = record.send related
|
87
|
+
value = map_nested[ value , *argv ]
|
88
|
+
map[ related ] = value
|
89
|
+
next
|
90
|
+
end
|
91
|
+
|
92
|
+
if attr.is_a?( Hash )
|
93
|
+
attr.each do | related , argv |
|
94
|
+
v = record.send related
|
95
|
+
argv = !argv.is_a?( Array ) ? [ argv ] : argv
|
96
|
+
value = map_nested[ v , *argv ]
|
97
|
+
map[ related ] = value
|
98
|
+
end
|
99
|
+
next
|
100
|
+
end
|
101
|
+
|
102
|
+
value = record.send attr
|
103
|
+
|
104
|
+
if value.respond_to?( :to_map )
|
105
|
+
map[ attr ] = value.to_map
|
106
|
+
next
|
107
|
+
end
|
108
|
+
|
109
|
+
if value.is_a?( Array )
|
110
|
+
map[ attr ] = value.map &map_nested
|
111
|
+
next
|
112
|
+
end
|
113
|
+
|
114
|
+
map[ attr ] = value
|
115
|
+
end
|
116
|
+
|
117
|
+
# refine the map with excludes iff passed as options
|
118
|
+
exclude_opts = [ :exclude , :excludes , :without ]
|
119
|
+
if options.any? { | option | exclude_opts.include? option.to_sym }
|
120
|
+
[ options[ :exclude ] , options[ :excludes ] , options[ :without ] ].each do | paths |
|
121
|
+
paths = Array paths
|
122
|
+
next if paths.blank?
|
123
|
+
paths.each { | path | map.rm path }
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
map
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def to_map( *args )
|
132
|
+
self.class.to_map self , *args
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
if defined?( ActiveRecord::Base )
|
139
|
+
ActiveRecord::Base.send :include , Map::Integrations::ActiveRecord
|
140
|
+
end
|
data/map.gemspec
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
Gem::Specification::new do |spec|
|
5
5
|
spec.name = "map"
|
6
|
-
spec.version = "6.0.
|
6
|
+
spec.version = "6.0.1"
|
7
7
|
spec.platform = Gem::Platform::RUBY
|
8
8
|
spec.summary = "map"
|
9
9
|
spec.description = "description: map kicks the ass"
|
@@ -17,6 +17,8 @@ Gem::Specification::new do |spec|
|
|
17
17
|
"lib",
|
18
18
|
"lib/map",
|
19
19
|
"lib/map.rb",
|
20
|
+
"lib/map/integrations",
|
21
|
+
"lib/map/integrations/active_record.rb",
|
20
22
|
"lib/map/options.rb",
|
21
23
|
"lib/map/struct.rb",
|
22
24
|
"map.gemspec",
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: map
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.
|
4
|
+
version: 6.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-28 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! 'description: map kicks the ass'
|
15
15
|
email: ara.t.howard@gmail.com
|
@@ -23,6 +23,7 @@ files:
|
|
23
23
|
- TODO
|
24
24
|
- a.rb
|
25
25
|
- lib/map.rb
|
26
|
+
- lib/map/integrations/active_record.rb
|
26
27
|
- lib/map/options.rb
|
27
28
|
- lib/map/struct.rb
|
28
29
|
- map.gemspec
|