adaptrex 0.9.22

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/bin/adaptrex ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #
4
+ # Copyright 2012 Adaptrex, LLC
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/adaptrex")
20
+ basePath = File.expand_path(File.dirname(__FILE__) + "/..")
21
+ Adaptrex.new(basePath, ARGV)
@@ -0,0 +1,130 @@
1
+ #
2
+ # Copyright 2012 Adaptrex, LLC
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require "etc"
18
+ require "pathname"
19
+
20
+ # Utility class to manage the .adaptrex.config file
21
+ class AdaptrexConfig
22
+
23
+ attr_accessor :weblibPath, :adaptrexVersions, :extVersions, :touchVersions
24
+
25
+ @configFilePath
26
+ def initialize
27
+ @configFilePath = Etc.getpwuid.dir + "/.adaptrex.config"
28
+ if not File.exist?(@configFilePath)
29
+ puts "Welcome To Adaptrex Tools!".blue
30
+ puts "The first time you run the Tools, we need to learn a little about your environment."
31
+
32
+ # Weblib Path is requires... make sure we set it up right away
33
+ promptForWeblibPath
34
+ else
35
+ read
36
+ updateInstalledSDKs
37
+ end
38
+ write
39
+ end
40
+
41
+ def read
42
+ config = File.new(@configFilePath, "r")
43
+ while (line = config.gets)
44
+ line.strip!
45
+ if (line[0] != "#" and line[0] != "=")
46
+ eq = line.index("=")
47
+ if (eq)
48
+ key = line[0..eq - 1].strip
49
+ value = line[eq + 1..-1].strip
50
+
51
+ if key == "weblib.path" then self.weblibPath = value
52
+ elsif key == "adaptrex.versions" then self.adaptrexVersions = value.split(",")
53
+ elsif key == "ext.versions" then self.extVersions = value.split(",")
54
+ elsif key == "touch.versions" then self.touchVersions = value.split(",")
55
+ end
56
+ end
57
+ end
58
+ end
59
+ config.close
60
+ end
61
+
62
+ def write
63
+ settings = File.open(@configFilePath, "w")
64
+ settings.puts "#"
65
+ settings.puts "# Adaptrex Configuration"
66
+ settings.puts "# ----------------------"
67
+ settings.puts "#"
68
+ settings.puts "# This file is automatically generated and maintained by Adaptrex Tools."
69
+ settings.puts "#"
70
+ settings.puts "\n\n"
71
+ settings.puts "weblib.path = " + self.weblibPath
72
+ settings.puts "adaptrex.versions = " + self.adaptrexVersions.join(",")
73
+ if self.extVersions.length > 0
74
+ settings.puts "ext.versions = " + self.extVersions.join(",")
75
+ end
76
+ if self.touchVersions.length > 0
77
+ settings.puts "touch.versions = " + self.touchVersions.join(",")
78
+ end
79
+ settings.close
80
+ end
81
+
82
+ def promptForWeblibPath
83
+ puts "Enter the path of the folder containing your AdaptrexJS, ExtJS and Sencha Touch SDKs."
84
+ print " : "
85
+ userInput = STDIN.gets.chomp
86
+ self.weblibPath = userInput
87
+
88
+ if not File.directory?userInput
89
+ puts "You entered an invalid path".err
90
+ return promptForWeblibPath
91
+ end
92
+
93
+ updateInstalledSDKs
94
+
95
+ errorMsg = []
96
+ if adaptrexVersions.length == 0
97
+ errorMsg.push("You must have an AdaptrexJS folder.".indent)
98
+ end
99
+ if (extVersions.length + touchVersions.length == 0)
100
+ errorMsg.push("You must have at least one ExtJS or Sencha Touch SDK folder.".indent)
101
+ end
102
+ if errorMsg.length > 0
103
+ puts "The folder you entered is missing the required SDKs".err
104
+ puts errorMsg.join("\n")
105
+ return promptForWeblibPath
106
+ end
107
+
108
+ puts "Your weblib folder has been successfully configured.\n\n".success
109
+ end
110
+
111
+ def updateInstalledSDKs
112
+ self.adaptrexVersions = []
113
+ self.extVersions = []
114
+ self.touchVersions = []
115
+
116
+ Pathname.new(self.weblibPath).children.select {|path|
117
+ folderName = path.basename.to_s
118
+ if folderName =~ /\s/
119
+ puts "Weblib folder name cannot contain spaces (" + folderName + ")".success
120
+ puts "It will not be available to your applications.\n".indent
121
+ else
122
+ if folderName.start_with?"adaptrex" then self.adaptrexVersions.push(folderName)
123
+ elsif folderName.start_with?"ext" then self.extVersions.push(folderName)
124
+ elsif folderName.start_with?"sencha" then self.touchVersions.push(folderName)
125
+ end
126
+ end
127
+ }
128
+ end
129
+ end
130
+
@@ -0,0 +1,46 @@
1
+ class AdaptrexInstaller
2
+
3
+ attr_accessor :success, :version
4
+ def initialize (adaptrexConfig)
5
+ @adaptrexConfig = adaptrexConfig
6
+ self.success = false
7
+ puts "Adaptrex Installer".blue
8
+
9
+ versions = adaptrexConfig.adaptrexVersions
10
+
11
+ if versions.length == 1
12
+ self.version = versions[0]
13
+ else
14
+ index = 0
15
+ versions.each {|option|
16
+ puts " [" + (index + 1).to_s + "] " + versions[index]
17
+ index += 1
18
+ }
19
+ self.version = promptForAdaptrexVersion
20
+ end
21
+
22
+ puts "AdaptrexJS Configured (" + self.version + ")".success
23
+ end
24
+
25
+ def promptForAdaptrexVersion
26
+ print "Select the version to use for this webapp: "
27
+ selection = STDIN.gets.chomp
28
+
29
+ versions = @adaptrexConfig.adaptrexVersions
30
+ len = versions.length
31
+ erm = ("Invalid selection. Enter a number from 1 to " + len.to_s).err
32
+ if not selection.numeric?
33
+ puts erm
34
+ return promptForAdaptrexVersion
35
+ end
36
+ selection = Integer(selection)
37
+
38
+ if not selection === 1..len
39
+ puts erm
40
+ return promptForAdaptrexVersion
41
+ end
42
+
43
+ return versions[selection - 1]
44
+ end
45
+
46
+ end
@@ -0,0 +1,103 @@
1
+ require "adaptrex/adaptrexinstaller"
2
+
3
+ class AppConfig
4
+
5
+ attr_accessor :adaptrexVersion, :extVersion, :touchVersion, :pages, :lastSDK, :valid
6
+ def initialize(adaptrexConfig)
7
+ @adaptrexConfig = adaptrexConfig
8
+ self.valid = false
9
+ self.pages = Hash.new
10
+ if not File.directory?"adaptrex" then Dir.mkdir("adaptrex") end
11
+ if not File.exist?"adaptrex/.app.settings" then write end
12
+ read
13
+
14
+ #
15
+ # Make sure we've got an AdaptrexJS version configured for this webapp
16
+ #
17
+ adaptrex = self.adaptrexVersion
18
+ if adaptrex.nil?
19
+ adaptrexInstaller = AdaptrexInstaller.new(adaptrexConfig)
20
+ self.adaptrexVersion = adaptrexInstaller.version
21
+ write
22
+ puts ""
23
+ end
24
+
25
+
26
+ #
27
+ # Make sure adapterx config contains the frameworks configured in this app
28
+ #
29
+ missingSDKs = []
30
+ ext = self.extVersion
31
+ touch = self.touchVersion
32
+ if not adaptrex.nil? and adaptrexConfig.adaptrexVersions.index(adaptrex).nil?
33
+ missingSDKs.push(adaptrex)
34
+ end
35
+ if not ext.nil? and adaptrexConfig.extVersions.index(ext).nil?
36
+ missingSDKs.push(ext)
37
+ end
38
+ if not touch.nil? and adaptrexConfig.touchVersions.index(touch).nil?
39
+ missingSDKs.push(touch)
40
+ end
41
+
42
+ if missingSDKs.length > 0
43
+ puts "Your weblib folder is missing SDKs used by this webapp".err
44
+ puts "Check your weblib folder at: ".indent + adaptrexConfig.weblibPath
45
+ puts "Missing the following:".indent
46
+ for sdk in missingSDKs
47
+ puts " - #{sdk}".indent
48
+ end
49
+ puts ""
50
+ return
51
+ end
52
+
53
+ self.valid = true
54
+ end
55
+
56
+ def read
57
+ settings = File.new("adaptrex/.app.settings", "r")
58
+ while (line = settings.gets)
59
+ line.strip!
60
+ if (line[0] != ?# and line[0] != ?=)
61
+ eq = line.index("=")
62
+ if (eq)
63
+ key = line[0..eq - 1].strip
64
+ value = line[eq + 1..-1].strip
65
+
66
+ if key == "adaptrex.version" then self.adaptrexVersion = value
67
+ elsif key == "ext.version" then self.extVersion = value
68
+ elsif key == "touch.version" then self.touchVersion = value
69
+ elsif key == "last.sdk" then self.lastSDK = value
70
+ else self.pages[key] = value
71
+ end
72
+ end
73
+ end
74
+ end
75
+ settings.close
76
+ end
77
+
78
+ def write
79
+ settings = File.open("adaptrex/.app.settings", "w")
80
+ settings.puts "# Adaptrex Application Configuration"
81
+ settings.puts "# ----------------------------------"
82
+ settings.puts "#"
83
+ settings.puts "# This folder is automatically generated and maintained by Adaptrex Tools."
84
+ settings.puts "# You may modify this file directly to add or remove apps (pages) that"
85
+ settings.puts "# you have modified outside of the Adaptrex Tools."
86
+ settings.puts "\n\n"
87
+ settings.puts "# Frameworks"
88
+ settings.puts "# ----------"
89
+ if not self.adaptrexVersion.nil? then settings.puts "adaptrex.version = " + self.adaptrexVersion end
90
+ if not self.extVersion.nil? then settings.puts "ext.version = " + self.extVersion end
91
+ if not self.touchVersion.nil? then settings.puts "touch.version = " + self.touchVersion end
92
+ if not self.lastSDK.nil? then settings.puts "last.sdk = " + self.lastSDK end
93
+
94
+ settings.puts "\n\n"
95
+ settings.puts "# Applications"
96
+ settings.puts "# ------------"
97
+ self.pages.each do|key,val|
98
+ settings.puts key + " = " + val
99
+ end
100
+
101
+ settings.close
102
+ end
103
+ end
@@ -0,0 +1,82 @@
1
+ #
2
+ # Copyright 2012 Adaptrex, LLC
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ # Utility class to create the Adaptrex/Ext bootstrap file
18
+ class BootstrapInstaller
19
+ require "tmpdir"
20
+ require "fileutils"
21
+
22
+ attr_accessor :success
23
+ def initialize(adaptrexConfig, appConfig, sdkType)
24
+ self.success = false
25
+ isExt = sdkType == "ext"
26
+ if isExt then sdkVersion = appConfig.extVersion else sdkVersion = appConfig.touchVersion end
27
+ adaptrexVersion = appConfig.adaptrexVersion
28
+ puts "Generating the bootstrap file for " + adaptrexVersion + " and " + sdkVersion + "..."
29
+
30
+ adaptrexPath = adaptrexConfig.weblibPath + "/" + adaptrexVersion
31
+ sdkPath = adaptrexConfig.weblibPath + "/" + sdkVersion
32
+
33
+ cmdParts = nil
34
+ tmpDir = nil
35
+ if isExt
36
+ cmdParts = [
37
+ "and include -r -f ExtDependencies.js",
38
+ "and exclude -t core",
39
+ "and include -na Adaptrex.override.ext",
40
+ "and exclude -f ExtDependencies.js",
41
+ ]
42
+ else
43
+ cmdParts = [
44
+ "and include -r -f TouchDependencies.js",
45
+ "and exclude -t core",
46
+ "and include -na Adaptrex.override.touch",
47
+ "and exclude -f TouchDependencies.js",
48
+ ]
49
+
50
+ # Sencha Touch 2.1.0 has a bug that prevents compilation. The file containing
51
+ # the bug is not required for the bootstrap file so we move it to a temp file
52
+ # during the compilation and restore it
53
+ tmpDir = Dir.tmpdir
54
+ FileUtils.mv(sdkPath + "/src/ux/auth2", tmpDir + "_senchatouch_auth2")
55
+ end
56
+
57
+ begin
58
+ cmd = "sencha -sdk " + sdkPath + " compile -classpath " + adaptrexPath + "/src" +
59
+ " exclude -all and " + cmdParts.join(" and ") +
60
+ " and concat adaptrex/" + sdkType + "/bootstrap-debug.js" +
61
+ " and concat -compress adaptrex/" + sdkType + "/bootstrap.js"
62
+ compileOutput = `#{cmd}`
63
+
64
+ if compileOutput.include?"[ERR]"
65
+ puts "There was an error creating your bootstrap file.".err
66
+ puts "See the output from Sencha Cmd for more information".indent
67
+ puts "-----\n" + cmd + "\n-----\n" + compileOutput + "-----\n\n"
68
+ else
69
+ puts((adaptrexVersion + " + " + sdkVersion + " Boostrap Installed").success)
70
+ end
71
+
72
+ ensure
73
+ # Move the broken auth2 ux back to the original Sencha Touch source folder
74
+ if not isExt
75
+ FileUtils.mv(tmpDir + "_senchatouch_auth2", sdkPath + "/src/ux/auth2")
76
+ end
77
+ end
78
+
79
+ # Success!
80
+ self.success = true
81
+ end
82
+ end
@@ -0,0 +1,93 @@
1
+ #
2
+ # Copyright 2012 Adaptrex, LLC
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require "tmpdir"
18
+ require "fileutils"
19
+
20
+ # Package all that pages
21
+ class AdaptrexBuilder
22
+ def initialize(adaptrexConfig, appConfig)
23
+ weblib = adaptrexConfig.weblibPath
24
+
25
+ if appConfig.pages.length == 0
26
+ puts "There are no apps (pages) to be compiled".warn
27
+ return
28
+ end
29
+
30
+
31
+ # Loop through each app and compile
32
+ appConfig.pages.each do|key,val|
33
+ appPath = key
34
+ parts = val.split(",")
35
+ appName = parts[0]
36
+ sdkType = parts[1]
37
+
38
+ puts "Compiling " + appName + " (" + appPath + ")"
39
+
40
+ if sdkType == "ext"
41
+ sdkVersion = appConfig.extVersion
42
+ excludes = "ExtDependencies.js"
43
+ sdkPath = weblib + "/" + sdkVersion
44
+
45
+ else
46
+ sdkVersion = appConfig.touchVersion
47
+ excludes = "TouchDependencies.js"
48
+ sdkPath = weblib + "/" + sdkVersion
49
+
50
+ # Sencha Touch 2.1.0 has a bug that prevents compilation. The file containing
51
+ # the bug is not required for the bootstrap file so we move it to a temp file
52
+ # during the compilation and restore it
53
+ tmpDir = Dir.tmpdir
54
+ FileUtils.mv(sdkPath + "/src/ux/auth2", tmpDir + "_senchatouch_auth2")
55
+ end
56
+
57
+ begin
58
+ cmd = "sencha -d -sdk=" + sdkPath + " compile" +
59
+ " -classpath=" +
60
+ appPath + "/app.js," +
61
+ appPath + "/app," +
62
+ weblib + "/" + appConfig.adaptrexVersion + "/src" +
63
+ " exclude -all" +
64
+ " and include -r -f " + appPath + "/app.js" +
65
+ " and save appset" +
66
+ " and exclude -all" +
67
+ " and include -r -f " + excludes +
68
+ " and save bootstrapexcludes" +
69
+ " and exclude -all" +
70
+ " and include -s appset and exclude -s bootstrapexcludes" +
71
+ " and concat " + appPath + "/app-all-debug.js" +
72
+ " and concat -compress " + appPath + "/app-all.js"
73
+ compileOutput = `#{cmd}`
74
+
75
+ if compileOutput.include?"[ERR]"
76
+ puts((appName + " (" + appPath + ")").err)
77
+ puts "See the output from Sencha Cmd for more information".indent
78
+ puts "-----\n" + cmd + "\n-----\n" + compileOutput + "-----\n\n"
79
+ else
80
+ print((appName + " (" + appPath + ")").success)
81
+ puts ""
82
+ end
83
+
84
+ ensure
85
+ # Move the broken auth2 ux back to the original Sencha Touch source folder
86
+ if not sdkType == "ext"
87
+ FileUtils.mv(tmpDir + "_senchatouch_auth2", sdkPath + "/src/ux/auth2")
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ end
@@ -0,0 +1,74 @@
1
+ require "fileutils"
2
+
3
+ class DeleteTool
4
+ def initialize(appConfig)
5
+ @appConfig = appConfig
6
+ promptForDeletion
7
+ end
8
+
9
+ def promptForDeletion
10
+ @appInfoList = []
11
+ @appPages = @appConfig.pages
12
+
13
+ if @appPages.length < 1
14
+ puts "There are no pages to delete.".warn
15
+ return
16
+ end
17
+
18
+ puts "Page List".blue
19
+
20
+ index = 0
21
+ @appPages.sort.map.each {|appPath,appValue|
22
+ appName = appValue.split(",")[0]
23
+ @appInfoList.push({
24
+ "name" => appName,
25
+ "path" => appPath,
26
+ "text" => appName + " (" + appPath + ")"
27
+ })
28
+ i = index + 1
29
+ if i < 10 then pad = " " else pad = "" end
30
+ puts " [" + pad + i.to_s + "] " + appName + " (" + appPath + ")"
31
+ index += 1
32
+ }
33
+ puts ""
34
+
35
+ appToDelete = promptForApplication
36
+ puts "Are you sure you want to delete " + appToDelete["text"] + ")?".warn
37
+ print "Type 'DELETE' to confirm: ".indent
38
+ confirm = STDIN.gets.chomp
39
+
40
+ if confirm == "DELETE"
41
+ FileUtils.rm_rf(appToDelete["path"])
42
+ @appConfig.pages.delete(appToDelete["path"])
43
+ @appConfig.write
44
+ puts((appToDelete["text"] + " has been deleted\n\n").success)
45
+ else
46
+ puts "Your app (page) was not deleted".warn
47
+ end
48
+
49
+ print "Do you want to delete another page? [n]: "
50
+ doAnother = STDIN.gets.chomp.downcase
51
+ if (doAnother == "y" or doAnother == "yes")
52
+ puts ""
53
+ return promptForDeletion
54
+ end
55
+ end
56
+
57
+ def promptForApplication
58
+ print "Which page do you want to delete? : "
59
+ selection = STDIN.gets.chomp
60
+ len = @appPages.length
61
+ erm = ("Invalid selection. Enter a number from 1 to " + len.to_s).warn
62
+ if not selection.numeric?
63
+ puts erm
64
+ return promptForApplication
65
+ end
66
+ selection = Integer(selection)
67
+ if not selection === 1..len
68
+ puts erm
69
+ return promptForApplication
70
+ end
71
+ return @appInfoList[selection - 1]
72
+ end
73
+
74
+ end