jdc 0.1.2 → 0.2.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.
- data/LICENSE +1277 -24
- data/Rakefile +13 -0
- data/bin/jdc +12 -2
- data/lib/admin/README.md +15 -0
- data/lib/admin/curl.rb +60 -0
- data/lib/admin/guid.rb +89 -0
- data/lib/admin/plugin.rb +6 -0
- data/lib/admin/service_auth_token.rb +94 -0
- data/lib/admin/service_broker/add.rb +47 -0
- data/lib/admin/service_broker/service_brokers.rb +24 -0
- data/lib/admin/set_quota.rb +44 -0
- data/lib/console/README.md +8 -0
- data/lib/console/console.rb +187 -0
- data/lib/console/plugin.rb +33 -0
- data/lib/jdc/cli/app/app.rb +43 -0
- data/lib/jdc/cli/app/apps.rb +87 -0
- data/lib/jdc/cli/app/base.rb +72 -0
- data/lib/jdc/cli/app/delete.rb +95 -0
- data/lib/jdc/cli/app/deprecated.rb +11 -0
- data/lib/jdc/cli/app/env.rb +78 -0
- data/lib/jdc/cli/app/events.rb +45 -0
- data/lib/jdc/cli/app/files.rb +137 -0
- data/lib/jdc/cli/app/health.rb +26 -0
- data/lib/jdc/cli/app/instances.rb +53 -0
- data/lib/jdc/cli/app/logs.rb +76 -0
- data/lib/jdc/cli/app/push/create.rb +108 -0
- data/lib/jdc/cli/app/push/interactions.rb +86 -0
- data/lib/jdc/cli/app/push/sync.rb +57 -0
- data/lib/jdc/cli/app/push.rb +103 -0
- data/lib/jdc/cli/app/rename.rb +35 -0
- data/lib/jdc/cli/app/restart.rb +31 -0
- data/lib/jdc/cli/app/scale.rb +63 -0
- data/lib/jdc/cli/app/start.rb +161 -0
- data/lib/jdc/cli/app/stats.rb +67 -0
- data/lib/jdc/cli/app/stop.rb +27 -0
- data/lib/jdc/cli/domain/base.rb +9 -0
- data/lib/jdc/cli/domain/domains.rb +40 -0
- data/lib/jdc/cli/domain/map.rb +55 -0
- data/lib/jdc/cli/domain/unmap.rb +56 -0
- data/lib/jdc/cli/help.rb +15 -0
- data/lib/jdc/cli/interactive.rb +105 -0
- data/lib/jdc/cli/login_requirements.rb +15 -0
- data/lib/jdc/cli/organization/base.rb +14 -0
- data/lib/jdc/cli/organization/create.rb +37 -0
- data/lib/jdc/cli/organization/delete.rb +63 -0
- data/lib/jdc/cli/organization/org.rb +45 -0
- data/lib/jdc/cli/organization/orgs.rb +30 -0
- data/lib/jdc/cli/organization/rename.rb +37 -0
- data/lib/jdc/cli/populators/base.rb +16 -0
- data/lib/jdc/cli/populators/organization.rb +32 -0
- data/lib/jdc/cli/populators/populator_methods.rb +64 -0
- data/lib/jdc/cli/populators/space.rb +33 -0
- data/lib/jdc/cli/populators/target.rb +13 -0
- data/lib/jdc/cli/route/base.rb +9 -0
- data/lib/jdc/cli/route/delete.rb +28 -0
- data/lib/jdc/cli/route/map.rb +68 -0
- data/lib/jdc/cli/route/routes.rb +26 -0
- data/lib/jdc/cli/route/unmap.rb +56 -0
- data/lib/jdc/cli/service/base.rb +9 -0
- data/lib/jdc/cli/service/bind.rb +44 -0
- data/lib/jdc/cli/service/create.rb +159 -0
- data/lib/jdc/cli/service/delete.rb +83 -0
- data/lib/jdc/cli/service/rename.rb +36 -0
- data/lib/jdc/cli/service/service.rb +42 -0
- data/lib/jdc/cli/service/service_instance_helper.rb +99 -0
- data/lib/jdc/cli/service/services.rb +111 -0
- data/lib/jdc/cli/service/unbind.rb +37 -0
- data/lib/jdc/cli/space/base.rb +29 -0
- data/lib/jdc/cli/space/create.rb +67 -0
- data/lib/jdc/cli/space/delete.rb +56 -0
- data/lib/jdc/cli/space/rename.rb +38 -0
- data/lib/jdc/cli/space/space.rb +66 -0
- data/lib/jdc/cli/space/spaces.rb +57 -0
- data/lib/jdc/cli/space/switch.rb +19 -0
- data/lib/jdc/cli/start/base.rb +41 -0
- data/lib/jdc/cli/start/colors.rb +13 -0
- data/lib/jdc/cli/start/target.rb +50 -0
- data/lib/jdc/cli/start/target_prettifier.rb +17 -0
- data/lib/jdc/cli/start/targets.rb +16 -0
- data/lib/jdc/cli/user/base.rb +30 -0
- data/lib/jdc/cli/user/create.rb +52 -0
- data/lib/jdc/cli/user/passwd.rb +37 -0
- data/lib/jdc/cli/user/register.rb +43 -0
- data/lib/jdc/cli/user/users.rb +32 -0
- data/lib/jdc/cli.rb +544 -0
- data/lib/jdc/constants.rb +11 -0
- data/lib/jdc/errors.rb +19 -0
- data/lib/jdc/object_extensions.rb +15 -0
- data/lib/jdc/plugin.rb +56 -0
- data/lib/jdc/spacing.rb +89 -0
- data/lib/jdc/spec_helper.rb +1 -0
- data/lib/jdc/test_support.rb +6 -0
- data/lib/jdc/version.rb +3 -0
- data/lib/jdc.rb +15 -2
- data/lib/manifests/errors.rb +35 -0
- data/lib/manifests/loader/builder.rb +39 -0
- data/lib/manifests/loader/normalizer.rb +145 -0
- data/lib/manifests/loader/resolver.rb +79 -0
- data/lib/manifests/loader.rb +31 -0
- data/lib/manifests/manifests.rb +344 -0
- data/lib/manifests/plugin.rb +140 -0
- data/lib/micro/README.md +9 -0
- data/lib/micro/errors.rb +4 -0
- data/lib/{jdc → micro}/micro.rb +15 -15
- data/lib/micro/plugin.rb +197 -0
- data/lib/micro/switcher/base.rb +79 -0
- data/lib/{jdc/micro → micro}/switcher/darwin.rb +5 -3
- data/lib/{jdc/micro → micro}/switcher/dummy.rb +1 -1
- data/lib/micro/switcher/linux.rb +16 -0
- data/lib/{jdc/micro → micro}/switcher/windows.rb +5 -5
- data/lib/{jdc/micro → micro}/vmrun.rb +26 -19
- data/lib/tasks/gem_release.rake +42 -0
- data/lib/tunnel/README.md +29 -0
- data/{config → lib/tunnel/config}/clients.yml +2 -2
- data/lib/tunnel/helper-app/Gemfile +10 -0
- data/lib/tunnel/helper-app/Gemfile.lock +48 -0
- data/{caldecott_helper → lib/tunnel/helper-app}/server.rb +5 -5
- data/lib/tunnel/plugin.rb +183 -0
- data/lib/tunnel/tunnel.rb +295 -0
- metadata +319 -89
- data/README.md +0 -102
- data/config/micro/paths.yml +0 -22
- data/config/micro/refresh_ip.rb +0 -20
- data/lib/cli/commands/admin.rb +0 -58
- data/lib/cli/commands/apps.rb +0 -1129
- data/lib/cli/commands/base.rb +0 -228
- data/lib/cli/commands/manifest.rb +0 -56
- data/lib/cli/commands/micro.rb +0 -115
- data/lib/cli/commands/misc.rb +0 -126
- data/lib/cli/commands/services.rb +0 -178
- data/lib/cli/commands/user.rb +0 -14
- data/lib/cli/config.rb +0 -173
- data/lib/cli/console_helper.rb +0 -170
- data/lib/cli/core_ext.rb +0 -122
- data/lib/cli/errors.rb +0 -19
- data/lib/cli/frameworks.rb +0 -265
- data/lib/cli/manifest_helper.rb +0 -302
- data/lib/cli/runner.rb +0 -505
- data/lib/cli/services_helper.rb +0 -84
- data/lib/cli/tunnel_helper.rb +0 -332
- data/lib/cli/usage.rb +0 -86
- data/lib/cli/version.rb +0 -7
- data/lib/cli/zip_util.rb +0 -77
- data/lib/cli.rb +0 -53
- data/lib/jdc/client.rb +0 -457
- data/lib/jdc/const.rb +0 -25
- data/lib/jdc/micro/switcher/base.rb +0 -97
- data/lib/jdc/micro/switcher/linux.rb +0 -16
- data/lib/jdc/signature/version.rb +0 -27
- data/lib/jdc/signer.rb +0 -13
- data/lib/jdc/timer.rb +0 -12
data/lib/jdc/spacing.rb
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
module JDC
|
|
2
|
+
module Spacing
|
|
3
|
+
@@indentation = 0
|
|
4
|
+
|
|
5
|
+
def indented
|
|
6
|
+
@@indentation += 1
|
|
7
|
+
yield
|
|
8
|
+
ensure
|
|
9
|
+
@@indentation -= 1
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def line(msg = "")
|
|
13
|
+
return puts "" if msg.empty?
|
|
14
|
+
|
|
15
|
+
start_line(msg)
|
|
16
|
+
puts ""
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def start_line(msg)
|
|
20
|
+
print " " * @@indentation unless quiet?
|
|
21
|
+
print msg
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def lines(blob)
|
|
25
|
+
blob.each_line do |line|
|
|
26
|
+
start_line(line)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
line
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def quiet?
|
|
33
|
+
false
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def spaced(vals)
|
|
37
|
+
num = 0
|
|
38
|
+
vals.each do |val|
|
|
39
|
+
line unless quiet? || num == 0
|
|
40
|
+
yield val
|
|
41
|
+
num += 1
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def tabular(*rows)
|
|
46
|
+
spacings = []
|
|
47
|
+
rows.each do |row|
|
|
48
|
+
next unless row
|
|
49
|
+
|
|
50
|
+
row.each.with_index do |col, i|
|
|
51
|
+
next unless col
|
|
52
|
+
|
|
53
|
+
width = text_width(col)
|
|
54
|
+
|
|
55
|
+
if !spacings[i] || width > spacings[i]
|
|
56
|
+
spacings[i] = width
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
columns = spacings.size
|
|
62
|
+
rows.each do |row|
|
|
63
|
+
next unless row
|
|
64
|
+
|
|
65
|
+
row.each.with_index do |col, i|
|
|
66
|
+
next unless col
|
|
67
|
+
|
|
68
|
+
start_line justify(col, spacings[i])
|
|
69
|
+
print " " unless i + 1 == columns
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
line
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def trim_escapes(str)
|
|
77
|
+
str.gsub(/\e\[\d+m/, "")
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def text_width(str)
|
|
81
|
+
trim_escapes(str).size
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def justify(str, width)
|
|
85
|
+
trimmed = trim_escapes(str)
|
|
86
|
+
str.ljust(width + (str.size - trimmed.size))
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require File.expand_path("../../../spec/spec_helper", __FILE__)
|
data/lib/jdc/version.rb
ADDED
data/lib/jdc.rb
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
require "jdc/version"
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require "jdc/object_extensions"
|
|
4
|
+
|
|
5
|
+
require "jdc/cli"
|
|
6
|
+
|
|
7
|
+
command_files = "../jdc/cli/{app,route,domain,organization,space,service,start,user}/*.rb"
|
|
8
|
+
Dir[File.expand_path(command_files, __FILE__)].each do |file|
|
|
9
|
+
require file unless File.basename(file) == 'base.rb'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
require "manifests/plugin"
|
|
13
|
+
require "admin/plugin"
|
|
14
|
+
require "console/plugin"
|
|
15
|
+
#require "tunnel/plugin"
|
|
16
|
+
require "micro/plugin"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require "jdc/errors"
|
|
2
|
+
|
|
3
|
+
module JDCManifests
|
|
4
|
+
class InvalidManifest < JDC::UserFriendlyError
|
|
5
|
+
attr_reader :file
|
|
6
|
+
|
|
7
|
+
def initialize(file)
|
|
8
|
+
@file = file
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def to_s
|
|
12
|
+
"Manifest file '#{@file}' is malformed."
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class CircularDependency < JDC::UserFriendlyError
|
|
17
|
+
def initialize(app)
|
|
18
|
+
@app = app
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def to_s
|
|
22
|
+
"Circular dependency in application '#@app'"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class UnknownSymbol < JDC::UserFriendlyError
|
|
27
|
+
def initialize(sym)
|
|
28
|
+
@sym = sym
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def to_s
|
|
32
|
+
"Undefined symbol in manifest: '#@sym'"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require "manifests/errors"
|
|
2
|
+
|
|
3
|
+
module JDCManifests
|
|
4
|
+
module Builder
|
|
5
|
+
# parse a manifest and merge with its inherited manifests
|
|
6
|
+
def build(file)
|
|
7
|
+
manifest = YAML.load_file file
|
|
8
|
+
raise JDCManifests::InvalidManifest.new(file) unless manifest
|
|
9
|
+
|
|
10
|
+
Array(manifest["inherit"]).each do |path|
|
|
11
|
+
manifest = merge_parent(path, manifest)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
manifest.delete("inherit")
|
|
15
|
+
|
|
16
|
+
manifest
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
# merge the manifest at `parent_path' into the `child'
|
|
22
|
+
def merge_parent(parent_path, child)
|
|
23
|
+
merge_manifest(build(from_manifest(parent_path)), child)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# deep hash merge
|
|
27
|
+
def merge_manifest(parent, child)
|
|
28
|
+
merge = proc do |_, old, new|
|
|
29
|
+
if new.is_a?(Hash) && old.is_a?(Hash)
|
|
30
|
+
old.merge(new, &merge)
|
|
31
|
+
else
|
|
32
|
+
new
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
parent.merge(child, &merge)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
module JDCManifests
|
|
2
|
+
module Normalizer
|
|
3
|
+
MANIFEST_META = ["applications", "properties"]
|
|
4
|
+
|
|
5
|
+
def normalize!(manifest)
|
|
6
|
+
toplevel = toplevel_attributes(manifest)
|
|
7
|
+
|
|
8
|
+
apps = manifest["applications"]
|
|
9
|
+
apps ||= [{}]
|
|
10
|
+
|
|
11
|
+
default_paths_to_keys!(apps)
|
|
12
|
+
|
|
13
|
+
apps = convert_to_array(apps)
|
|
14
|
+
|
|
15
|
+
merge_toplevel!(toplevel, manifest, apps)
|
|
16
|
+
normalize_apps!(apps)
|
|
17
|
+
|
|
18
|
+
manifest["applications"] = apps
|
|
19
|
+
|
|
20
|
+
normalize_paths!(apps)
|
|
21
|
+
|
|
22
|
+
keyval = normalize_key_val(manifest)
|
|
23
|
+
manifest.clear.merge!(keyval)
|
|
24
|
+
|
|
25
|
+
nil
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def normalize_paths!(apps)
|
|
31
|
+
apps.each do |app|
|
|
32
|
+
app["path"] = from_manifest(app["path"])
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def convert_to_array(apps)
|
|
37
|
+
return apps if apps.is_a?(Array)
|
|
38
|
+
|
|
39
|
+
ordered_by_deps(apps)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# sort applications in dependency order
|
|
43
|
+
# e.g. if A depends on B, B will be listed before A
|
|
44
|
+
def ordered_by_deps(apps, processed = Set[])
|
|
45
|
+
ordered = []
|
|
46
|
+
apps.each do |tag, info|
|
|
47
|
+
next if processed.include?(tag)
|
|
48
|
+
|
|
49
|
+
if deps = Array(info["depends-on"])
|
|
50
|
+
dep_apps = {}
|
|
51
|
+
deps.each do |dep|
|
|
52
|
+
dep_apps[dep] = apps[dep]
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
processed.add(tag)
|
|
56
|
+
|
|
57
|
+
ordered += ordered_by_deps(dep_apps, processed)
|
|
58
|
+
ordered << info
|
|
59
|
+
else
|
|
60
|
+
ordered << info
|
|
61
|
+
processed.add(tag)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
ordered.each { |app| app.delete("depends-on") }
|
|
66
|
+
|
|
67
|
+
ordered
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def default_paths_to_keys!(apps)
|
|
71
|
+
return if apps.is_a?(Array)
|
|
72
|
+
|
|
73
|
+
apps.each do |tag, app|
|
|
74
|
+
app["path"] ||= tag
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def normalize_apps!(apps)
|
|
79
|
+
apps.each do |app|
|
|
80
|
+
normalize_app!(app)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def merge_toplevel!(toplevel, manifest, apps)
|
|
85
|
+
return if toplevel.empty?
|
|
86
|
+
|
|
87
|
+
apps.collect! do |a|
|
|
88
|
+
toplevel.merge(a)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
toplevel.each do |k, _|
|
|
92
|
+
manifest.delete k
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def normalize_app!(app)
|
|
97
|
+
if app.key?("mem")
|
|
98
|
+
app["memory"] = app.delete("mem")
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
if app.key?("url") && app["url"].nil?
|
|
102
|
+
app["url"] = "none"
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
if app.key?("subdomain")
|
|
106
|
+
if app.key?("host")
|
|
107
|
+
app.delete("subdomain")
|
|
108
|
+
else
|
|
109
|
+
app["host"] = app.delete("subdomain")
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def toplevel_attributes(manifest)
|
|
115
|
+
top =
|
|
116
|
+
manifest.reject { |k, _|
|
|
117
|
+
MANIFEST_META.include? k
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
# implicit toplevel path of .
|
|
121
|
+
top["path"] ||= "."
|
|
122
|
+
|
|
123
|
+
top
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def normalize_key_val(val)
|
|
127
|
+
case val
|
|
128
|
+
when Hash
|
|
129
|
+
stringified = {}
|
|
130
|
+
|
|
131
|
+
val.each do |k, v|
|
|
132
|
+
stringified[k.to_sym] = normalize_key_val(v)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
stringified
|
|
136
|
+
when Array
|
|
137
|
+
val.collect { |x| normalize_key_val(x) }
|
|
138
|
+
when nil
|
|
139
|
+
nil
|
|
140
|
+
else
|
|
141
|
+
val.to_s
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module JDCManifests
|
|
2
|
+
module Resolver
|
|
3
|
+
def resolve(manifest, resolver)
|
|
4
|
+
new = {}
|
|
5
|
+
|
|
6
|
+
new[:applications] = manifest[:applications].collect do |app|
|
|
7
|
+
resolve_lexically(resolver, app, [manifest])
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
resolve_lexically(resolver, new, [new])
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
# resolve symbols, with hashes introducing new lexical symbols
|
|
16
|
+
def resolve_lexically(resolver, val, ctx)
|
|
17
|
+
case val
|
|
18
|
+
when Hash
|
|
19
|
+
new = {}
|
|
20
|
+
|
|
21
|
+
val.each do |k, v|
|
|
22
|
+
new[k] = resolve_lexically(resolver, v, [val] + ctx)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
new
|
|
26
|
+
when Array
|
|
27
|
+
val.collect do |v|
|
|
28
|
+
resolve_lexically(resolver, v, ctx)
|
|
29
|
+
end
|
|
30
|
+
when String
|
|
31
|
+
val.gsub(/\$\{([^\}]+)\}/) do
|
|
32
|
+
resolve_symbol(resolver, $1, ctx)
|
|
33
|
+
end
|
|
34
|
+
else
|
|
35
|
+
val
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# resolve a symbol to its value, and then resolve that value
|
|
40
|
+
def resolve_symbol(resolver, sym, ctx)
|
|
41
|
+
if found = find_symbol(sym.to_sym, ctx)
|
|
42
|
+
resolve_lexically(resolver, found, ctx)
|
|
43
|
+
found
|
|
44
|
+
elsif dynamic = resolver.resolve_symbol(sym)
|
|
45
|
+
dynamic
|
|
46
|
+
else
|
|
47
|
+
fail("Unknown symbol in manifest: #{sym}")
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# search for a symbol introduced in the lexical context
|
|
52
|
+
def find_symbol(sym, ctx)
|
|
53
|
+
ctx.each do |h|
|
|
54
|
+
if val = resolve_in(h, sym)
|
|
55
|
+
return val
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
nil
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# find a value, searching in explicit properties first
|
|
63
|
+
def resolve_in(hash, *where)
|
|
64
|
+
find_in_hash(hash, [:properties] + where) ||
|
|
65
|
+
find_in_hash(hash, where)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# helper for following a path of values in a hash
|
|
69
|
+
def find_in_hash(hash, where)
|
|
70
|
+
what = hash
|
|
71
|
+
where.each do |x|
|
|
72
|
+
return nil unless what.is_a?(Hash)
|
|
73
|
+
what = what[x]
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
what
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require "manifests/loader/builder"
|
|
2
|
+
require "manifests/loader/normalizer"
|
|
3
|
+
require "manifests/loader/resolver"
|
|
4
|
+
|
|
5
|
+
module JDCManifests
|
|
6
|
+
class Loader
|
|
7
|
+
include Builder
|
|
8
|
+
include Normalizer
|
|
9
|
+
include Resolver
|
|
10
|
+
|
|
11
|
+
def initialize(file, resolver)
|
|
12
|
+
@file = file
|
|
13
|
+
@resolver = resolver
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def manifest
|
|
17
|
+
info = build(@file)
|
|
18
|
+
normalize! info
|
|
19
|
+
resolve info, @resolver
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
# expand a path relative to the manifest file's directory
|
|
25
|
+
def from_manifest(path)
|
|
26
|
+
return path unless @file
|
|
27
|
+
|
|
28
|
+
File.expand_path(path, File.dirname(@file))
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|