hmx_client 0.0.7 → 0.1.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.
@@ -1,18 +1,18 @@
1
- require "hmx/command/base"
2
- require 'date'
3
-
4
- module HmxClient::Command
5
-
6
- # Bootstrap a default configuration
7
- #
8
- class Bootstrap < Base
9
-
10
- # bootstrap
11
- #
12
- # Bootstrap a default configuration into this partition
13
- def index
14
- hmx.bootstrap
15
- puts "Done."
16
- end
17
- end
18
- end
1
+ require "hmx/command/base"
2
+ require 'date'
3
+
4
+ module HmxClient::Command
5
+
6
+ # Bootstrap a default configuration
7
+ #
8
+ class Bootstrap < Base
9
+
10
+ # bootstrap
11
+ #
12
+ # Bootstrap a default configuration into this partition
13
+ def index
14
+ hmx.doBootstrap([])
15
+ puts "Done."
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,170 @@
1
+ require "hmx/command/base"
2
+
3
+ module HmxClient::Command
4
+
5
+ # Provides the ability to check view functions locally
6
+ #
7
+ class Check < Base
8
+
9
+ # check
10
+ #
11
+ # Download an environment to check
12
+ # <folderName> <type>
13
+ #
14
+ # Creates <folderName>/functions/[function files that are Ruby]
15
+ # And <folderName>/<typeName>/[files corresponding to the documents in that type]
16
+ #
17
+ def index
18
+ unless args.size > 1
19
+ raise CommandFailed, "Usage: hmx check <folderName> <typeName>"
20
+ end
21
+ rootFolder = args.shift;
22
+ typeName = args.shift;
23
+ Dir.mkdir(rootFolder) if !Dir.exist?(rootFolder)
24
+ fnFolder = rootFolder + '/function/'
25
+ Dir.mkdir(fnFolder) if !Dir.exist?(fnFolder)
26
+ displayNames = hmx.doQuery(['sys.fn',nil])
27
+ displayNames.each { | displayName |
28
+ fnInfo = hmx.doGetData([displayName])
29
+ if fnInfo['document']['MXFunction']['fnLang'] == 'RUBY'
30
+ puts "Writing function - #{ displayName }"
31
+ outfile = fnFolder + fnInfo['document']['MXFunction']['fnName'] + '.rb'
32
+ File.open(outfile, 'w') { | f | f.write(fnInfo['document']['MXFunction']['content']) }
33
+ end
34
+ }
35
+ # Now do types
36
+ typeFolder = rootFolder + '/' + typeName
37
+ Dir.mkdir(typeFolder) if !Dir.exist?(typeFolder)
38
+ displayNames = hmx.doQuery([typeName, nil])
39
+ displayNames.each { | displayName |
40
+ document = hmx.doGetData([displayName])
41
+ outfile = rootFolder + '/' + displayName
42
+ puts "Writing #{ typeName } - #{ displayName }"
43
+ File.open(outfile, 'w') { | f | f.write(JSON.pretty_generate(document)) }
44
+ }
45
+ end
46
+
47
+ #
48
+ # check:save
49
+ #
50
+ # Given a check function, runs that function against all documents, outputting the value
51
+ # If the third parameter is given that is an option, to pick one doc (ONE), just display part
52
+ # PART, or FULL for everything.
53
+ #
54
+ # <folder> <fnName> <typeName> [ONE|PART|FULL]
55
+ def checkSave
56
+ unless args.size > 1
57
+ raise CommandFailed, 'Usage: hmx check:save <folderName> <checkfn> <typeName> <ONE|PART|FULL>'
58
+ end
59
+ @rootFolder = args.shift
60
+ fnName = args.shift
61
+ typeName = args.shift
62
+ option = 'FULL'
63
+ if args.size > 0
64
+ option = args.shift
65
+ end
66
+
67
+ # What we do here is this
68
+ # Create an eval string of
69
+ #
70
+ content = getFn(fnName)
71
+ Evaluator.class_eval(content)
72
+
73
+ # Now get the data object
74
+ typeFolder = "#{@rootFolder}/#{typeName}"
75
+ ev = Evaluator.new(@rootFolder)
76
+ res = []
77
+ Dir.foreach(typeFolder) { | f |
78
+ display "Testing #{f}"
79
+ fullFile = File.expand_path("#{typeFolder}/#{f}")
80
+ if (File.file?(fullFile))
81
+ data = getData(fullFile)
82
+ res << ev.check(data)
83
+ end
84
+ }
85
+ display_tab(res)
86
+ end
87
+ # check:view
88
+ #
89
+ # Given a folder, a type, a filter fn and a map fn, and a set of parameters to the view
90
+ # run the view "locally" in this environment, by evaluating the filter and map against
91
+ # each document downloaded for the type
92
+
93
+ def checkView
94
+ unless args.size > 3
95
+ raise CommandFailed, "Usage: hmx check:view <folderName> <typeName> <filter> <map> <paramString>"
96
+ end
97
+ @rootFolder = args.shift
98
+ typeName = args.shift
99
+ filterFn = args.shift
100
+ mapFn = args.shift
101
+ paramString = args.shift
102
+ paramString = JSON.parse(paramString)
103
+
104
+ filterContent = getFn(filterFn)
105
+ mapContent = getFn(mapFn)
106
+ Evaluator.class_eval(filterContent)
107
+ Evaluator.class_eval(mapContent)
108
+ ev = Evaluator.new(@rootFolder)
109
+ res = []
110
+ typeFolder = "#{@rootFolder}/#{typeName}/"
111
+ Dir.foreach(typeFolder) { | f |
112
+ fullFile = File.expand_path("#{typeFolder}/#{f}")
113
+ if (File.file?(fullFile))
114
+ data = getData(fullFile)
115
+ val = ev.runView(data, paramString)
116
+ if (!val.nil?)
117
+ res << val
118
+ end
119
+ end
120
+ }
121
+ display_tab res
122
+ end
123
+
124
+ protected
125
+
126
+ def getContent(fileName)
127
+ File.open(fileName) { | h |
128
+ c = ''
129
+ while(line = h.gets)
130
+ c = c + line
131
+ end
132
+ c
133
+ }
134
+ end
135
+
136
+ def getFn(fnName)
137
+ fnFile = @rootFolder + "/function/#{fnName}.rb"
138
+ getContent(fnFile)
139
+ end
140
+
141
+ def getData(fileName)
142
+ JSON.parse(getContent(fileName))
143
+ end
144
+ end
145
+
146
+ # This is where we'll put the helper functions ($Helper.doGetData)
147
+ class ScriptHelper
148
+ def initialize(rootFolder)
149
+ @rootFolder = rootFolder
150
+ end
151
+
152
+ def getDataAsMap(displayName)
153
+ { "data" => @rootFolder }
154
+ end
155
+ end
156
+
157
+ class Evaluator
158
+ def initialize(rootFolder)
159
+ $helper = ScriptHelper.new(rootFolder)
160
+ end
161
+
162
+ def runView(data, params)
163
+ if (filter(data, params))
164
+ map(data, params)
165
+ else
166
+ nil
167
+ end
168
+ end
169
+ end
170
+ end
@@ -1,77 +1,77 @@
1
- require "hmx/command/base"
2
- require 'date'
3
-
4
- module HmxClient::Command
5
-
6
- # Clone a partition or setup a partition from a clone
7
- #
8
- class Clone < Base
9
-
10
- # clone
11
- #
12
- # Create a clone file for the current partition
13
- def index
14
- # Clone the type information
15
- # Clone these built in types (i.e. the content)
16
- # Clone other types as defined by the command line
17
- extraTypes = args
18
- types = [ 'sys.user', 'sys.config', 'sys.ent', 'sys.egroup', 'sys.trigger', 'sys.view' ]
19
- extraTypes.each { | et | types << et }
20
- types.each { | t | dumpTypeAndData(t) }
21
- end
22
-
23
- # clone:load
24
- #
25
- # Load a file that was created using hmx clone
26
- # The file basically contains a series of types (documents separated by << >>)
27
- # and data (separated by [[ ]])
28
- def load
29
- # We define the file as being the input file on the command line (--file-in)
30
- if (HmxClient::Command.fileIn.nil?)
31
- raise CommandFailed, "Usage: hmx clone:load --file-in=<filename>"
32
- end
33
- realFile = File.expand_path(HmxClient::Command.fileIn)
34
- File.open(realFile, 'r') { | f |
35
- currentDoc = ''
36
- isType = false
37
- while(line = f.gets)
38
- if (line[0] == '#')
39
- elsif (line[0] == '<' && line[1] == '<')
40
- currentDoc = ''
41
- isType = true
42
- elsif (line[0] == '>' && line[1] == '>')
43
- if isType
44
- print '.'
45
- hmx.updateType(JSON.parse(currentDoc))
46
- end
47
- currentDoc = ''
48
- elsif (line[0] == '[' && line[1] == '[')
49
- currentDoc = ''
50
- isType = false
51
- elsif (line[0] == ']' && line[1] == ']')
52
- if (!isType)
53
- print 'x'
54
- hmx.putData([currentDoc])
55
- end
56
- currentDoc = ''
57
- else
58
- currentDoc = currentDoc + line
59
- end
60
- end
61
- }
62
- puts ""
63
- puts "Done"
64
- end
65
-
66
- protected
67
- def dumpTypeAndData(typeName)
68
- puts "####### #{ typeName } "
69
- puts "<<"
70
- puts JSON.generate(hmx.getType(typeName))
71
- puts ">>"
72
- puts "####### Data for #{ typeName } "
73
- displayNames = hmx.query(typeName, nil)
74
- displayNames.each { | d | puts("[["); puts JSON.generate(hmx.getData([d])); puts("]]") }
75
- end
76
- end
77
- end
1
+ require "hmx/command/base"
2
+ require 'date'
3
+
4
+ module HmxClient::Command
5
+
6
+ # Clone a partition or setup a partition from a clone
7
+ #
8
+ class Clone < Base
9
+
10
+ # clone
11
+ #
12
+ # Create a clone file for the current partition
13
+ def index
14
+ # Clone the type information
15
+ # Clone these built in types (i.e. the content)
16
+ # Clone other types as defined by the command line
17
+ extraTypes = args
18
+ types = [ 'sys.user', 'sys.config', 'sys.ent', 'sys.egroup', 'sys.trigger', 'sys.view' ]
19
+ extraTypes.each { | et | types << et }
20
+ types.each { | t | dumpTypeAndData(t) }
21
+ end
22
+
23
+ # clone:load
24
+ #
25
+ # Load a file that was created using hmx clone
26
+ # The file basically contains a series of types (documents separated by << >>)
27
+ # and data (separated by [[ ]])
28
+ def load
29
+ # We define the file as being the input file on the command line (--file-in)
30
+ if (HmxClient::Command.fileIn.nil?)
31
+ raise CommandFailed, "Usage: hmx clone:load --file-in=<filename>"
32
+ end
33
+ realFile = File.expand_path(HmxClient::Command.fileIn)
34
+ File.open(realFile, 'r') { | f |
35
+ currentDoc = ''
36
+ isType = false
37
+ while(line = f.gets)
38
+ if (line[0] == '#')
39
+ elsif (line[0] == '<' && line[1] == '<')
40
+ currentDoc = ''
41
+ isType = true
42
+ elsif (line[0] == '>' && line[1] == '>')
43
+ if isType
44
+ print '.'
45
+ hmx.doUpdateType([JSON.parse(currentDoc)])
46
+ end
47
+ currentDoc = ''
48
+ elsif (line[0] == '[' && line[1] == '[')
49
+ currentDoc = ''
50
+ isType = false
51
+ elsif (line[0] == ']' && line[1] == ']')
52
+ if (!isType)
53
+ print 'x'
54
+ hmx.doPutData([currentDoc])
55
+ end
56
+ currentDoc = ''
57
+ else
58
+ currentDoc = currentDoc + line
59
+ end
60
+ end
61
+ }
62
+ puts ""
63
+ puts "Done"
64
+ end
65
+
66
+ protected
67
+ def dumpTypeAndData(typeName)
68
+ puts "####### #{ typeName } "
69
+ puts "<<"
70
+ puts JSON.generate(hmx.doGetType([typeName]))
71
+ puts ">>"
72
+ puts "####### Data for #{ typeName } "
73
+ displayNames = hmx.doQuery([typeName, nil])
74
+ displayNames.each { | d | puts("[["); puts JSON.generate(hmx.doGetData([d])); puts("]]") }
75
+ end
76
+ end
77
+ end
@@ -1,67 +1,67 @@
1
- require "hmx/command/base"
2
-
3
- module HmxClient::Command
4
-
5
- # Manage app config vars
6
- #
7
- class Config < Base
8
-
9
- # config
10
- #
11
- # display the config vars for an app
12
- #
13
- # -s, --shell # output config vars in shell format
14
- #
15
- def index
16
- display_vars(@config, :long => true, :shell => false)
17
- end
18
-
19
- # config:add KEY1=VALUE1 ...
20
- #
21
- # add one or more config vars
22
- #
23
- def add
24
- unless args.size > 0 and args.all? { |a| a.include?('=') }
25
- raise CommandFailed, "Usage: hmx config:add <key>=<value> [<key2>=<value2> ...]"
26
- end
27
-
28
- args.inject({}) do |vars, arg|
29
- key, value = arg.split('=', 2)
30
- storeConfig(key.to_sym,value)
31
- end
32
-
33
- display_vars(@config, :indent => 2)
34
- end
35
-
36
- # config:remove KEY1 [KEY2 ...]
37
- #
38
- # remove a config var
39
- #
40
- def remove
41
- raise CommandFailed, "Usage: hmx config:remove KEY1 [KEY2 ...]" if args.empty?
42
-
43
- args.each do |key|
44
- removeConfig(key.to_sym)
45
- display_vars(@config, :indent => 2)
46
- end
47
- end
48
-
49
- protected
50
- def display_vars(vars, options={})
51
- max_length = vars.map { |v| v[0].to_s.size }.max
52
- vars.keys.sort.each do |key|
53
- if options[:shell]
54
- display "#{key}=#{vars[key]}"
55
- else
56
- spaces = ' ' * (max_length - key.to_s.size)
57
- display "#{' ' * (options[:indent] || 0)}#{key}#{spaces} => #{format(vars[key], options)}"
58
- end
59
- end
60
- end
61
-
62
- def format(value, options)
63
- return value if options[:long] || value.to_s.size < 36
64
- value[0, 16] + '...' + value[-16, 16]
65
- end
66
- end
67
- end
1
+ require "hmx/command/base"
2
+
3
+ module HmxClient::Command
4
+
5
+ # Manage app config vars
6
+ #
7
+ class Config < Base
8
+
9
+ # config
10
+ #
11
+ # display the config vars for an app
12
+ #
13
+ # -s, --shell # output config vars in shell format
14
+ #
15
+ def index
16
+ display_vars(@config, :long => true, :shell => false)
17
+ end
18
+
19
+ # config:add KEY1=VALUE1 ...
20
+ #
21
+ # add one or more config vars
22
+ #
23
+ def add
24
+ unless args.size > 0 and args.all? { |a| a.include?('=') }
25
+ raise CommandFailed, "Usage: hmx config:add <key>=<value> [<key2>=<value2> ...]"
26
+ end
27
+
28
+ args.inject({}) do |vars, arg|
29
+ key, value = arg.split('=', 2)
30
+ storeConfig(key.to_sym,value)
31
+ end
32
+
33
+ display_vars(@config, :indent => 2)
34
+ end
35
+
36
+ # config:remove KEY1 [KEY2 ...]
37
+ #
38
+ # remove a config var
39
+ #
40
+ def remove
41
+ raise CommandFailed, "Usage: hmx config:remove KEY1 [KEY2 ...]" if args.empty?
42
+
43
+ args.each do |key|
44
+ removeConfig(key.to_sym)
45
+ display_vars(@config, :indent => 2)
46
+ end
47
+ end
48
+
49
+ protected
50
+ def display_vars(vars, options={})
51
+ max_length = vars.map { |v| v[0].to_s.size }.max
52
+ vars.keys.sort.each do |key|
53
+ if options[:shell]
54
+ display "#{key}=#{vars[key]}"
55
+ else
56
+ spaces = ' ' * (max_length - key.to_s.size)
57
+ display "#{' ' * (options[:indent] || 0)}#{key}#{spaces} => #{format(vars[key], options)}"
58
+ end
59
+ end
60
+ end
61
+
62
+ def format(value, options)
63
+ return value if options[:long] || value.to_s.size < 36
64
+ value[0, 16] + '...' + value[-16, 16]
65
+ end
66
+ end
67
+ end