You can subscribe to this list here.
| 2004 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(447) |
Nov
(163) |
Dec
(57) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2005 |
Jan
(172) |
Feb
|
Mar
(123) |
Apr
(64) |
May
(1) |
Jun
(278) |
Jul
(89) |
Aug
(97) |
Sep
(62) |
Oct
(53) |
Nov
(119) |
Dec
(60) |
| 2006 |
Jan
(76) |
Feb
(1094) |
Mar
(363) |
Apr
(163) |
May
(57) |
Jun
(43) |
Jul
(39) |
Aug
(15) |
Sep
(33) |
Oct
(62) |
Nov
(8) |
Dec
|
| 2007 |
Jan
(9) |
Feb
(34) |
Mar
(2) |
Apr
(14) |
May
(8) |
Jun
(40) |
Jul
(21) |
Aug
(1) |
Sep
(20) |
Oct
(15) |
Nov
(26) |
Dec
|
| 2008 |
Jan
(1) |
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(3) |
Oct
|
Nov
|
Dec
(1) |
| 2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(32) |
Jun
|
Jul
|
Aug
(3) |
Sep
(3) |
Oct
|
Nov
|
Dec
|
| 2010 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2011 |
Jan
|
Feb
|
Mar
(2) |
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(7) |
Dec
|
| 2012 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/testSuperStress In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969/testSuperStress Added Files: description name testCase testClock testExternalDatabaseAccess testFile testGarbageCollection testLists testLocalDatabaseAccess testLocals testLoops testMacFileHandling testMath testMisc testNesting testObjects testOp testRegularExpressions testSizeOf testString testSys testThreads testTryElse testTypeOf testXML Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: testXML --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testLocals --- FrontierVcsFile:1:scpt:suites.fUnit.testSuperStress.testLocals on testLocals () { local (a = 1, b = 2, c = 3); bundle { local (a = 4, b = 5, c = 6); assertEqual(a+b+c, 15, "a+b+c should equal 15. Instead it equals " + (a+b+c) + ".")}; assertEqual(a+b+c, 6, "a+b+c should equal 6. Instead it equals " + (a+b+c) + ".")} --- NEW FILE: testFile --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testClock --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testSizeOf --- FrontierVcsFile:1:scpt:suites.fUnit.testSuperStress.testSizeOf on testSizeOf () { local (e = "sizeof is broken."); assertEqual(sizeof('A'), 1, e); assertEqual(sizeof('XXXX'), 4, e); assertEqual(sizeof(true), 1, e); assertEqual(sizeof(number(1)), 4, e); assertEqual(sizeof("123456789"), 9, e); assertEqual(sizeof(clock.now()), 4, e); assertEqual(sizeof(up), 1, e); assertEqual(sizeof(@system.misc), 11, e); assertEqual(sizeof(point.set(12, 24)), 4, e); assertEqual(sizeof(single(1)), 4, e); if system.environment.isMac { assertEqual(sizeof(double(2)), 8, e); assertEqual(sizeof(fixed), 2, e); assertEqual(sizeof(rectangle.set(12, 24, 36, 48)), 8, e)}; if system.environment.isWindows { assertEqual(sizeof(double(2)), 10, e)}}; bundle { //debug code fUnit.runners.run (parentOf(this^), testCaseToRun: this)} --- NEW FILE: testString --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testMacFileHandling --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testMisc --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testMath --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testRegularExpressions --- FrontierVcsFile:1:scpt:suites.fUnit.testSuperStress.testRegularExpressions on testRegularExpressions () { assert (defined (system.compiler.["kernel"].re), "The regular expressions verbs are not implemented in this application."); bundle { //re.match local (cp, matchInfo, s1 = "a123four", s2 = "bop bebe bop"); cp = re.compile ("[a-zA-Z]+[0-9]+"); assert (re.match (cp, s1, adrMatchInfoTable:@matchInfo), "re.match is broken."); assertEqual (matchInfo.matchString, "a123", "re.match is broken."); cp = re.compile ("(be){1,2}"); assert (re.match (cp, s2, adrMatchInfoTable:@matchInfo), "re.search is broken."); assertEqual (matchInfo.matchString, "bebe", "re.search is broken.")}; bundle { //re.extract local { cp; complexLinkPat = "<a[ \t\r\n]*[^>]*href[ \t\r\n]*=[ \t\r\n]*\"?([-_~%@:/\\.A-Za-z0-9]+)\"?[^>]*>([^<]*)"; simpleLinkPat = "<a[ \t\r\n]+[^>]*href[ \t\r\n]*=[ \t\r\n]*\"([^\"]*)\"[^>]*>([^<]*)"; s = string (re.testing.data.html); theList}; cp = re.compile (simpleLinkPat); theList = re.extract (cp, s, {2,1}); assertEqual (sizeOf (theList), 59, "re.extract is broken."); assertEqual (theList[57][1] , "Roget's Thesaurus:", "re.extract is broken."); assertEqual (theList[57][2] , "http://www2.thesaurus.com/thesaurus/", "re.extract is broken."); cp = re.compile (complexLinkPat); theList = re.extract (cp, s, {2,1}); assertEqual (sizeOf (theList), 59, "re.extract is broken."); assertEqual (theList[25][1] , "FileMaker", "re.extract is broken."); assertEqual (theList[25][2] , "http://www.scripting.com/apps/filemaker.html", "re.extract is broken.")}; bundle { //re.grep local (cp); local (theList = {"aa", "aab", "a", "ab", ""}); local (s = "aa\raab\ra\rab\r\r"); cp = re.compile ("^aa"); assertEqual (re.grep (cp, theList), {"aa", "aab"}, "re.grep is broken."); assertEqual (re.grep (cp, s), {"aa", "aab"}, "re.grep is broken."); assertEqual (re.grep (cp, theList, flIncludeMatches:false), {"a", "ab", ""}, "re.grep is broken."); assertEqual (re.grep (cp, theList, flIncludeMatches:false), {"a", "ab", ""}, "re.grep is broken.")}; bundle { //re.join local (listA = {"a", "b", "c"}, listB = {"abcd", "", "efgh", ""}); assertEqual (re.join ("|", listA), "a|b|c", "re.join is broken."); assertEqual (re.join ("", listA), "abc", "re.join is broken."); assertEqual (re.join ("+/+", listB), "abcd+/++/+efgh+/+", "re.join is broken.")}; bundle { //re.split local (cp); local (s = "<title>test</title>\r<body>\rtest body\r</body>"); cp = re.compile ("<[^>]*>"); assertEqual (re.split (cp, s), {"", "test", "\r", "\rtest body\r", ""}, "re.split is broken."); assertEqual (re.split (cp, s, maxSplits:4), {"", "test", "\r", "\rtest body\r</body>"}, "re.split is broken."); cp = re.compile ("(<[^>]*>)"); assertEqual (re.split (cp, s), {"", "<title>", "test", "</title>", "\r", "<body>", "\rtest body\r", "</body>", ""}, "re.split is broken."); assertEqual (re.split (cp, s, maxSplits:3), {"", "<title>", "test", "</title>", "\r<body>\rtest body\r</body>"}, "re.split is broken."); local (s2 = "aBcDeFg"); cp = re.compile ("[a-z]+", flCaseSensitive:true); assertEqual (re.split (cp, s2), {"", "B", "D", "F", ""}, "re.split is broken."); cp = re.compile ("[^a-z]+", flCaseSensitive:true); assertEqual (re.split (cp, s2), {"a", "c", "e", "g"}, "re.split is broken."); cp = re.compile ("[A-Z]+", flCaseSensitive:true); assertEqual (re.split (cp, s2), {"a", "c", "e", "g"}, "re.split is broken."); cp = re.compile ("[^A-Z]+", flCaseSensitive:true); assertEqual (re.split (cp, s2), {"", "B", "D", "F", ""}, "re.split is broken.")}; bundle { //re.replace local (cp, ct); local (s = "To be or not to be", s2); cp = re.compile ("(be)"); s = re.replace (cp, "\\1BOP", s); assertEqual (s, "To beBOP or not to beBOP", "re.replace is broken."); cp = re.compile ("(be)(bop)", flCaseSensitive:false); s = re.replace (cp, "\\2\\1", s); assertEqual (s, "To BOPbe or not to BOPbe", "re.replace is broken."); cp = re.compile ("(BOP)(be)"); s = re.replace (cp, "\\2\\1", s, maxReplacements:1); assertEqual (s, "To beBOP or not to BOPbe", "re.replace is broken."); cp = re.compile ("(BOP)(be)"); s = re.replace (cp, "\\2\\1", s, adrReplacementCount:@ct); assertEqual (s, "To beBOP or not to beBOP", "re.replace is broken."); assertEqual (ct, 1, "re.replace is broken."); local (test = "Check http://www.muppets.com/~gonzo/ for more info, send your q's to mailto:go...@mu...."); local (result = "Check <A HREF=\"http://www.muppets.com/~gonzo/\">http://www.muppets.com/~gonzo/</A> for more info, send your q's to <A HREF=\"mailto:go...@mu...\">mailto:go...@mu...</A>."); cp = re.compile ("(http|mailto)(:[/]*[A-Za-z0-9]+[-_~%@:/\\.A-Za-z0-9]+[A-Za-z/0-9])"); test = re.replace (cp, "<A HREF=\"\\1\\2\">\\0</A>", test); assertEqual (test, result, "re.replace is broken.")}; bundle { //re.visit local (hits = 0); local (test = " <A href ='index.html' > <A href= 'index2.html' > "); on testCallback (adrTable) { case ++hits { 1 { assertEqual (adrTable^.matchOffset, 2, "re.visit is broken."); assertEqual (adrTable^.matchLength, 25, "re.visit is broken."); assertEqual (adrTable^.matchString, "<A href ='index.html' >", "re.visit is broken.")}; 2 { assertEqual (adrTable^.matchOffset, 28, "re.visit is broken."); assertEqual (adrTable^.matchLength, 33, "re.visit is broken."); assertEqual (adrTable^.matchString, "<A href= 'index2.html' >", "re.visit is broken.")}} else { abort ("re.visit is broken.")}; return (true)}; local (cp = re.compile ("<([^>]+)>")); re.visit (cp, test, @testCallback); assertEqual (hits, 2, "re.visit is broken.")}; bundle { //re.expand local (pat, mi); pat = re.compile ("(?P<date>(?P<year>(\\d\\d)?\\d\\d)-(?P<month>\\d\\d)-(?P<day>\\d\\d))", flAutoCapture:false); assert (re.match (pat, "2003-05-30", adrMatchInfoTable:@mi, flMakeGroups:true, flMakeNamedGroups:true), "re.match is broken"); assertEqual (re.expand ("\\g<date>", @mi), "2003-05-30", "re.expand is broken."); assertEqual (re.expand ("\\g<day>.\\g<month>.\\g<year>", @mi), "30.05.2003", "re.expand is broken."); assertEqual (re.expand ("\\g<4>.\\g<3>.\\g<2>", @mi), "30.05.2003", "re.expand is broken."); assertEqual (re.expand ("\\4.\\3.\\2", @mi), "30.05.2003", "re.expand is broken."); temp.mi = mi}; bundle { //group references local (cp, s = "To beBOP or not to beBOP", mi); cp = re.compile ("(?P<a>be)(?P<b>bop)", flCaseSensitive:false); assert (re.match (cp, s, adrMatchInfoTable:@mi, flMakeGroups:true, flMakeNamedGroups:true), "named groups are broken in re.match"); assertEqual (mi.namedGroups.a.groupNumber, 1, "named groups are broken in re.match"); assertEqual (mi.namedGroups.a.matchString, "be", "named groups are broken in re.match"); assertEqual (mi.namedGroups.a.matchOffset, 4, "named groups are broken in re.match"); assertEqual (mi.namedGroups.a.matchLength, 2, "named groups are broken in re.match"); assertEqual (mi.namedGroups.b.groupNumber, 2, "named groups are broken in re.match"); assertEqual (mi.namedGroups.b.matchString, "BOP", "named groups are broken in re.match"); assertEqual (mi.namedGroups.b.matchOffset, 6, "named groups are broken in re.match"); assertEqual (mi.namedGroups.b.matchLength, 3, "named groups are broken in re.match"); assertEqual (re.replace (cp, "\\g<b>\\g<a>", s), "To BOPbe or not to BOPbe", "named groups are broken in re.replace"); cp = re.compile ("(?P<x>be)(?P<xy>bop)", flCaseSensitive:false); assertEqual (re.replace (cp, "\\g<xy>\\g<x>", s), "To BOPbe or not to BOPbe", "named groups are broken in re.replace"); cp = re.compile ("(?P<x>be)(?P<xx>bop)", flCaseSensitive:false); assertEqual (re.replace (cp, "\\g<xx>\\g<x>", s), "To BOPbe or not to BOPbe", "named groups are broken in re.replace"); cp = re.compile ("(?P<x>be)(?P<xz>bop)", flCaseSensitive:false); assertEqual (re.replace (cp, "\\g<xz>\\g<x>", s), "To BOPbe or not to BOPbe", "named groups are broken in re.replace")}}; bundle { //debug code fUnit.runners.run (parentOf(this^), testCaseToRun: this)} --- NEW FILE: testTryElse --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testNesting --- FrontierVcsFile:1:scpt:suites.fUnit.testSuperStress.testNesting on testNesting () { local (username = user.prefs.name); on xxx (name) { return (string.lower (name))}; if (xxx (username) != string.lower (username)) { scriptError ("Local handlers feature is broken.")}; bundle { on xxx (name) { return (string.upper (username))}; if (xxx (username) != string.upper (username)) { scriptError ("Local handlers feature is broken.")}}} --- NEW FILE: testOp --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testObjects --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testSys --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testLocalDatabaseAccess --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testLists --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testExternalDatabaseAccess --- FrontierVcsFile:1:scpt:suites.fUnit.testSuperStress.testExternalDatabaseAccess on testExternalDatabaseAccess () { local (f); if system.environment.isMac { f = file.getSpecialFolderPath ("", "desktop folder", false)} else { f = file.getSpecialFolderPath ("", "desktop", false)}; f = f + "testing.root"; local (x, n, s = "scratchpad"); if not file.exists (f) { db.new (f)}; db.open (f, false); if not db.defined (f, s) { db.newTable (f, s)}; n = db.countItems (f, s); if n == 0 { db.setValue (f, s + ".test", user.prefs)}; s = s + '.' + db.getNthItem (f, s, 1); x = db.getValue (f, s); db.setValue (f, "scratchpad.bTable", x); db.save (f); db.close (f); db.open (f, true); x = db.getValue (f, "scratchpad.bTable"); db.close (f); file.delete (f); assertEqual(string(x), string(user.prefs), "The db verbs are broken.")}; bundle { //debug code fUnit.runners.run (parentOf(this^), testCaseToRun: this)} --- NEW FILE: testLoops --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testCase --- FrontierVcsFile:1:scpt:suites.fUnit.testSuperStress.testCase on testCase () { local (i, ct); ct = 0; for i = 1 to 8 { case i { 1 { ct = ct + 1}; 2 { ct = ct + 10}; 3; 7 { ct = ct + 100}; 4; 8 { ct = ct + 1000}; 5 { ct = ct + 10000}} else { ct = ct + 100000}}; assertEqual(ct, 112211)} --- NEW FILE: testThreads --- (This appears to be a binary file; contents omitted.) --- NEW FILE: name --- FrontierVcsFile:1:TEXT:suites.fUnit.testSuperStress.name SuperStress --- NEW FILE: description --- FrontierVcsFile:1:wptx:suites.fUnit.testSuperStress.description These test scripts are derived from the SuperStress test suites as referenced at http://kernel.scripting.com/discuss/msgReader$43?mode=day . Because I am a Windows developer, I was not able to convert and test the Apple aspects of the stress test suite. If you are a mac developer, please help me out by doing so and removing this message. As I convert them I am deleting them, so anything left in fUnit.testing is yet to be converted. The following changes to SuperStress, beyond the use of assert*, have been made: * testClock does not copy the code that checked root's children and asserted their creating and modification time were between 1990 and 2000. It is replaced by code that creates an object in the scratchpad, checks that the creation time is within a second of now, waits a second, modifies the value, and checks that the modification time has changed. (It keeps the check on Frontier.isRuntime because I don't know what that is.) * testMacOSXFileHandling has been converted, but since I can't run it the original has been left behind in case I made an error. I may have screwed up the initial test for OS, too. A couple of tests that look like they should run have been uncommented. "time consuming stuff every 4 calls or so" has been promoted to every call for obvious reasons. There is a test that looks broken in "bundle // test 5.0.1 verbs", checking for osMacOS to see if the line feed is \n; seems incomplete. * testLists has a Mac-specific chunk, though I don't see what is Mac specific about it and it passes on my Frontier so I've added an "|| 1" to the if clause. If no one tells me otherwise a later release will remove the if so the code always runs. * testMisc has a mac-only portion I didn't translate. --- NEW FILE: testTypeOf --- FrontierVcsFile:1:scpt:suites.fUnit.testSuperStress.testTypeOf on testTypeOf () { on testIt (val, type) { assertEqual(typeOf(val), type, "typeOf (" + string (val) + ") should have been '" + type + "', but was '" + typeOf (val) + "\'.")}; testIt ('A', charType); testIt ('XXXX', string4Type); testIt (true, booleanType); testIt (number (1), longType); testIt ("123456789", stringType); testIt (clock.now (), dateType); testIt (up, directionType); testIt (@system.misc, addressType); testIt (point.set (12, 24), pointType); testIt (rectangle.set (12, 24, 36, 48), rectType); testIt (single (1), singleType); testIt (double (2), doubleType); if (sys.os() == osMacOS) { testIt (objectModel.high, enumeratorType); testIt (fixed (3), fixedType)}; testIt ({}, listType); testIt (record ({}), recordType); assertEqual(typeOf(system), tableType, "typeOf is broken")} --- NEW FILE: testGarbageCollection --- FrontierVcsFile:1:scpt:suites.fUnit.testSuperStress.testGarbageCollection on testGarbageCollection () { // a loop that really stresses garbage collection local (i, s, t); for i = 1 to 10 { s = "a" + "a" + "a" + "a" + "a" + "a" + "a" + "a" + "a" + "a" + "a" + "a" + "a" + "a"; t = "z" + "z" + "z" + "z" + "z" + "z" + "z" + "z" + "z" + "z" + "z" + "z" + "z" + "z"; assertEqual(sizeof(s), sizeof(t), "Something is wrong with the tmpstack.")}} |
|
From: Andre R. <and...@us...> - 2006-02-18 22:51:23
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/engine In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969/engine Added Files: initializeResultsTable isTestCase isTestSuite runTestSuite Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: runTestSuite --- (This appears to be a binary file; contents omitted.) --- NEW FILE: isTestCase --- (This appears to be a binary file; contents omitted.) --- NEW FILE: isTestSuite --- (This appears to be a binary file; contents omitted.) --- NEW FILE: initializeResultsTable --- FrontierVcsFile:1:scpt:suites.fUnit.engine.initializeResultsTable on initializeResultsTable (tblAdr) { new (tableType, tblAdr); new (tableType, @tblAdr^.passed); new (tableType, @tblAdr^.failed); new (tableType, @tblAdr^.aborted)} |
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969 Added Files: documentation getTempTableAdr init menu readMe registerTestSuite suiteName unregisterTestSuite Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: getTempTableAdr --- (This appears to be a binary file; contents omitted.) --- NEW FILE: menu --- FrontierVcsFile:1:mbar:suites.fUnit.menu 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 --- NEW FILE: documentation --- FrontierVcsFile:1:optx:suites.fUnit.documentation fUnit fUnit is a Unit Testing framework for the Usertalk environment in Frontier. It is modelled around the standard xUnit framework, for example as seen in JUnit and PyUnit, and adapted for Frontier to take advantage of its unique strengths. About Unit Testing (Unit Testing Advocacy) Unit testing boils down to a series of call to a variety of "assert" functions that "assert" that various things are true at testing time, organized in a particular way that allows a "Unit Testing Framework" to fully automatically execute the tests upon demand, and give a "pass/fail" for the test run. (fUnit also adds an "abort" category which is very useful but commonly missing from xUnit implementations.) The advantages of Unit Testing are: Organization: Unit tests are organized in a way that makes them easy to write, easy to keep around, and easy to execute again and again. *Everybody* writes test scripts, but test scripts are frequently discarded, and even if they are kept around, each developer writes their own. In fact, this suite ships with testSuperStress, where "SuperStress" is just such a salvaged test suite. Now that it is in the framework, we can use all of the framework features, and easily run it at will, in conjunction with other test suites. Framework: fUnit provides a framework with useful features that you don't have to implement yourself. fUnit collects test results in a standard fashion, and allows to use pre-supplied renderers for those (such as the one that displays the results as HTML) or easily write your own. It supplies common functions for testing, such as "assertErrors", and a function to retrieve a stack dump and output it in a standard format in the test results. This way, features can be added to all the test suites at once (like maybe running from a network) without changing the tests. Automatically: Nobody runs tests manually unless it is as easy as pushing a button. Ideally, a project should get it to the point where it doesn't even require that, running tests automatically on commits or periodically. For that, you need standardized tests. Network effects: These advantages combine multiplicatively, not additively, and cause other effects. One of the most exciting is how much easier Unit Testing makes it to refactor code, with confidence that the relevant properties are retained. The first time you massively refactor code and all the old unit tests pass, plus a batch of new ones, you will be a convert. The other exciting one is they save you much, much more time than they cost you ... Unit testing... just try it once for a significant project. Some people push "Test First Development", where you write the tests first and then write the code. I think this is less useful in a dynamic environment like Frontier where it is easy to move functions around, and you're writing experimental code, which stuff in Frontier commonly is. Still, it is worth a try to see if it will work for you. Test Structure fUnit structures its tests in the following manner: "Test Cases" are scripts that start with the word "test", and make use of the various "assert" functions provided by the framework. They can not be run directly. "Test Suites" are Frontier tables that start with the word "test" that contain a collection of test cases. In addition to the test cases, test suites may also contain the following in the table: A string attribute "name", which will be used as the human name of the test case. By default, the name of the table will be used, but it can be inconvenient to have spaces and such in the table name. A string attribute "description", which will be used as the description of the test suite when it is run. By default, this is empty. Another Test Suite. Addresses that point at other Test Suites will be regarded as being an included test suite. (This is useful for aggregating multiple test suites together with needing them to be close in the ODB.) Addresses that point at Test Cases will be regarded as test cases for this suite. A script named "setup" can be included to set up a testing environment that will be used by multiple scripts. The return value of setup will be passed to the test case to use as it wills. Note this script is called for every individual test case, not once for each suite. Errors in this script will halt the execution of the test suite, and teardown will not be called on that run; depending on the contents of the script you may need to manually validate the state of the resources "setup" was responsible for. A script named "teardown" can be included which will be passed the parameter created by "setup" (if any) and can be used to uninitialize any resources like sockets used by the test. Errors in this script will halt the execution of the test suite; depending on the contents of this script and "setup" you may need to manually validate the state of the resources "setup" and "teardown" were responsible for. A "Test Runner" is something that knows how to run tests, and displays the output in some format. Most people won't need to write these. fUnit ships with two Test Runners by default, described in children. Writing a new test runner is easy; run "runTestSuite" with the desired parameters and process the resulting result table or scriptError (in case of setup, teardown, or fUnit code failures). Change the Test Runner fUnit use by default in its menu commands by either setting user.fUnitRunner to the address of your desired Test Runner script, or use the fUnit menu to select one via the "Select Default Runner" option. The "default" test runner simply displays the results table on the screen. You can see the results as they are collected. The "HTML" test runner will output the results of the test as an HTML page and use webbrowser.displayText to display it. It will also nicely format stack traces, when thread.getStackDump is fixed. Generally speaking, a Test Runner is used to interpret the run of a Test Suite, which runs other Test Suites and Test Cases. The relevant menu options in the fUnit menu all use the Test Runner you specify in user.fUnitRunner. Along with the user test suites, fUnit maintains a global test suite which can be used to run all registered tests at once. To register your test suite, call "fUnit.registerTestSuite" with the address to your test suite. All future runs of "fUnit.runAllTests" will now include your test suite. You can call "fUnit.unregisterTestSuite" with the same address to unregister your suite later. (Menu commands for both of these are included for your convenience.) Note that anything included in a test suite that does not match the rules above will be ignored by fUnit, so you can use the suites to store test data or other scripts for use by your test cases. Creating Your Own Test Suite To create your own test suite, create a table starting with the word "test", which I will refer to as "testSuite" for the remainder of this section. (The test suite created by following these directions is available in fUnit.testSuiteSkeleton, which you can also copy and paste.) Create a string value named "name" and enter the name of your suite. Create a string value name "description", and enter a description for your suite. Create a script named "setup", taking no parameters. Create a script named "teardown", taking one parameter, the value returned by setup. Create a test script, starting with the word "test", taking an opitional parameter from the setup script. Use the "Assert Functions", documented below, to test various things. If you install the menu for fUnit, you can now successfully run this test case and see one passed test. menu.install(@fUnit.menu) // hit CTRL-/ while this line is focused to install the menu Testing By Example The tests decribed here are included in the table fUnit.exampleUnitTests, and are already included in the fUnit global test suite when shipped. testSimple testSimple is basically the simplest possible test that has both a failing line and a successful line. It looks like this: on testSimple (setupParam = nil) assert(1 == 1) assert(1 == 2, "Who could ever think 1 == 2?") scriptError("Never get here.") Note the "setupParam = nil" part of the script definition. This test suite does not have a "setup" script, so there is no setupParm passed to "testSimple". However, someday you may add a "setup" script. Using "setupParm = nil" future-proofs your test against that eventuality. The next line calls "assert" with the value "true", which is what 1 == 1 evaluates to. (Try it; put the cursor in the child node of this one and hit "CTRL-/", and Frontier will evaluate the node and show the result as a comment.) Since assert was called with a true value, it immediately returns and does nothing. 1 == 1 After that, assert is called with 1 == 2, which is false. This means "assert" will fail, and the test script will terminate. The second optional parameter is the message which will be sent back out to the test system as the reason the test failed. (Note there is currently a rather small limit on how large that message may be.) 1 == 2 Since the test stops execution after a failed assert, the third "scriptError" line will never be executed. This test shows as a failure, as a result of the second line. testSuperStress SuperStress provides examples of a lot of nitty-gritty Frontier testing. Running Test Suites or Test Cases Test Suites or Test Cases should be run by running one of the scripts in fUnit.runners. fUnit.runners.run will use the user's declared preference (an address to a runner script at user.fUnitRunner), so it should be used unless there is a good reason not to. Runners have the following signiture: run(suiteAdr, testCaseToRun = nil, allowErrorsOut = false) suiteAdr is the address of the test suite to run. testCaseToRun is an optional address of a specific test case to run. It should come from the suite defined by suiteAdr, but this is not checked for. If not given, all test cases and suites will be run. allowErrorsOut is a parameter that allows you to prevent the framework from catching the errors generated by the test suites. This allows them to propogate all the way out to the user level, where you can use the usual "Error Info" dialog box to diagnose the problem. (See "Debugging Hints" at the end of this document.) Assert Functions assert(booleanResult, message = nil) assert is the basic assertion function for test suites. The first parameter is a boolean result, usually of some relatively complicated expression that evaluates to a boolean, not true or false directly. message is a string that will be used as the reason for failure, if one is given. Otherwise, a generic error message will be used. When assert(false) is called, the test case ceases running; put any necessary cleanup in "teardown". Examples: assert("abcdefg" contains "abc") // succeeds assert("23" contains "4", "The digit '4' is not in '23'") // note Frontier has no access to the expression, so make your error messages count assertEqual(value1, value2, message = nil) assertEqual checks that the two values it is passed are equal. If they are not, execution of the test case terminates. This is a convenience function for a common case; it allows the test framework to include value1 and value2 in the resulting error message. If the optional message parameter is passed, it will be used in addition to the default message. Example: assertEqual(1, 2, "1 is not equal to 2") assertNotEqual(value1, value2, message = nil) Same as assertEqual, just inverts the test. Example: assertNotEqual(1, 2, "1 is equal to 2?!?") assertErrors(scriptAdr, errorFragment = nil, failMessage = nil) assertErrors validates that some piece of code correctly throws a scriptError. scriptAdr is the address of a script to test, which will be called with no arguments. This is typically an embedded function; see example. errorFragment is an optional string which will be looked for in the resulting error; if it is not found, the test will fail even if the script errors. This allows the test framework to ensure the correct error is thrown, and its use is highly recommended. Otherwise, any error will be accepted as a passing assert. failMessage will be added to the error report produced by assertErrors if the assertion fails. Note that scriptErrors are limited in length, and with everything this function tries to jam into the error message, it may overflow that length. Example: Test for "division by 0" error on divideByZero() 1 / 0 assertErrors(@divideByZero, "divide by zero") scriptError It is permissible for a test to fail with a normal scriptError, and the text of the error thrown will be used as the reason the test failed in the results. However, fUnit will not be able to obtain the stack dump for the scriptError you throw, and your test may miss out on later such features fUnit adds for error testing, such as convenient jumping to the error. scriptError should be used as a last resort, or possibly for importing other test scripts into an fUnit test suite with a minimum of changes. abort(reason) Calling abort in a test case will terminate the execution of the test case, just like a failed assert. The first argument is the reason for the abort. Abort should be used for tests that are not applicable to the current environment, or can not be run in the current environment. An aborting test indicates to the person running the tests that they should look at the reason given for the abort to see if it can be corrected, or if it is acceptable. Examples for aborting include: Platform specific tests being run on a different platform (see testSuperStress.testMacFileHandling), or tests that require access to a password protected resource which can not be distributed with a password for security reasons, requiring the user to set up a password somewhere, such as Manila XML-RPC client testing. Other Shipped Functions registerTestSuite(adr) Registers a test suite in the global test suite, run when the "Run Global Suite" option in the menu is chosen. unregisterTestSuite(adr) Unregisters a test suite registered with registerTestSuite. getTempTableAdr() Returns the address of a table that can be used as a temporary table. The table returned by this function will be automatically deleted at the end of the test suite execution, so it can be safer to use than alternative table creation mechanisms. fUnit Menu The fUnit menu can be installed by executing the following command: menu.install(@fUnit.menu) // CTRL-/ while the cursor is on this line will execute it The fUnit menu includes convenience functions to run the currently focused test suite or test case (with or without immediate errors), add the test suite to the global test suite, set the default runner, or run the global test suite in an infinite loop. Debugging Hints Two debugging hints that took me a while to learn: The Error Info dialog box, if you hold the mouse button over the "Go To" button, will give you a stack trace, which can be used to jump anywhere in the call stack. This is especially useful in the context of fUnit where the error always occurs in the test case, which isn't terribly useful information. While debugging a script, the Quick Script window is in the context of the script being currently debugged. You can run expressions from "inside" the script and see the results. --- NEW FILE: suiteName --- FrontierVcsFile:1:TEXT:suites.fUnit.suiteName fUnit --- NEW FILE: unregisterTestSuite --- FrontierVcsFile:1:scpt:suites.fUnit.unregisterTestSuite on unregisterTestSuite (adr) { delete(@fUnit.testGlobalSuite[string(adr)])} --- NEW FILE: readMe --- FrontierVcsFile:1:wptx:suites.fUnit.readMe This is the fUnit suite. Created by Jeremy Bowers who wants the Frontier Community to maintain and improve fUnit. [Why I Wrote It] [What It Does] [Things To Watch Out For] --- NEW FILE: init --- (This appears to be a binary file; contents omitted.) --- NEW FILE: registerTestSuite --- FrontierVcsFile:1:scpt:suites.fUnit.registerTestSuite on registerTestSuite (adr) { fUnit.testGlobalSuite[string(adr)] = adr} |
|
From: Andre R. <and...@us...> - 2006-02-18 22:51:23
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/runners In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969/runners Added Files: default html run Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: default --- (This appears to be a binary file; contents omitted.) --- NEW FILE: html --- (This appears to be a binary file; contents omitted.) --- NEW FILE: run --- (This appears to be a binary file; contents omitted.) |
|
From: Andre R. <and...@us...> - 2006-02-18 22:51:23
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/originalSuperStressRemnants In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969/originalSuperStressRemnants Added Files: miscAppleScript Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: miscAppleScript --- FrontierVcsFile:1:scpt:suites.fUnit.originalSuperStressRemnants.miscAppleScript on miscAppleScript of x from y between z -- AppleScript test for testing.scripts.OSA return |string.kBytes| (|fUnit.testSuperStress.data.miscUserTalk| (first item of x, y, z)) end |
|
From: Andre R. <and...@us...> - 2006-02-18 22:51:23
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/contextForTests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969/contextForTests Added Files: abort assert assertEqual assertErrors assertNotEqual getStackDump Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: assertNotEqual --- FrontierVcsFile:1:scpt:suites.fUnit.contextForTests.assertNotEqual on assertNotEqual (parm1, parm2, message = "") { local (restOfMessage = "\"" + string(parm1) + "\" is equal to \"" + string(parm2) + "\"."); if message { assert(parm1 != parm2, message + " (" + restOfMessage + ")")} else { assert(parm1 != parm2, restOfMessage)}} --- NEW FILE: getStackDump --- (This appears to be a binary file; contents omitted.) --- NEW FILE: assertErrors --- FrontierVcsFile:1:scpt:suites.fUnit.contextForTests.assertErrors on assertErrors (scriptAdr, errorFragment = nil, failMessage = nil) { try { scriptAdr^()} else { if errorFragment { if tryError contains errorFragment { return} // success else { getStackDump(); local (errorMessage ="assertErrors' script gave the wrong error. assertError was looking for \"" + errorFragment + "\", but could not find it in the error message \"" + tryError + "\"."); if failMessage { scriptError(failMessage + " (" + errorMessage + ")")} else { scriptError(errorMessage)}}} else { // errored and no more detail to check return}}; // didn't script error at all getStackDump(); if failMessage { scriptError(failMessage + " (Didn't error at all.)")} else { scriptError("assertErrors' script did not error.")}} --- NEW FILE: assert --- FrontierVcsFile:1:scpt:suites.fUnit.contextForTests.assert on assert (result, message = nil) { if result { return} else { if message { scriptError(message)} else { scriptError("Assertion failed")}}} --- NEW FILE: abort --- FrontierVcsFile:1:scpt:suites.fUnit.contextForTests.abort on abort (reason) { scriptError("[aborted]" + reason)} --- NEW FILE: assertEqual --- FrontierVcsFile:1:scpt:suites.fUnit.contextForTests.assertEqual on assertEqual (parm1, parm2, message = "") { local (restOfMessage = "\"" + string(parm1) + "\" is not equal to \"" + string(parm2) + "\"."); if message { assert(parm1 == parm2, message + " (" + restOfMessage + ")")} else { assert(parm1 == parm2, restOfMessage)}} |
|
From: Andre R. <and...@us...> - 2006-02-18 22:51:23
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/testfUnit2/testTearDownFailure In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969/testfUnit2/testTearDownFailure Added Files: teardown testDummy Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: teardown --- FrontierVcsFile:1:scpt:suites.fUnit.testfUnit2.testTearDownFailure.teardown on teardown (setupParm = nil) { scriptError("teardown failed")} --- NEW FILE: testDummy --- FrontierVcsFile:1:scpt:suites.fUnit.testfUnit2.testTearDownFailure.testDummy on testDummy (setupParm = nil) { 1 == 1} // dummy test to make sure we execute the teardown |
|
From: Andre R. <and...@us...> - 2006-02-18 22:51:23
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/originalSuperStressRemnants/scripts In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969/originalSuperStressRemnants/scripts Added Files: OSA file iac rez Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: rez --- (This appears to be a binary file; contents omitted.) --- NEW FILE: OSA --- (This appears to be a binary file; contents omitted.) --- NEW FILE: file --- (This appears to be a binary file; contents omitted.) --- NEW FILE: iac --- (This appears to be a binary file; contents omitted.) |
|
From: Andre R. <and...@us...> - 2006-02-18 22:51:21
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/testfUnit/testSetup In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969/testfUnit/testSetup Added Files: name setup testSetup Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: testSetup --- FrontierVcsFile:1:scpt:suites.fUnit.testfUnit.testSetup.testSetup on testSetup (setupParm) { assertEqual(setupParm, 33, "setup is not working in fUnit.")} --- NEW FILE: setup --- FrontierVcsFile:1:scpt:suites.fUnit.testfUnit.testSetup.setup on setup () { return 33} --- NEW FILE: name --- FrontierVcsFile:1:TEXT:suites.fUnit.testfUnit.testSetup.name Test Setup |
|
From: Andre R. <and...@us...> - 2006-02-18 22:51:21
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/testSuiteSkeleton In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969/testSuiteSkeleton Added Files: description name setup teardown testScript Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: teardown --- FrontierVcsFile:1:scpt:suites.fUnit.testSuiteSkeleton.teardown on teardown (setupParam) { return} --- NEW FILE: setup --- FrontierVcsFile:1:scpt:suites.fUnit.testSuiteSkeleton.setup on setup () { return} --- NEW FILE: description --- FrontierVcsFile:1:TEXT:suites.fUnit.testSuiteSkeleton.description The description of the suite. --- NEW FILE: name --- FrontierVcsFile:1:TEXT:suites.fUnit.testSuiteSkeleton.name The name of the suite. --- NEW FILE: testScript --- FrontierVcsFile:1:scpt:suites.fUnit.testSuiteSkeleton.testScript on testScript (setupParam = nil) { assert(1)} |
|
From: Andre R. <and...@us...> - 2006-02-18 22:51:21
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/testGlobalSuite In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969/testGlobalSuite Added Files: USmNgf7a6tzCYFBpIu4ZKw description name zH2qYf9KXsoc79FutSuw Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: zH2qYf9KXsoc79FutSuw --- FrontierVcsFile:1:addr:suites.fUnit.testGlobalSuite.["[\"C3A\\\\Documents and Settings\\\\Jerf\\\\Desktop\\\\UserLand Frontier\\\\fUnit.root\"].fUnit.testSuperStress"] ["C:\\Documents and Settings\\Jerf\\Desktop\\UserLand Frontier\\fUnit.root"].fUnit.testSuperStress --- NEW FILE: USmNgf7a6tzCYFBpIu4ZKw --- FrontierVcsFile:1:addr:suites.fUnit.testGlobalSuite.["[\"C3A\\\\Documents and Settings\\\\Jerf\\\\Desktop\\\\UserLand Frontier\\\\fUnit.root\"].fUnit.testfUnit"] ["C:\\Documents and Settings\\Jerf\\Desktop\\UserLand Frontier\\fUnit.root"].fUnit.testfUnit --- NEW FILE: name --- FrontierVcsFile:1:TEXT:suites.fUnit.testGlobalSuite.name Global Test Suite --- NEW FILE: description --- FrontierVcsFile:1:TEXT:suites.fUnit.testGlobalSuite.description The Global Test Suite runs all test suites registered via "registerTestSuite". |
|
From: Andre R. <and...@us...> - 2006-02-18 22:51:21
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/testSuperStress/data In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969/testSuperStress/data Added Files: miscUserTalk miscXCMD xmlTestList Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: miscXCMD --- FrontierVcsFile:1:data:suites.fUnit.testSuperStress.data.miscXCMD WEZDTmAOAABYRkNOAIAAAAAAAABB+v/uTnFOcWAAAFROVv8ALwwgbgAIQ+7/AHA/IthRyP/8KG4ADEHu/wApSABQOXwABwBMLywASCBfTpAtbABwABAoX05eIF9QT07QIG8ABCAvAAhCZ6nuIF9QT07QTlb/AEKnPzwAGKiPSG7/AE66/9xCpy8uAAhIbv8ATrr/jiBuAAghXwBCTl4un051hG1haW4AAAA= --- NEW FILE: xmlTestList --- FrontierVcsFile:1:list:suites.fUnit.testSuperStress.data.xmlTestList {1, 3, 5, 7} --- NEW FILE: miscUserTalk --- (This appears to be a binary file; contents omitted.) |
|
From: Andre R. <and...@us...> - 2006-02-18 22:51:20
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/testExamples In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969/testExamples Added Files: about name testSimple Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: testSimple --- (This appears to be a binary file; contents omitted.) --- NEW FILE: about --- FrontierVcsFile:1:wptx:suites.fUnit.testExamples.about This is an example test suite for fUnit, demonstrating the simplest possible test assertions. It is expected that some of these tests will fail; they are supposed to. These examples are documented in fUnit.documentation, under the heading "Testing By Example". --- NEW FILE: name --- FrontierVcsFile:1:TEXT:suites.fUnit.testExamples.name Example Test Suite |
|
From: Andre R. <and...@us...> - 2006-02-18 22:51:19
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/testSuperStress/data/rpcHandlers In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969/testSuperStress/data/rpcHandlers Added Files: helloWorld xmlReceiver Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: helloWorld --- FrontierVcsFile:1:scpt:suites.fUnit.testSuperStress.data.rpcHandlers.helloWorld on helloWorld (name) { return ("Hello " + name + ".")} --- NEW FILE: xmlReceiver --- FrontierVcsFile:1:scpt:suites.fUnit.testSuperStress.data.rpcHandlers.xmlReceiver on xmlReceiver (addressString, objectType, encodedObject) { local (adr = @temp.["fUnit" + addressString]); local (bytes = binary (base64.decode (encodedObject))); setBinaryType (@bytes, objectType); unpack (@bytes, adr); if objectType == scripttype { script.compile (adr)}; return (true)} |
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/testfUnit In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27969/testfUnit Added Files: description name testAbort testAssert testAssertEqual testAssertErrors testAssertNotEqual testfUnitFailures Log Message: Merge changes from fUnit_Suite-branch. --- NEW FILE: testfUnitFailures --- (This appears to be a binary file; contents omitted.) --- NEW FILE: testAssertEqual --- FrontierVcsFile:1:scpt:suites.fUnit.testfUnit.testAssertEqual on testAssertEqual () { assertEqual(1, 1); on failWOMessage() { assertEqual(1, 2)}; assertErrors(@failWOMessage, "1"); assertErrors(@failWOMessage, "2"); on failWMessage() { assertEqual(1, 2, "My message")}; assertErrors(@failWMessage, "1"); assertErrors(@failWMessage, "2"); assertErrors(@failWMessage, "My message")} --- NEW FILE: testAssertErrors --- FrontierVcsFile:1:scpt:suites.fUnit.testfUnit.testAssertErrors on testAssertErrors () { on error1() { scriptError("My error message.")}; assertErrors(@error1); assertErrors(@error1, "error message"); on error2() { // we have to get crazy because we're trying to use the framework to test itself assertErrors(@error1, "not in message")}; assertErrors(@error2, "not in message"); assertErrors(@error2, "error message"); on error3() { assertErrors(@error1, "not in message", "my custom message")}; assertErrors(@error3, "not in message"); assertErrors(@error3, "my custom message"); on noError() { return}; on error4() { assertErrors(@noError)}; assertErrors(@error4, "did not error"); on error5() { assertErrors(@noError, failMessage: "fail message")}; assertErrors(@error5, "fail message")}; callScript(@fUnit.testfUnit.testAssertErrors, {}, @fUnit.contextForTests) --- NEW FILE: name --- FrontierVcsFile:1:TEXT:suites.fUnit.testfUnit.name fUnit Test Suite --- NEW FILE: testAssert --- FrontierVcsFile:1:scpt:suites.fUnit.testfUnit.testAssert on testAssert () { assert(1 == 1); on errorWithoutMessage() { assert(false)}; assertErrors(@errorWithoutMessage); on errorWithMessage() { assert(false, "This is my error")}; assertErrors(@errorWithMessage, "is my error")} --- NEW FILE: testAssertNotEqual --- FrontierVcsFile:1:scpt:suites.fUnit.testfUnit.testAssertNotEqual on testAssertNotEqual () { assertNotEqual(1, 2); on failWOMessage() { assertNotEqual(1, 1)}; assertErrors(@failWOMessage, "1"); on failWMessage() { assertNotEqual(1, 1, "My message")}; assertErrors(@failWMessage, "1"); assertErrors(@failWMessage, "My message")} --- NEW FILE: testAbort --- FrontierVcsFile:1:scpt:suites.fUnit.testfUnit.testAbort on testAbort () { abort("This test should show as aborted.")} --- NEW FILE: description --- FrontierVcsFile:1:TEXT:suites.fUnit.testfUnit.description This test suite tests the functionality of fUnit itself. |
|
From: creedon <icr...@us...> - 2006-02-18 21:33:56
|
Update of /cvsroot/frontierkernel/odbs/mainResponderRoot/mainResponder/adminSite/website/23templates In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26815 Modified Files: setup Log Message: updated template Index: setup =================================================================== RCS file: /cvsroot/frontierkernel/odbs/mainResponderRoot/mainResponder/adminSite/website/23templates/setup,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** setup 10 Jul 2005 05:47:42 -0000 1.4 --- setup 18 Feb 2006 21:33:52 -0000 1.5 *************** *** 1,3 **** FrontierVcsFile:1:optx:mainResponder.adminSite.website.["#templates"].setup ! <body> <div id="banner"> <a href="http://frontierkernel.sourceforge.net/" style="font-family:verdana, arial, sans-serif;color:#FFF;font-size:20px;font-weight:normal;text-transform:uppercase;letter-spacing: .2em;"> Frontier </a> <br/> <span class="description"> High performance Web content management, object database, system-level and Internet scripting environment, including source code editing and debugging. </span> </div> <div id="content" style="width: 100%;"> <div class="blogbody"> <p class="title"> <%viewPageTitle ()%> </p> {bodytext} <br/> <br/> <div class="footer"> <p> This Page was last update: <%timeModified (adrobject)%> <br/> Page template based on <a href="http://www.bryanbell.com/">Bryan Bell's</a> <a href="http://www.bryanbell.com/2002/07/23#a63">Moveable Manila: green</a>. <br/> © Copyright <%date.year ()%> </p> <p> <a href="http://jigsaw.w3.org/css-validator/"> <img style="border:0;width:88px;height:31px" src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"> </a> </p> </div> </div> </div> </body> </html> \ No newline at end of file --- 1,3 ---- FrontierVcsFile:1:optx:mainResponder.adminSite.website.["#templates"].setup ! <body> <div id="banner"> <div style="float: left; padding-right: 15px;"> <%"<img src=\""+ config.mainresponder.prefs.baseUrl + "resources/frontierIcons/cactusSkullSun128x128\" height=\"128\" style=\"vertical-align: middle;\" width=\"128\" />"%> </div> <div style="position: relative; top: 15px;"> <a href="http://frontierkernel.sourceforge.net/" style="font-family: verdana, arial, sans-serif; color: #FFF; font-size: 20px; font-weight: normal; text-transform: uppercase; letter-spacing: .2em;"> Frontier </a> <br /> <span class="description"> High performance Web content management, object database, system-level and Internet scripting environment, including source code editing and debugging. </span> </div> <br clear="all" /> </div> <div id="content" style="width: 100%;"> <div class="blogbody"> <p class="title"> <%viewPageTitle ()%> </p> {bodytext} <br /> <br /> <div class="footer"> <p> This Page was last update: <%timeModified (adrobject)%> <br /> Web page template based on <a href="http://www.bryanbell.com/">Bryan Bell's</a> <a href="http://www.bryanbell.com/2002/07/23#a63">Moveable Manila: green</a>. <br /> © Copyright <%date.year ()%> </p> <p> <a href="http://jigsaw.w3.org/css-validator/"> <img style="border:0;width:88px;height:31px" src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"> </a> </p> </div> </div> </div> </body> </html> \ No newline at end of file |
|
From: creedon <icr...@us...> - 2006-02-18 21:33:22
|
Update of /cvsroot/frontierkernel/odbs/mainResponderRoot/mainResponder/resources/frontierIcons In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26700 Added Files: cactusSkullSun128x128 Log Message: created --- NEW FILE: cactusSkullSun128x128 --- FrontierVcsFile:1:data:mainResponder.resources.frontierIcons.cactusSkullSun128x128 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 |
|
From: Andre R. <and...@us...> - 2006-02-18 20:13:57
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/testSuperStress In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25310/testSuperStress Modified Files: Tag: fUnit_Suite-branch testRegularExpressions Log Message: Check named group patterns more thoroughly, managed to locate a bug in the re.replace kernel verb. Index: testRegularExpressions =================================================================== RCS file: /cvsroot/frontierkernel/odbs/frontierRoot/suites/fUnit/testSuperStress/Attic/testRegularExpressions,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -C2 -d -r1.1.2.1 -r1.1.2.2 *** testRegularExpressions 18 Feb 2006 13:13:41 -0000 1.1.2.1 --- testRegularExpressions 18 Feb 2006 20:13:49 -0000 1.1.2.2 *************** *** 1,3 **** FrontierVcsFile:1:scpt:suites.fUnit.testSuperStress.testRegularExpressions ! on testRegularExpressions () { assert (defined (system.compiler.["kernel"].re), "The regular expressions verbs are not implemented in this application."); bundle { //re.match local (cp, matchInfo, s1 = "a123four", s2 = "bop bebe bop"); cp = re.compile ("[a-zA-Z]+[0-9]+"); assert (re.match (cp, s1, adrMatchInfoTable:@matchInfo), "re.match is broken."); assertEqual (matchInfo.matchString, "a123", "re.match is broken."); cp = re.compile ("(be){1,2}"); assert (re.match (cp, s2, adrMatchInfoTable:@matchInfo), "re.search is broken."); assertEqual (matchInfo.matchString, "bebe", "re.search is broken.")}; bundle { //re.extract local { cp; complexLinkPat = "<a[ \t\r\n]*[^>]*href[ \t\r\n]*=[ \t\r\n]*\"?([-_~%@:/\\.A-Za-z0-9]+)\"?[^>]*>([^<]*)"; simpleLinkPat = "<a[ \t\r\n]+[^>]*href[ \t\r\n]*=[ \t\r\n]*\"([^\"]*)\"[^>]*>([^<]*)"; s = string (re.testing.data.html); theList}; cp = re.compile (simpleLinkPat); theList = re.extract (cp, s, {2,1}); assertEqual (sizeOf (theList), 59, "re.extract is broken."); assertEqual (theList[57][1] , "Roget's Thesaurus:", "re.extract is broken."); assertEqual (theList[57][2] , "http://www2.thesaurus.com/thesaurus/", "re.extract is broken."); cp = re.compile (complexLinkPat); theList = re.extract (cp, s, {2,1}); assertEqual (sizeOf (theList), 59, "re.extract is broken."); assertEqual (theList[25][1] , "FileMaker", "re.extract is broken."); assertEqual (theList[25][2] , "http://www.scripting.com/apps/filemaker.html", "re.extract is broken.")}; bundle { //re.grep local (cp); local (theList = {"aa", "aab", "a", "ab", ""}); local (s = "aa\raab\ra\rab\r\r"); cp = re.compile ("^aa"); assertEqual (re.grep (cp, theList), {"aa", "aab"}, "re.grep is broken."); assertEqual (re.grep (cp, s), {"aa", "aab"}, "re.grep is broken."); assertEqual (re.grep (cp, theList, flIncludeMatches:false), {"a", "ab", ""}, "re.grep is broken."); assertEqual (re.grep (cp, theList, flIncludeMatches:false), {"a", "ab", ""}, "re.grep is broken.")}; bundle { //re.join local (listA = {"a", "b", "c"}, listB = {"abcd", "", "efgh", ""}); assertEqual (re.join ("|", listA), "a|b|c", "re.join is broken."); assertEqual (re.join ("", listA), "abc", "re.join is broken."); assertEqual (re.join ("+/+", listB), "abcd+/++/+efgh+/+", "re.join is broken.")}; bundle { //re.split local (cp); local (s = "<title>test</title>\r<body>\rtest body\r</body>"); cp = re.compile ("<[^>]*>"); assertEqual (re.split (cp, s), {"", "test", "\r", "\rtest body\r", ""}, "re.split is broken."); assertEqual (re.split (cp, s, maxSplits:4), {"", "test", "\r", "\rtest body\r</body>"}, "re.split is broken."); cp = re.compile ("(<[^>]*>)"); assertEqual (re.split (cp, s), {"", "<title>", "test", "</title>", "\r", "<body>", "\rtest body\r", "</body>", ""}, "re.split is broken."); assertEqual (re.split (cp, s, maxSplits:3), {"", "<title>", "test", "</title>", "\r<body>\rtest body\r</body>"}, "re.split is broken."); local (s2 = "aBcDeFg"); cp = re.compile ("[a-z]+", flCaseSensitive:true); assertEqual (re.split (cp, s2), {"", "B", "D", "F", ""}, "re.split is broken."); cp = re.compile ("[^a-z]+", flCaseSensitive:true); assertEqual (re.split (cp, s2), {"a", "c", "e", "g"}, "re.split is broken."); cp = re.compile ("[A-Z]+", flCaseSensitive:true); assertEqual (re.split (cp, s2), {"a", "c", "e", "g"}, "re.split is broken."); cp = re.compile ("[^A-Z]+", flCaseSensitive:true); assertEqual (re.split (cp, s2), {"", "B", "D", "F", ""}, "re.split is broken.")}; bundle { //re.replace local (cp, ct); local (s = "To be or not to be", s2); cp = re.compile ("(be)"); s = re.replace (cp, "\\1BOP", s); assertEqual (s, "To beBOP or not to beBOP", "re.replace is broken."); cp = re.compile ("(be)(bop)", flCaseSensitive:false); s = re.replace (cp, "\\2\\1", s); assertEqual (s, "To BOPbe or not to BOPbe", "re.replace is broken."); cp = re.compile ("(BOP)(be)"); s = re.replace (cp, "\\2\\1", s, maxReplacements:1); assertEqual (s, "To beBOP or not to BOPbe", "re.replace is broken."); cp = re.compile ("(BOP)(be)"); s = re.replace (cp, "\\2\\1", s, adrReplacementCount:@ct); assertEqual (s, "To beBOP or not to beBOP", "re.replace is broken."); assertEqual (ct, 1, "re.replace is broken."); local (test = "Check http://www.muppets.com/~gonzo/ for more info, send your q's to mailto:go...@mu...."); local (result = "Check <A HREF=\"http://www.muppets.com/~gonzo/\">http://www.muppets.com/~gonzo/</A> for more info, send your q's to <A HREF=\"mailto:go...@mu...\">mailto:go...@mu...</A>."); cp = re.compile ("(http|mailto)(:[/]*[A-Za-z0-9]+[-_~%@:/\\.A-Za-z0-9]+[A-Za-z/0-9])"); test = re.replace (cp, "<A HREF=\"\\1\\2\">\\0</A>", test); assertEqual (test, result, "re.replace is broken.")}; bundle { //re.visit local (hits = 0); local (test = " <A href ='index.html' > <A href= 'index2.html' > "); on testCallback (adrTable) { case ++hits { 1 { assertEqual (adrTable^.matchOffset, 2, "re.visit is broken."); assertEqual (adrTable^.matchLength, 25, "re.visit is broken."); assertEqual (adrTable^.matchString, "<A href ='index.html' >", "re.visit is broken.")}; 2 { assertEqual (adrTable^.matchOffset, 28, "re.visit is broken."); assertEqual (adrTable^.matchLength, 33, "re.visit is broken."); assertEqual (adrTable^.matchString, "<A href= 'index2.html' >", "re.visit is broken.")}} else { abort ("re.visit is broken.")}; return (true)}; local (cp = re.compile ("<([^>]+)>")); re.visit (cp, test, @testCallback); assertEqual (hits, 2, "re.visit is broken.")}; bundle { //re.expand local (pat, mi); pat = re.compile ("(?P<date>(?P<year>(\\d\\d)?\\d\\d)-(?P<month>\\d\\d)-(?P<day>\\d\\d))", flAutoCapture:false); assert (re.match (pat, "2003-05-30", adrMatchInfoTable:@mi, flMakeGroups:true, flMakeNamedGroups:true), "re.match is broken"); assertEqual (re.expand ("\\g<date>", @mi), "2003-05-30", "re.expand is broken."); assertEqual (re.expand ("\\g<day>.\\g<month>.\\g<year>", @mi), "30.05.2003", "re.expand is broken."); assertEqual (re.expand ("\\g<4>.\\g<3>.\\g<2>", @mi), "30.05.2003", "re.expand is broken."); assertEqual (re.expand ("\\4.\\3.\\2", @mi), "30.05.2003", "re.expand is broken."); temp.mi = mi}}; Çbundle //group references Çlocal (cp, s = "To beBOP or not to beBOP") Çcp = re.compile ("(?P<x>be)(?P<x2>bop)", flCaseSensitive:false) ÇassertEqual (re.replace (cp, "\\g<2>\\g<1>", s), "To BOPbe or not to BOPbe", "numbered groups are broken.") ÇassertEqual (re.replace (cp, "\\g<x2>\\g<x>", s), "To BOPbe or not to BOPbe", "named groups are broken.") bundle { //debug code fUnit.runners.run (parentOf(this^), testCaseToRun: this)} \ No newline at end of file --- 1,3 ---- FrontierVcsFile:1:scpt:suites.fUnit.testSuperStress.testRegularExpressions ! on testRegularExpressions () { assert (defined (system.compiler.["kernel"].re), "The regular expressions verbs are not implemented in this application."); bundle { //re.match local (cp, matchInfo, s1 = "a123four", s2 = "bop bebe bop"); cp = re.compile ("[a-zA-Z]+[0-9]+"); assert (re.match (cp, s1, adrMatchInfoTable:@matchInfo), "re.match is broken."); assertEqual (matchInfo.matchString, "a123", "re.match is broken."); cp = re.compile ("(be){1,2}"); assert (re.match (cp, s2, adrMatchInfoTable:@matchInfo), "re.search is broken."); assertEqual (matchInfo.matchString, "bebe", "re.search is broken.")}; bundle { //re.extract local { cp; complexLinkPat = "<a[ \t\r\n]*[^>]*href[ \t\r\n]*=[ \t\r\n]*\"?([-_~%@:/\\.A-Za-z0-9]+)\"?[^>]*>([^<]*)"; simpleLinkPat = "<a[ \t\r\n]+[^>]*href[ \t\r\n]*=[ \t\r\n]*\"([^\"]*)\"[^>]*>([^<]*)"; s = string (re.testing.data.html); theList}; cp = re.compile (simpleLinkPat); theList = re.extract (cp, s, {2,1}); assertEqual (sizeOf (theList), 59, "re.extract is broken."); assertEqual (theList[57][1] , "Roget's Thesaurus:", "re.extract is broken."); assertEqual (theList[57][2] , "http://www2.thesaurus.com/thesaurus/", "re.extract is broken."); cp = re.compile (complexLinkPat); theList = re.extract (cp, s, {2,1}); assertEqual (sizeOf (theList), 59, "re.extract is broken."); assertEqual (theList[25][1] , "FileMaker", "re.extract is broken."); assertEqual (theList[25][2] , "http://www.scripting.com/apps/filemaker.html", "re.extract is broken.")}; bundle { //re.grep local (cp); local (theList = {"aa", "aab", "a", "ab", ""}); local (s = "aa\raab\ra\rab\r\r"); cp = re.compile ("^aa"); assertEqual (re.grep (cp, theList), {"aa", "aab"}, "re.grep is broken."); assertEqual (re.grep (cp, s), {"aa", "aab"}, "re.grep is broken."); assertEqual (re.grep (cp, theList, flIncludeMatches:false), {"a", "ab", ""}, "re.grep is broken."); assertEqual (re.grep (cp, theList, flIncludeMatches:false), {"a", "ab", ""}, "re.grep is broken.")}; bundle { //re.join local (listA = {"a", "b", "c"}, listB = {"abcd", "", "efgh", ""}); assertEqual (re.join ("|", listA), "a|b|c", "re.join is broken."); assertEqual (re.join ("", listA), "abc", "re.join is broken."); assertEqual (re.join ("+/+", listB), "abcd+/++/+efgh+/+", "re.join is broken.")}; bundle { //re.split local (cp); local (s = "<title>test</title>\r<body>\rtest body\r</body>"); cp = re.compile ("<[^>]*>"); assertEqual (re.split (cp, s), {"", "test", "\r", "\rtest body\r", ""}, "re.split is broken."); assertEqual (re.split (cp, s, maxSplits:4), {"", "test", "\r", "\rtest body\r</body>"}, "re.split is broken."); cp = re.compile ("(<[^>]*>)"); assertEqual (re.split (cp, s), {"", "<title>", "test", "</title>", "\r", "<body>", "\rtest body\r", "</body>", ""}, "re.split is broken."); assertEqual (re.split (cp, s, maxSplits:3), {"", "<title>", "test", "</title>", "\r<body>\rtest body\r</body>"}, "re.split is broken."); local (s2 = "aBcDeFg"); cp = re.compile ("[a-z]+", flCaseSensitive:true); assertEqual (re.split (cp, s2), {"", "B", "D", "F", ""}, "re.split is broken."); cp = re.compile ("[^a-z]+", flCaseSensitive:true); assertEqual (re.split (cp, s2), {"a", "c", "e", "g"}, "re.split is broken."); cp = re.compile ("[A-Z]+", flCaseSensitive:true); assertEqual (re.split (cp, s2), {"a", "c", "e", "g"}, "re.split is broken."); cp = re.compile ("[^A-Z]+", flCaseSensitive:true); assertEqual (re.split (cp, s2), {"", "B", "D", "F", ""}, "re.split is broken.")}; bundle { //re.replace local (cp, ct); local (s = "To be or not to be", s2); cp = re.compile ("(be)"); s = re.replace (cp, "\\1BOP", s); assertEqual (s, "To beBOP or not to beBOP", "re.replace is broken."); cp = re.compile ("(be)(bop)", flCaseSensitive:false); s = re.replace (cp, "\\2\\1", s); assertEqual (s, "To BOPbe or not to BOPbe", "re.replace is broken."); cp = re.compile ("(BOP)(be)"); s = re.replace (cp, "\\2\\1", s, maxReplacements:1); assertEqual (s, "To beBOP or not to BOPbe", "re.replace is broken."); cp = re.compile ("(BOP)(be)"); s = re.replace (cp, "\\2\\1", s, adrReplacementCount:@ct); assertEqual (s, "To beBOP or not to beBOP", "re.replace is broken."); assertEqual (ct, 1, "re.replace is broken."); local (test = "Check http://www.muppets.com/~gonzo/ for more info, send your q's to mailto:go...@mu...."); local (result = "Check <A HREF=\"http://www.muppets.com/~gonzo/\">http://www.muppets.com/~gonzo/</A> for more info, send your q's to <A HREF=\"mailto:go...@mu...\">mailto:go...@mu...</A>."); cp = re.compile ("(http|mailto)(:[/]*[A-Za-z0-9]+[-_~%@:/\\.A-Za-z0-9]+[A-Za-z/0-9])"); test = re.replace (cp, "<A HREF=\"\\1\\2\">\\0</A>", test); assertEqual (test, result, "re.replace is broken.")}; bundle { //re.visit local (hits = 0); local (test = " <A href ='index.html' > <A href= 'index2.html' > "); on testCallback (adrTable) { case ++hits { 1 { assertEqual (adrTable^.matchOffset, 2, "re.visit is broken."); assertEqual (adrTable^.matchLength, 25, "re.visit is broken."); assertEqual (adrTable^.matchString, "<A href ='index.html' >", "re.visit is broken.")}; 2 { assertEqual (adrTable^.matchOffset, 28, "re.visit is broken."); assertEqual (adrTable^.matchLength, 33, "re.visit is broken."); assertEqual (adrTable^.matchString, "<A href= 'index2.html' >", "re.visit is broken.")}} else { abort ("re.visit is broken.")}; return (true)}; local (cp = re.compile ("<([^>]+)>")); re.visit (cp, test, @testCallback); assertEqual (hits, 2, "re.visit is broken.")}; bundle { //re.expand local (pat, mi); pat = re.compile ("(?P<date>(?P<year>(\\d\\d)?\\d\\d)-(?P<month>\\d\\d)-(?P<day>\\d\\d))", flAutoCapture:false); assert (re.match (pat, "2003-05-30", adrMatchInfoTable:@mi, flMakeGroups:true, flMakeNamedGroups:true), "re.match is broken"); assertEqual (re.expand ("\\g<date>", @mi), "2003-05-30", "re.expand is broken."); assertEqual (re.expand ("\\g<day>.\\g<month>.\\g<year>", @mi), "30.05.2003", "re.expand is broken."); assertEqual (re.expand ("\\g<4>.\\g<3>.\\g<2>", @mi), "30.05.2003", "re.expand is broken."); assertEqual (re.expand ("\\4.\\3.\\2", @mi), "30.05.2003", "re.expand is broken."); temp.mi = mi}; bundle { //group references local (cp, s = "To beBOP or not to beBOP", mi); cp = re.compile ("(?P<a>be)(?P<b>bop)", flCaseSensitive:false); assert (re.match (cp, s, adrMatchInfoTable:@mi, flMakeGroups:true, flMakeNamedGroups:true), "named groups are broken in re.match"); assertEqual (mi.namedGroups.a.groupNumber, 1, "named groups are broken in re.match"); assertEqual (mi.namedGroups.a.matchString, "be", "named groups are broken in re.match"); assertEqual (mi.namedGroups.a.matchOffset, 4, "named groups are broken in re.match"); assertEqual (mi.namedGroups.a.matchLength, 2, "named groups are broken in re.match"); assertEqual (mi.namedGroups.b.groupNumber, 2, "named groups are broken in re.match"); assertEqual (mi.namedGroups.b.matchString, "BOP", "named groups are broken in re.match"); assertEqual (mi.namedGroups.b.matchOffset, 6, "named groups are broken in re.match"); assertEqual (mi.namedGroups.b.matchLength, 3, "named groups are broken in re.match"); assertEqual (re.replace (cp, "\\g<b>\\g<a>", s), "To BOPbe or not to BOPbe", "named groups are broken in re.replace"); cp = re.compile ("(?P<x>be)(?P<xy>bop)", flCaseSensitive:false); assertEqual (re.replace (cp, "\\g<xy>\\g<x>", s), "To BOPbe or not to BOPbe", "named groups are broken in re.replace"); cp = re.compile ("(?P<x>be)(?P<xx>bop)", flCaseSensitive:false); assertEqual (re.replace (cp, "\\g<xx>\\g<x>", s), "To BOPbe or not to BOPbe", "named groups are broken in re.replace"); cp = re.compile ("(?P<x>be)(?P<xz>bop)", flCaseSensitive:false); assertEqual (re.replace (cp, "\\g<xz>\\g<x>", s), "To BOPbe or not to BOPbe", "named groups are broken in re.replace")}}; bundle { //debug code fUnit.runners.run (parentOf(this^), testCaseToRun: this)} \ No newline at end of file |
|
From: Andre R. <and...@us...> - 2006-02-18 19:41:14
|
Update of /cvsroot/frontierkernel/Frontier/Common/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11534/Common/source Modified Files: langregexp.c Log Message: Fixed bug in re.replace verb: named groups were consistently replaced with the whole match string instead of just the matched group. Index: langregexp.c =================================================================== RCS file: /cvsroot/frontierkernel/Frontier/Common/source/langregexp.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** langregexp.c 8 Feb 2006 21:23:55 -0000 1.10 --- langregexp.c 18 Feb 2006 19:40:59 -0000 1.11 *************** *** 1366,1369 **** --- 1366,1375 ---- static boolean replscancompilenamed (int ix, int len, const char *cptr, int clen, bigstring bserror, void *refcon) { + /* + 2006-02-18 aradke: actually write the group index ref instead of just nil. + fixes bug in re.replace verb where any matched named groups would consistently + be replaced with the complete match string instead of just the matched group. + */ + tyreplscancompileinfo *info = (tyreplscancompileinfo *) refcon; int ref; *************** *** 1379,1383 **** } ! return (writehandlestreamreplpart (&(info->s), REGEXP_NAMED, ix, len, 0)); } /*replscancompilenamed*/ --- 1385,1389 ---- } ! return (writehandlestreamreplpart (&(info->s), REGEXP_NAMED, ix, len, ref)); } /*replscancompilenamed*/ |
|
From: creedon <icr...@us...> - 2006-02-18 18:53:12
|
Update of /cvsroot/frontierkernel/odbs/mainResponderRoot/mainResponder/adminSite/website In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22103 Modified Files: setupFrontier Log Message: on the Admin web page clarify that the email address is later used to access the Admin web site Index: setupFrontier =================================================================== RCS file: /cvsroot/frontierkernel/odbs/mainResponderRoot/mainResponder/adminSite/website/setupFrontier,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** setupFrontier 9 Feb 2006 02:42:34 -0000 1.6 --- setupFrontier 18 Feb 2006 18:53:07 -0000 1.7 *************** *** 1,3 **** FrontierVcsFile:1:scpt:mainResponder.adminSite.website.setupFrontier ! on setupFrontier () { ÇChanges Ç2/8/06; 2:20:15 PM by TAC Çlowercase method get, towards XHTML compliance Ç2/1/06; 1:32:48 PM by TAC Çtowards XHTML compliance Çlowercase method check, towards XHTML compliance Ç7/6/05; 12:51:01 PM by TAC Çrewrite, based on old code <http://cvs.sourceforge.net/viewcvs.py/frontierkernel/odbs/mainResponderRoot/mainResponder/adminSite/website/setupFrontier?rev=1.2> local (pta = html.getPageTableAddress ()); local (errorMessage = "", htmlText = "", indentLevel = 0, pathArgs = ""); on add (s) { htmlText = htmlText + string.filledstring ("\t", indentLevel) + s + "\r"}; on popupWindowLink (label, localizationStringId) { localizationStringId = string.urlEncode (localizationStringId); return ("<a href=\"JavaScript: newWindow=openWin ('" + string.popLeading (pta^.URI, '/') + "$popupWindow?label=" + string.urlEncode (label) + "&localizationStringId=" + localizationStringId + "', 'prefsPopup', 'width=400,height=400,toolbar=0,location=0,directories=0,status=0,menuBar=0,scrollBars=1,resizable=1'); newWindow.focus ()\">" + label + "</a>")}; if string.lower (pta^.method) == "post" { local (adrArgs = @pta^.postArgs, flError = false); if defined (adrArgs^.personalize) { // personalize local (name = adrArgs^.name); local (organization = adrArgs^.organization); local (email = adrArgs^.email); local (mailHost = adrArgs^.mailHost); local (password = adrArgs^.password); local (repeat = adrArgs^.repeatPassword); bundle { // convert mail host port to a number try { // if not, it's an error adrArgs^.mailHostPort = number (adrArgs^.mailHostPort)} else { errorMessage = "Can't set the outgoing mail server port because the port you entered is not valid."; flError = true}}; bundle { // convert web server port to a number try { // if not, it's an error adrArgs^.webServerPort = number (adrArgs^.webServerPort)} else { errorMessage = "Can't set the web server port because the port you entered is not valid."; flError = true}}; on getInitials (s) { local (initials = ""); bundle { //strip off parentheticals if s contains "(" { s = string.nthField (s, "(", 1)}; if s contains "[" { s = string.nthField (s, "[", 1)}; if s contains "{" { s = string.nthField (s, "{", 1)}}; s = string.trimWhiteSpace (s); initials = string.upper (s[1]); local (i, ct = sizeOf (s)); if sizeOf (s) > 1 { local (flNextCharIsInitial = false); for i = 2 to ct { if flNextCharIsInitial { if string.isAlpha (s[i]) { initials = initials + string.upper (s[i])}; flNextCharIsInitial = false}; if not string.isAlpha (s[i]) { flNextCharIsInitial = true}}}; return (initials)}; on setName (name) { user.prefs.name = name; bundle { //set user.prefs.initials user.prefs.initials = getInitials (name)}}; on setEmail (email) { user.prefs.mailAddress = email}; if system.environment.isMac { //convert name, organization to Mac text name = latinToMac.convert (name); organization = latinToMac.convert (organization)}; setName (name); setEmail (email); user.prefs.organization = organization; user.prefs.mailHost = mailHost; config.mainResponder.prefs.baseUrl = "http://" + adrArgs^.webServerDomain + "/"; bundle { //check that the password is ok, and that it matches the repeat password if sizeOf (password) < 4 { errorMessage = "Can't continue setting up Frontier because the password you supplied is not at least four characters long."; flError = true}; if not flError { if password != repeat { errorMessage = "Can't continue setting up Frontier because the password you supplied does not match the repeat password."; flError = true}}}; bundle { //set up Admin member for access to control panel bundle { //create the Admin membership group if needed local (adrRoot = @[system.temp.mainResponder.membersRootFile]); local (adrGroup = @adrRoot^.admin); if not defined (adrGroup^) { new (tableType, adrGroup)}; if not defined (adrGroup^.callbacks) { new (tableType, @adrGroup^.callbacks)}; if not defined (adrGroup^.cookieDomain) { adrGroup^.cookieDomain = ""}; if not defined (adrGroup^.cookieExpires) { adrGroup^.cookieExpires = "Mon, 01 Apr 2030 07:00:00 GMT"}; if not defined (adrGroup^.cookieName) { adrGroup^.cookieName = "Admin"}; if not defined (adrGroup^.mailReturnAddress) { adrGroup^.mailReturnAddress = user.prefs.mailAddress}; if not defined (adrGroup^.mailSubject) { adrGroup^.mailSubject = "Admin"}; if not defined (adrGroup^.mailTemplate) { wp.newTextObject ("", @adrGroup^.mailTemplate)}; if not defined (adrGroup^.openToPublic) { adrGroup^.openToPublic = false}; if not defined (adrGroup^.users) { new (tableType, @adrGroup^.users)}}; local (adrMember = mainResponder.members.getMemberTable ("Admin", user.prefs.mailAddress)); if not defined (adrMember^) { new (tableType, adrMember)}; adrMember^.password = password; if not defined (adrMember^.personalInfo) { new (tableType, @adrMember^.personalInfo)}; if not defined (adrMember^.personalInfo.name) { adrMember^.personalInfo.name = user.prefs.name}}; if not (flError) { user.prefs.mailHostPort = adrArgs^.mailHostPort; if adrArgs^.webServerPort != user.inetd.config.http.port { // web server port local (flRunning = inetd.isDaemonRunning (@user.inetd.config.http)); if flRunning { //stop server, set port, restart server inetd.stopOne (@user.inetd.config.http); user.inetd.config.http.port = adrArgs^.webServerPort; inetd.startOne (@user.inetd.config.http)} else { //just set port user.inetd.config.http.port = adrArgs^.webServerPort}}; scriptError ("!redirect " + pta^.URI + "$proxyServer")}}; if defined (adrArgs^.proxyServer) { // proxy server try { // convert port to a number -- if not, it's an error adrArgs^.port = number (adrArgs^.port)} else { errorMessage = "Can't set your proxy server settings because the port you entered is not valid."; adrArgs^.enabled = false; flError = true}; user.webBrowser.proxy.domain = adrArgs^.domain; user.webBrowser.proxy.username = adrArgs^.username; user.webBrowser.proxy.password = binary (adrArgs^.password); user.webBrowser.proxy.enabled = false; if defined (adrArgs^.enabled) { if adrArgs^.enabled { user.webBrowser.proxy.enabled = true}}; if not (flError) { user.webBrowser.proxy.port = adrArgs^.port; scriptError ("!redirect " + pta^.URI + "$portForwarding")}}; if defined (adrArgs^.portForwarding) { // port forwarding local (adminPassword = adrArgs^.password); local (flEnablePortForwarding = defined (adrArgs^.flEnablePortForwarding)); local (flRememberAdminPassword = defined (adrArgs^.flRememberAdminPassword)); local (password = mainResponder.members.getMemberTable ("Admin", user.prefs.mailAddress)^.password); local (urlParts = string.urlSplit (config.mainResponder.prefs.baseUrl)); bundle { // convert actualPort to a number -- if not, it's an error try { adrArgs^.actualPort = number (adrArgs^.actualPort)} else { errorMessage = "Can't set your actual web server port because the port you entered is not valid."; flEnablePortForwarding = false; flError = true}}; bundle { // convert apparentPort to a number -- if not, it's an error try { adrArgs^.apparentPort = number (adrArgs^.apparentPort)} else { errorMessage = "Can't set your apparent web server port because the port you entered is not valid."; flEnablePortForwarding = false; flError = true}}; if flRememberAdminPassword and flEnablePortForwarding { user.prefs.portForwardingAdminPassword = binary (adminPassword)}; if not (flError) { if adrArgs^.actualPort != user.inetd.config.http.port or adrArgs^.apparentPort != user.inetd.config.http.apparentPort { local (flRunning = inetd.isDaemonRunning (@user.inetd.config.http)); if flRunning { // stop server, set port, restart server inetd.stopOne (@user.inetd.config.http); user.inetd.config.http.apparentPort = adrArgs^.apparentPort; user.inetd.config.http.port = adrArgs^.actualPort; inetd.startOne (@user.inetd.config.http)} else { // just set port user.inetd.config.http.apparentPort = adrArgs^.apparentPort; user.inetd.config.http.port = adrArgs^.actualPort}}}; Frontier.completeSetup (urlParts [2], password, adminPassword, flRememberAdminPassword, flEnablePortForwarding); if not (flError) { scriptError ("!redirect " + pta^.URI + "$congratulations")}}}; if defined (pta^.pathArgs) { if pta^.pathArgs != "" { pathArgs = pta^.pathArgs}}; case pathArgs { // generally the cases should be ordered in user presentation order, they can be accessed by name or number, name is preferred "1"; "personalize" { local (name = user.prefs.name, organization = user.prefs.organization); pta^.title = "Personalize"; bundle { // change the template to the setup template, which doesn't have navigation links to the rest of the admin site table.assign (@pta^.template, "setup"); pta^.indirectTemplate = true}; if system.environment.isMac { // convert name, organization to latin text name = latinToMac.macToLatin (name); organization = latinToMac.macToLatin (organization)}; bundle { //render the new user page local (t); new (tabletype, @t); bundle { // add the labels to the replacement table t.webserverdomainlabel = popupWindowLink ("Web server domain name or IP address", "setupFrontier.popupText.webServerDomainIp")}; bundle { // add personal info to replacement table t.mailhost = user.prefs.mailHost; t.mailHostPort = user.prefs.mailHostPort; t.useremail = user.prefs.mailAddress; t.username = name; t.userorganization = organization; t.userpassword = ""; bundle { // web server domain or ip address local (urlParts = string.urlSplit (config.mainResponder.prefs.baseUrl)); t.webserverdomain = urlParts [2]}; try { // try to get the admin password from the Admin membership group local (adrMember = mainResponder.members.getMemberTable ("Admin", user.prefs.mailAddress)); if defined (adrMember^) { t.userpassword = adrMember^.password}}; bundle { // web server port t.webserverport = user.inetd.config.http.port}}; bundle { // add error message to replacement table t.errorMessage = ""; if errorMessage != "" { t.errorMessage = "<p style=\"color: red;\">" + errorMessage + "</p>"}}; add (mainResponder.getString ("setupFrontier.personalize", @t))}}; "2"; "proxyServer" { pta^.title = "Proxy Server Settings"; bundle { // change the template to the setup template, which doesn't have navigation links to the rest of the admin site table.assign (@pta^.template, "setup"); pta^.indirectTemplate = true}; bundle { // render the new user page local (t); new (tabletype, @t); bundle { // add proxy settings to replacement table with user.webBrowser.proxy { t.proxydomain = domain; t.proxyusername = username; t.proxypassword = string (password); t.proxyport = port; if enabled { t.proxyenabled = "checked"} else { t.proxyenabled = ""}}}; bundle { // add error message to replacement table t.errorMessage = ""; if errorMessage != "" { t.errorMessage = "<p style=\"color: red;\">" + errorMessage + "</p>"}}; add (mainResponder.getString ("setupFrontier.proxyServer", @t))}}; "3"; "portForwarding" { if system.environment.isCarbon { //we need to run the port forwarding page now pta^.title = "Mac OS X Port Forwarding"; bundle { // change the template to the setup template, which doesn't have navigation links to the rest of the admin site table.assign (@pta^.template, "setup"); pta^.indirectTemplate = true}; bundle { // render the new user page local (t); new (tabletype, @t); t.adminPassword = ""; t.rememberAdminPassword = "checked"; t.enablePortForwarding = "checked"; t.actualPort = user.inetd.config.http.port; t.apparentPort = 80; if defined (user.inetd.config.http.apparentPort) { t.apparentPort = user.inetd.config.http.apparentPort}; if defined (user.prefs.portForwardingAdminPassword) { t.adminPassword = string (user.prefs.portForwardingAdminPassword)}; bundle { // add error message to replacement table t.errorMessage = ""; if errorMessage != "" { t.errorMessage = "<p style=\"color: red;\">" + errorMessage + "</p>"}}; add (mainResponder.getString ("setupFrontier.portForwarding", @t))}} else { //Windows and Classic don't need to deal with port forwarding local (password = mainResponder.members.getMemberTable ("Admin", user.prefs.mailAddress)^.password); local (urlParts = string.urlSplit (config.mainResponder.prefs.baseUrl)); Frontier.completeSetup (urlParts [2], password); scriptError ("!redirect " + pta^.URI + "$congratulations")}}; "4"; "congratulations" { bundle { // change the template to the setup template, which doesn't have navigation links to the rest of the admin site table.assign (@pta^.template, "setup"); pta^.indirectTemplate = true}; pta^.title = "Congratulations"; local (adminSiteUrl = "http://" + pta^.host + "/"); bundle { //render the new user page add (mainResponder.getString ("setupFrontier.newUserConfirmMessage")); bundle { //add the Continue button local (adminSiteUrl = "http://" + pta^.host + "/"); add ("<form method=\"get\" action=\"" + adminSiteUrl + "\">"); add ("<input type=\"submit\" value=\"Continue\" onclick=\"document.location='" + adminSiteUrl + "'\" />"); add ("</form>")}; if defined (system.temp.Frontier.setupFrontier.flAllowLocalAccessToSetupPage) { system.temp.Frontier.setupFrontier.flAllowLocalAccessToSetupPage = false}}}; //require login from now on "popupWindow" { // this is a special case, it produces a popup window pta^.autoParagraphs = true; pta^.title = "Popup Text"; table.assign (@pta^.pageHeader, "<html><head><title><%title%></title></head><body>"); table.assign (@pta^.template, "<body>{bodytext}</body></html>"); try { delete (@pta^.javaScript)}; // popup windows should not have any JavaScript add ("<div name=\"setupfrontierpopupwindow\" style=\"font-size: x-large; margin: 13px;\">"); indentLevel++; add ("<b>"); indentLevel++; add (string.urlDecode (pta^.searchArgTable.label)); add ("</b>"); indentLevel--; add ("<br />"); add ("<br />"); add (mainResponder.getString (pta^.searchArgTable.localizationStringId)); add ("</div>"); indentLevel--}} else { scriptError ("!redirect " + pta^.URI + "$personalize")}; return (htmlText)} \ No newline at end of file --- 1,3 ---- FrontierVcsFile:1:scpt:mainResponder.adminSite.website.setupFrontier ! on setupFrontier () { ÇChanges Ç2/18/06; 9:55:55 AM by TAC Çadded programName to personalize webpage and pop window Ç2/8/06; 2:20:15 PM by TAC Çlowercase method get, towards XHTML compliance Ç2/1/06; 1:32:48 PM by TAC Çtowards XHTML compliance Çlowercase method check, towards XHTML compliance Ç7/6/05; 12:51:01 PM by TAC Çrewrite, based on old code <http://cvs.sourceforge.net/viewcvs.py/frontierkernel/odbs/mainResponderRoot/mainResponder/adminSite/website/setupFrontier?rev=1.2> local (pta = html.getPageTableAddress ()); local (errorMessage = "", htmlText = "", indentLevel = 0, pathArgs = ""); on add (s) { htmlText = htmlText + string.filledstring ("\t", indentLevel) + s + "\r"}; on popupWindowLink (label, localizationStringId) { localizationStringId = string.urlEncode (localizationStringId); return ("<a href=\"JavaScript: newWindow=openWin ('" + string.popLeading (pta^.URI, '/') + "$popupWindow?label=" + string.urlEncode (label) + "&localizationStringId=" + localizationStringId + "', 'prefsPopup', 'width=400,height=400,toolbar=0,location=0,directories=0,status=0,menuBar=0,scrollBars=1,resizable=1'); newWindow.focus ()\">" + label + "</a>")}; if string.lower (pta^.method) == "post" { local (adrArgs = @pta^.postArgs, flError = false); if defined (adrArgs^.personalize) { // personalize local (name = adrArgs^.name); local (organization = adrArgs^.organization); local (email = adrArgs^.email); local (mailHost = adrArgs^.mailHost); local (password = adrArgs^.password); local (repeat = adrArgs^.repeatPassword); bundle { // convert mail host port to a number try { // if not, it's an error adrArgs^.mailHostPort = number (adrArgs^.mailHostPort)} else { errorMessage = "Can't set the outgoing mail server port because the port you entered is not valid."; flError = true}}; bundle { // convert web server port to a number try { // if not, it's an error adrArgs^.webServerPort = number (adrArgs^.webServerPort)} else { errorMessage = "Can't set the web server port because the port you entered is not valid."; flError = true}}; on getInitials (s) { local (initials = ""); bundle { //strip off parentheticals if s contains "(" { s = string.nthField (s, "(", 1)}; if s contains "[" { s = string.nthField (s, "[", 1)}; if s contains "{" { s = string.nthField (s, "{", 1)}}; s = string.trimWhiteSpace (s); initials = string.upper (s[1]); local (i, ct = sizeOf (s)); if sizeOf (s) > 1 { local (flNextCharIsInitial = false); for i = 2 to ct { if flNextCharIsInitial { if string.isAlpha (s[i]) { initials = initials + string.upper (s[i])}; flNextCharIsInitial = false}; if not string.isAlpha (s[i]) { flNextCharIsInitial = true}}}; return (initials)}; on setName (name) { user.prefs.name = name; bundle { //set user.prefs.initials user.prefs.initials = getInitials (name)}}; on setEmail (email) { user.prefs.mailAddress = email}; if system.environment.isMac { //convert name, organization to Mac text name = latinToMac.convert (name); organization = latinToMac.convert (organization)}; setName (name); setEmail (email); user.prefs.organization = organization; user.prefs.mailHost = mailHost; config.mainResponder.prefs.baseUrl = "http://" + adrArgs^.webServerDomain + "/"; bundle { //check that the password is ok, and that it matches the repeat password if sizeOf (password) < 4 { errorMessage = "Can't continue setting up Frontier because the password you supplied is not at least four characters long."; flError = true}; if not flError { if password != repeat { errorMessage = "Can't continue setting up Frontier because the password you supplied does not match the repeat password."; flError = true}}}; bundle { //set up Admin member for access to control panel bundle { //create the Admin membership group if needed local (adrRoot = @[system.temp.mainResponder.membersRootFile]); local (adrGroup = @adrRoot^.admin); if not defined (adrGroup^) { new (tableType, adrGroup)}; if not defined (adrGroup^.callbacks) { new (tableType, @adrGroup^.callbacks)}; if not defined (adrGroup^.cookieDomain) { adrGroup^.cookieDomain = ""}; if not defined (adrGroup^.cookieExpires) { adrGroup^.cookieExpires = "Mon, 01 Apr 2030 07:00:00 GMT"}; if not defined (adrGroup^.cookieName) { adrGroup^.cookieName = "Admin"}; if not defined (adrGroup^.mailReturnAddress) { adrGroup^.mailReturnAddress = user.prefs.mailAddress}; if not defined (adrGroup^.mailSubject) { adrGroup^.mailSubject = "Admin"}; if not defined (adrGroup^.mailTemplate) { wp.newTextObject ("", @adrGroup^.mailTemplate)}; if not defined (adrGroup^.openToPublic) { adrGroup^.openToPublic = false}; if not defined (adrGroup^.users) { new (tableType, @adrGroup^.users)}}; local (adrMember = mainResponder.members.getMemberTable ("Admin", user.prefs.mailAddress)); if not defined (adrMember^) { new (tableType, adrMember)}; adrMember^.password = password; if not defined (adrMember^.personalInfo) { new (tableType, @adrMember^.personalInfo)}; if not defined (adrMember^.personalInfo.name) { adrMember^.personalInfo.name = user.prefs.name}}; if not (flError) { user.prefs.mailHostPort = adrArgs^.mailHostPort; if adrArgs^.webServerPort != user.inetd.config.http.port { // web server port local (flRunning = inetd.isDaemonRunning (@user.inetd.config.http)); if flRunning { //stop server, set port, restart server inetd.stopOne (@user.inetd.config.http); user.inetd.config.http.port = adrArgs^.webServerPort; inetd.startOne (@user.inetd.config.http)} else { //just set port user.inetd.config.http.port = adrArgs^.webServerPort}}; scriptError ("!redirect " + pta^.URI + "$proxyServer")}}; if defined (adrArgs^.proxyServer) { // proxy server try { // convert port to a number -- if not, it's an error adrArgs^.port = number (adrArgs^.port)} else { errorMessage = "Can't set your proxy server settings because the port you entered is not valid."; adrArgs^.enabled = false; flError = true}; user.webBrowser.proxy.domain = adrArgs^.domain; user.webBrowser.proxy.username = adrArgs^.username; user.webBrowser.proxy.password = binary (adrArgs^.password); user.webBrowser.proxy.enabled = false; if defined (adrArgs^.enabled) { if adrArgs^.enabled { user.webBrowser.proxy.enabled = true}}; if not (flError) { user.webBrowser.proxy.port = adrArgs^.port; scriptError ("!redirect " + pta^.URI + "$portForwarding")}}; if defined (adrArgs^.portForwarding) { // port forwarding local (adminPassword = adrArgs^.password); local (flEnablePortForwarding = defined (adrArgs^.flEnablePortForwarding)); local (flRememberAdminPassword = defined (adrArgs^.flRememberAdminPassword)); local (password = mainResponder.members.getMemberTable ("Admin", user.prefs.mailAddress)^.password); local (urlParts = string.urlSplit (config.mainResponder.prefs.baseUrl)); bundle { // convert actualPort to a number -- if not, it's an error try { adrArgs^.actualPort = number (adrArgs^.actualPort)} else { errorMessage = "Can't set your actual web server port because the port you entered is not valid."; flEnablePortForwarding = false; flError = true}}; bundle { // convert apparentPort to a number -- if not, it's an error try { adrArgs^.apparentPort = number (adrArgs^.apparentPort)} else { errorMessage = "Can't set your apparent web server port because the port you entered is not valid."; flEnablePortForwarding = false; flError = true}}; if flRememberAdminPassword and flEnablePortForwarding { user.prefs.portForwardingAdminPassword = binary (adminPassword)}; if not (flError) { if adrArgs^.actualPort != user.inetd.config.http.port or adrArgs^.apparentPort != user.inetd.config.http.apparentPort { local (flRunning = inetd.isDaemonRunning (@user.inetd.config.http)); if flRunning { // stop server, set port, restart server inetd.stopOne (@user.inetd.config.http); user.inetd.config.http.apparentPort = adrArgs^.apparentPort; user.inetd.config.http.port = adrArgs^.actualPort; inetd.startOne (@user.inetd.config.http)} else { // just set port user.inetd.config.http.apparentPort = adrArgs^.apparentPort; user.inetd.config.http.port = adrArgs^.actualPort}}}; Frontier.completeSetup (urlParts [2], password, adminPassword, flRememberAdminPassword, flEnablePortForwarding); if not (flError) { scriptError ("!redirect " + pta^.URI + "$congratulations")}}}; if defined (pta^.pathArgs) { if pta^.pathArgs != "" { pathArgs = pta^.pathArgs}}; case pathArgs { // generally the cases should be ordered in user presentation order, they can be accessed by name or number, name is preferred "1"; "personalize" { local (name = user.prefs.name, organization = user.prefs.organization); pta^.title = "Personalize"; bundle { // change the template to the setup template, which doesn't have navigation links to the rest of the admin site table.assign (@pta^.template, "setup"); pta^.indirectTemplate = true}; if system.environment.isMac { // convert name, organization to latin text name = latinToMac.macToLatin (name); organization = latinToMac.macToLatin (organization)}; bundle { //render the new user page local (t); new (tabletype, @t); bundle { // add the labels to the replacement table t.userPasswordLabel = popupWindowLink (Frontier.getProgramName (false) + " Admin password", "setupFrontier.popupText.adminPassword"); t.webserverdomainlabel = popupWindowLink ("Web server domain name or IP address", "setupFrontier.popupText.webServerDomainIp")}; bundle { // add personal info to replacement table t.mailhost = user.prefs.mailHost; t.mailHostPort = user.prefs.mailHostPort; t.programName = Frontier.getProgramName (false); t.useremail = user.prefs.mailAddress; t.username = name; t.userorganization = organization; t.userpassword = ""; bundle { // web server domain or ip address local (urlParts = string.urlSplit (config.mainResponder.prefs.baseUrl)); t.webserverdomain = urlParts [2]}; try { // try to get the admin password from the Admin membership group local (adrMember = mainResponder.members.getMemberTable ("Admin", user.prefs.mailAddress)); if defined (adrMember^) { t.userpassword = adrMember^.password}}; bundle { // web server port t.webserverport = user.inetd.config.http.port}}; bundle { // add error message to replacement table t.errorMessage = ""; if errorMessage != "" { t.errorMessage = "<p style=\"color: red;\">" + errorMessage + "</p>"}}; add (mainResponder.getString ("setupFrontier.personalize", @t))}}; "2"; "proxyServer" { pta^.title = "Proxy Server Settings"; bundle { // change the template to the setup template, which doesn't have navigation links to the rest of the admin site table.assign (@pta^.template, "setup"); pta^.indirectTemplate = true}; bundle { // render the new user page local (t); new (tabletype, @t); bundle { // add proxy settings to replacement table with user.webBrowser.proxy { t.proxydomain = domain; t.proxyusername = username; t.proxypassword = string (password); t.proxyport = port; if enabled { t.proxyenabled = "checked"} else { t.proxyenabled = ""}}}; bundle { // add error message to replacement table t.errorMessage = ""; if errorMessage != "" { t.errorMessage = "<p style=\"color: red;\">" + errorMessage + "</p>"}}; add (mainResponder.getString ("setupFrontier.proxyServer", @t))}}; "3"; "portForwarding" { if system.environment.isCarbon { //we need to run the port forwarding page now pta^.title = "Mac OS X Port Forwarding"; bundle { // change the template to the setup template, which doesn't have navigation links to the rest of the admin site table.assign (@pta^.template, "setup"); pta^.indirectTemplate = true}; bundle { // render the new user page local (t); new (tabletype, @t); t.adminPassword = ""; t.rememberAdminPassword = "checked"; t.enablePortForwarding = "checked"; t.actualPort = user.inetd.config.http.port; t.apparentPort = 80; if defined (user.inetd.config.http.apparentPort) { t.apparentPort = user.inetd.config.http.apparentPort}; if defined (user.prefs.portForwardingAdminPassword) { t.adminPassword = string (user.prefs.portForwardingAdminPassword)}; bundle { // add error message to replacement table t.errorMessage = ""; if errorMessage != "" { t.errorMessage = "<p style=\"color: red;\">" + errorMessage + "</p>"}}; add (mainResponder.getString ("setupFrontier.portForwarding", @t))}} else { //Windows and Classic don't need to deal with port forwarding local (password = mainResponder.members.getMemberTable ("Admin", user.prefs.mailAddress)^.password); local (urlParts = string.urlSplit (config.mainResponder.prefs.baseUrl)); Frontier.completeSetup (urlParts [2], password); scriptError ("!redirect " + pta^.URI + "$congratulations")}}; "4"; "congratulations" { bundle { // change the template to the setup template, which doesn't have navigation links to the rest of the admin site table.assign (@pta^.template, "setup"); pta^.indirectTemplate = true}; pta^.title = "Congratulations"; local (adminSiteUrl = "http://" + pta^.host + "/"); bundle { //render the new user page add (mainResponder.getString ("setupFrontier.newUserConfirmMessage")); bundle { //add the Continue button local (adminSiteUrl = "http://" + pta^.host + "/"); add ("<form method=\"get\" action=\"" + adminSiteUrl + "\">"); add ("<input type=\"submit\" value=\"Continue\" onclick=\"document.location='" + adminSiteUrl + "'\" />"); add ("</form>")}; if defined (system.temp.Frontier.setupFrontier.flAllowLocalAccessToSetupPage) { system.temp.Frontier.setupFrontier.flAllowLocalAccessToSetupPage = false}}}; //require login from now on "popupWindow" { // this is a special case, it produces a popup window local (t); new (tableType, @t); t.programName = Frontier.getProgramName (false); pta^.autoParagraphs = true; pta^.title = "Popup Text"; table.assign (@pta^.pageHeader, "<html><head><title><%title%></title></head><body>"); table.assign (@pta^.template, "<body>{bodytext}</body></html>"); try { delete (@pta^.javaScript)}; // popup windows should not have any JavaScript add ("<div name=\"setupfrontierpopupwindow\" style=\"font-size: x-large; margin: 13px;\">"); indentLevel++; add ("<b>"); indentLevel++; add (string.urlDecode (pta^.searchArgTable.label)); add ("</b>"); indentLevel--; add ("<br />"); add ("<br />"); add (mainResponder.getString (pta^.searchArgTable.localizationStringId, @t)); add ("</div>"); indentLevel--}} else { scriptError ("!redirect " + pta^.URI + "$personalize")}; return (htmlText)} \ No newline at end of file |
|
From: creedon <icr...@us...> - 2006-02-18 18:53:07
|
Update of /cvsroot/frontierkernel/odbs/mainResponderRoot/mainResponder/localization/languages/english/strings/setupFrontier In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21984 Modified Files: personalize Log Message: on the Admin web page clarify that the email address is later used to access the Admin web site Index: personalize =================================================================== RCS file: /cvsroot/frontierkernel/odbs/mainResponderRoot/mainResponder/localization/languages/english/strings/setupFrontier/personalize,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** personalize 2 Feb 2006 07:49:49 -0000 1.3 --- personalize 18 Feb 2006 18:53:02 -0000 1.4 *************** *** 1,3 **** FrontierVcsFile:1:optx:mainResponder.localization.languages.english.strings.setupFrontier.personalize ! [[errorMessage]] <p> There are just a few more easy steps -- to personalize this copy of Frontier, configure your network settings, and complete the installation. <br/> <br/> Some of the form field labels are links which will bring up a popup text window with more detail about that field. </p> <form method="post"> <table border="0" cellspacing="1" cellpadding="5"> <tr> <td align="left">Name:</td> <td valign="top" colspan="1"><input type="text" name="name" size="50" maxlength="255" value="[[username]]" /></td> </tr> <tr> <td align="left">Organization:</td> <td valign="top" colspan="1"><input type="text" name="organization" size="50" maxlength="255" value="[[userorganization]]" /></td> </tr> <tr> <td align="left">Email address: </td> <td valign="top" colspan="1"><input type="text" name="email" size="50" maxlength="255" value="[[useremail]]" /></td> </tr> <tr> <td align="left">Outgoing (SMTP) mail server:</td> <td valign="top" colspan="1"><input type="text" name="mailHost" size="50" maxlength="255" value="[[mailhost]]" /></td> </tr> <tr> <td align="left"> Outgoing (SMTP) mail server port: </td> <td valign="top" colspan="1"> <input type="text" name="mailHostPort" size="50" maxlength="255" value="[[mailHostPort]]" /> </td> </tr> <tr> <td align="left"> [[webserverdomainlabel]]: </td> <td valign="top" colspan="1"><input type="text" name="webServerDomain" size="50" maxlength="255" value="[[webserverdomain]]" /></td> </tr> <tr> <td align="left">Web server port: </td> <td valign="top" colspan="1"><input type="text" name="webServerPort" size="50" maxlength="255" value="[[webserverport]]" /></td> </tr> <tr> <td align="left">Admin password:</td> <td valign="top" colspan="1"><input type="password" name="password" size="25" maxlength="255" value="[[userpassword]]" /></td> </tr> <tr> <td align="left">Repeat:</td> <td valign="top" colspan="1"><input type="password" name="repeatPassword" size="25" maxlength="255" value="[[userpassword]]" /></td> </tr> <tr> <td> </td> <td> <input type="submit" name="personalize" value="Submit" /> </td> </tr> </table> </form> \ No newline at end of file --- 1,3 ---- FrontierVcsFile:1:optx:mainResponder.localization.languages.english.strings.setupFrontier.personalize ! [[errorMessage]] <p> There are just a few more easy steps -- to personalize this copy of [[programName]], configure your network settings, and complete the installation. <br /> <br /> Some of the form field labels are links which will bring up a popup text window with more detail about that field. <br /> <br /> You will use the email address you enter below, later in the installation process, when you are asked to login to the [[programName]] Admin web site. </p> <form method="post"> <table border="0" cellspacing="1" cellpadding="5"> <tr> <td align="left">Name:</td> <td valign="top" colspan="1"><input type="text" name="name" size="50" maxlength="255" value="[[username]]" /></td> </tr> <tr> <td align="left">Organization:</td> <td valign="top" colspan="1"><input type="text" name="organization" size="50" maxlength="255" value="[[userorganization]]" /></td> </tr> <tr> <td align="left">Email address: </td> <td valign="top" colspan="1"><input type="text" name="email" size="50" maxlength="255" value="[[useremail]]" /></td> </tr> <tr> <td align="left">Outgoing (SMTP) mail server:</td> <td valign="top" colspan="1"><input type="text" name="mailHost" size="50" maxlength="255" value="[[mailhost]]" /></td> </tr> <tr> <td align="left"> Outgoing (SMTP) mail server port: </td> <td valign="top" colspan="1"> <input type="text" name="mailHostPort" size="50" maxlength="255" value="[[mailHostPort]]" /> </td> </tr> <tr> <td align="left"> [[webserverdomainlabel]]: </td> <td valign="top" colspan="1"><input type="text" name="webServerDomain" size="50" maxlength="255" value="[[webserverdomain]]" /></td> </tr> <tr> <td align="left">Web server port: </td> <td valign="top" colspan="1"><input type="text" name="webServerPort" size="50" maxlength="255" value="[[webserverport]]" /></td> </tr> <tr> <td align="left"> [[userPasswordLabel]]: </td> <td valign="top" colspan="1"> <input type="password" name="password" size="25" maxlength="255" value="[[userpassword]]" /> </td> </tr> <tr> <td align="left"> Repeat password: </td> <td valign="top" colspan="1"> <input type="password" name="repeatPassword" size="25" maxlength="255" value="[[userpassword]]" /> </td> </tr> <tr> <td> </td> <td> <input type="submit" name="personalize" value="Submit" /> </td> </tr> </table> </form> \ No newline at end of file |
|
From: creedon <icr...@us...> - 2006-02-18 18:53:05
|
Update of /cvsroot/frontierkernel/odbs/mainResponderRoot/mainResponder/subscriptions In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21934 Modified Files: server Log Message: on the Admin web page clarify that the email address is later used to access the Admin web site Index: server =================================================================== RCS file: /cvsroot/frontierkernel/odbs/mainResponderRoot/mainResponder/subscriptions/server,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** server 25 Dec 2005 01:51:07 -0000 1.3 --- server 18 Feb 2006 18:52:57 -0000 1.4 *************** *** 1,3 **** FrontierVcsFile:1:scpt:mainResponder.subscriptions.server ! on server (dbName, ipAddress, lastUpdate, userName, mailAddress, serialNumber) { ÇChanges Ç12/24/05; 10:39:17 AM by TAC Çchanged local adrGuestDatabase to adrSubscribedDatabase to better describe it function Çnow works with host database (@root), the open source release didn't come with the rpc handler script rootUpdates.public.getUpdate, so I adapted this script to do the job Çnote: the root update server needs to have a table at user.datbases with the name of the host database (i.e. "Frontier.root") with the following items... Çf string: Frontier.root ÇopenOnStartup boolean: false ÇrunStartupScript boolean: false ÇsupportsSubscribe boolean: true Çsupport relative paths in user.rootUpdates.servers.x.f Çno longer need to pop the file off an address as what is now stored as a relative address Ç8/12/04; 3:12:31 AM by JES ÇAdditional logging: Errors are now logged. When an update is successful, ctPartsSent (in the log sub-table) is set to the number of parts sent to the client. Ç12/7/03; 11:52:32 PM by JES ÇAdd callback support. Callbacks are in config.mainResponder.callbacks.subscriptionsServer. They take the same parameters as this RPC handler. If any callback returns false, then an error is generated. Ç11/04/00; 5:55:40 PM by PBS ÇReturn the time on the server of the last update, so clients don't miss updates. ÇReturn new and changed parts of a database since the last update. local (adrTable = log.addToGuestDatabase ("subscriptions")); bundle { //add a record to the subscription log adrTable^.dbName = dbName; adrTable^.ipAddress = ipAddress; adrTable^.lastUpdate = lastUpdate; adrTable^.userName = userName; adrTable^.mailAddress = mailAddress; adrTable^.serialNumber = serialNumber}; bundle { //call callbacks local (adrCallbacks = @config.mainResponder.callbacks.subscriptionsServer); if not defined (adrCallbacks^) { new (tableType, adrCallbacks)}; local (adr, ct = sizeOf (adrCallbacks^), i, flSendUpdate = true); for i = 1 to ct { adr = @adrCallbacks^[i]; try { while typeOf (adr^) == addressType { adr = adr^}; if not adr^ (dbName, ipAddress, lastUpdate, userName, mailAddress, serialNumber) { flSendUpdate = false}}; if not flSendUpdate { scriptError ("Can't update because you are not authorized for updates to this database.")}}}; local (adrDb = @user.databases.[dbName]); if not defined (adrDb^) { adrTable^.error = "The sysop hasn't registered a database named \"" + dbName + "\"."; //02/04/07, 08:22:52 by DAB scriptError ("Can't send you an update because the sysop hasn't registered a database named \"" + dbName + "\".")}; if not (adrDb^.supportsSubscribe) { adrTable^.error = "The database \"" + dbName + "\" doesn't support subscriptions."; //02/04/07, 08:22:48 by DAB scriptError ("Can't send you an update because the database \"" + dbName + "\" doesn't support subscriptions.")}; local (adrSubscribedDatabase, flGuestDatabase = true); if window.getFile (@root) == fileSpec (adrDb^.f) { flGuestDatabase = false; adrSubscribedDatabase = @root} else { adrSubscribedDatabase = @[fileSpec (adrDb^.f)]}; if flGuestDatabase { table.sureDatabaseOpen (adrSubscribedDatabase)}; lastUpdate = date (lastUpdate); //convert from a net-standard-string local (frontierVersion = Frontier.version ()); local (adrChanges = @adrSubscribedDatabase^.["#changes"]); local (sizeChanges = sizeOf (adrChanges^)); local (parts); new (tabletype, @parts); parts.serialNum = sizeChanges; //it's synthetic! parts.lastUpdateTime = date.netStandardString (clock.now ()); //PBS 11/4/00: save server time on client, to avoid missing updates new (tabletype, @parts.parts); local (i, addedItems = {}); for i = sizeChanges downto 1 { local (adrItem = @adrChanges^ [i]); if adrItem^.when < lastUpdate { break}; if addedItems contains adrItem^.what { //we've already included this continue}; local (name = "part" + string.padwithzeros (i, 4)); local (adrNewPart = @parts.parts.[name]); new (tabletype, adrNewPart); bundle { //2/14/99; 9:01:26 AM by DW, customized error if object doesn't exist if not defined (adrItem^.what^) { adrTable^.error = "The #changes table in \"" + dbName + "\" on the server says that \"" + adrItem^.what + "\" has changed, but the object isn't in the database."; //02/04/07, 08:22:41 by DAB scriptError ("Can't do the update because the #changes table in \"" + dbName + "\" on the server says that \"" + adrItem^.what + "\" has changed, but the object isn't in the database.")}; adrNewPart^.data = adrItem^.what^}; adrNewPart^.timeStamp = adrItem^.when; adrNewPart^.userName = adrItem^.who; adrNewPart^.adr = adrItem^.what; Çbundle //put the relative address into adr field Çlocal (s = string (adrItem^.what)) Çlocal (ix = string.patternMatch ("].", s)) Çs = string.delete (s, 1, ix + 1) ÇadrNewPart^.adr = s wp.newtextobject ("", @adrNewPart^.changes); adrNewPart^.platform = "both"; adrNewPart^.version = frontierVersion; local (bytes); pack (adrNewPart^, @bytes); bytes = base64.encode (bytes, infinity); delete (adrNewPart); adrNewPart^ = bytes; addedItems = addedItems + {adrItem^.what}; sys.systemTask ()}; adrTable^.ctPartsSent = sizeof (addedItems); //02/04/07, 08:22:36 by DAB return (parts)}; Çbundle // testing Çserver ("Frontier.root", tcp.dns.getMyDottedId (), date.prevMonth (clock.now ()), "Thomas A. Creedon", "icr...@ya...", 0) Çserver ("prefs.root", tcp.dns.getMyDottedId (), clock.now (), "Jake", "ja...@us...", 10) \ No newline at end of file --- 1,3 ---- FrontierVcsFile:1:scpt:mainResponder.subscriptions.server ! on server (dbName, ipAddress, lastUpdate, userName, mailAddress, serialNumber) { ÇChanges Ç2/16/06; 6:17:36 PM by TAC Çif dbName == "" then set it to host database (@root) name Ç12/24/05; 10:39:17 AM by TAC Çchanged local adrGuestDatabase to adrSubscribedDatabase to better describe it function Çnow works with host database (@root), the open source release didn't come with the rpc handler script rootUpdates.public.getUpdate, so I adapted this script to do the job Çnote: the root update server needs to have a table at user.datbases with the name of the host database (i.e. "Frontier.root") with the following items... Çf string: Frontier.root ÇopenOnStartup boolean: false ÇrunStartupScript boolean: false ÇsupportsSubscribe boolean: true Çsupport relative paths in user.rootUpdates.servers.x.f Çno longer need to pop the file off an address as what is now stored as a relative address Ç8/12/04; 3:12:31 AM by JES ÇAdditional logging: Errors are now logged. When an update is successful, ctPartsSent (in the log sub-table) is set to the number of parts sent to the client. Ç12/7/03; 11:52:32 PM by JES ÇAdd callback support. Callbacks are in config.mainResponder.callbacks.subscriptionsServer. They take the same parameters as this RPC handler. If any callback returns false, then an error is generated. Ç11/04/00; 5:55:40 PM by PBS ÇReturn the time on the server of the last update, so clients don't miss updates. ÇReturn new and changed parts of a database since the last update. local (adrTable = log.addToGuestDatabase ("subscriptions")); bundle { //add a record to the subscription log adrTable^.dbName = dbName; adrTable^.ipAddress = ipAddress; adrTable^.lastUpdate = lastUpdate; adrTable^.userName = userName; adrTable^.mailAddress = mailAddress; adrTable^.serialNumber = serialNumber}; bundle { //call callbacks local (adrCallbacks = @config.mainResponder.callbacks.subscriptionsServer); if not defined (adrCallbacks^) { new (tableType, adrCallbacks)}; local (adr, ct = sizeOf (adrCallbacks^), i, flSendUpdate = true); for i = 1 to ct { adr = @adrCallbacks^[i]; try { while typeOf (adr^) == addressType { adr = adr^}; if not adr^ (dbName, ipAddress, lastUpdate, userName, mailAddress, serialNumber) { flSendUpdate = false}}; if not flSendUpdate { scriptError ("Can't update because you are not authorized for updates to this database.")}}}; if dbName == "" { dbName = file.fileFromPath (window.getFile (@root))}; local (adrDb = @user.databases.[dbName]); if not defined (adrDb^) { adrTable^.error = "The sysop hasn't registered a database named \"" + dbName + "\"."; //02/04/07, 08:22:52 by DAB scriptError ("Can't send you an update because the sysop hasn't registered a database named \"" + dbName + "\".")}; if not (adrDb^.supportsSubscribe) { adrTable^.error = "The database \"" + dbName + "\" doesn't support subscriptions."; //02/04/07, 08:22:48 by DAB scriptError ("Can't send you an update because the database \"" + dbName + "\" doesn't support subscriptions.")}; local (adrSubscribedDatabase, flGuestDatabase = true); if window.getFile (@root) == fileSpec (adrDb^.f) { flGuestDatabase = false; adrSubscribedDatabase = @root} else { adrSubscribedDatabase = @[fileSpec (adrDb^.f)]}; if flGuestDatabase { table.sureDatabaseOpen (adrSubscribedDatabase)}; lastUpdate = date (lastUpdate); //convert from a net-standard-string local (frontierVersion = Frontier.version ()); local (adrChanges = @adrSubscribedDatabase^.["#changes"]); local (sizeChanges = sizeOf (adrChanges^)); local (parts); new (tabletype, @parts); parts.serialNum = sizeChanges; //it's synthetic! parts.lastUpdateTime = date.netStandardString (clock.now ()); //PBS 11/4/00: save server time on client, to avoid missing updates new (tabletype, @parts.parts); local (i, addedItems = {}); for i = sizeChanges downto 1 { local (adrItem = @adrChanges^ [i]); if adrItem^.when < lastUpdate { break}; if addedItems contains adrItem^.what { //we've already included this continue}; local (name = "part" + string.padwithzeros (i, 4)); local (adrNewPart = @parts.parts.[name]); new (tabletype, adrNewPart); bundle { //2/14/99; 9:01:26 AM by DW, customized error if object doesn't exist if not defined (adrItem^.what^) { adrTable^.error = "The #changes table in \"" + dbName + "\" on the server says that \"" + adrItem^.what + "\" has changed, but the object isn't in the database."; //02/04/07, 08:22:41 by DAB scriptError ("Can't do the update because the #changes table in \"" + dbName + "\" on the server says that \"" + adrItem^.what + "\" has changed, but the object isn't in the database.")}; adrNewPart^.data = adrItem^.what^}; adrNewPart^.timeStamp = adrItem^.when; adrNewPart^.userName = adrItem^.who; adrNewPart^.adr = adrItem^.what; Çbundle //put the relative address into adr field Çlocal (s = string (adrItem^.what)) Çlocal (ix = string.patternMatch ("].", s)) Çs = string.delete (s, 1, ix + 1) ÇadrNewPart^.adr = s wp.newtextobject ("", @adrNewPart^.changes); adrNewPart^.platform = "both"; adrNewPart^.version = frontierVersion; local (bytes); pack (adrNewPart^, @bytes); bytes = base64.encode (bytes, infinity); delete (adrNewPart); adrNewPart^ = bytes; addedItems = addedItems + {adrItem^.what}; sys.systemTask ()}; adrTable^.ctPartsSent = sizeof (addedItems); //02/04/07, 08:22:36 by DAB return (parts)}; Çbundle // testing Çserver ("Frontier.root", tcp.dns.getMyDottedId (), date.prevMonth (clock.now ()), "Thomas A. Creedon", "icr...@ya...", 0) Çserver ("prefs.root", tcp.dns.getMyDottedId (), clock.now (), "Jake", "ja...@us...", 10) \ No newline at end of file |
|
From: creedon <icr...@us...> - 2006-02-18 18:47:17
|
Update of /cvsroot/frontierkernel/odbs/mainResponderRoot/mainResponder/localization/languages/english/strings/setupFrontier/popupText In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19644 Added Files: adminPassword Log Message: created --- NEW FILE: adminPassword --- FrontierVcsFile:1:TEXT:mainResponder.localization.languages.english.strings.setupFrontier.popupText.adminPassword The password entered in this field, along with the email address you entered, is used for administering this [[programName]] installation. |
|
From: creedon <icr...@us...> - 2006-02-18 18:44:23
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/system/verbs/builtins/Frontier In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18155 Modified Files: finder2Click Log Message: minor script formatting tweaks added support for open recent menu Index: finder2Click =================================================================== RCS file: /cvsroot/frontierkernel/odbs/frontierRoot/system/verbs/builtins/Frontier/finder2Click,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** finder2Click 26 Mar 2005 19:42:47 -0000 1.1.1.1 --- finder2Click 18 Feb 2006 18:44:20 -0000 1.2 *************** *** 1,3 **** FrontierVcsFile:1:scpt:system.verbs.builtins.Frontier.finder2Click ! on finder2Click (path) { local (filetype); filetype = file.type (path); Çmsg (filetype) local (adrScript = @Frontier.clickers.["type" + filetype]); if not defined (adrScript^) { adrScript = @Frontier.clickers.["type????"]}; if not defined (system.deskscripts) { Çmake sure the table is there new (tableType, @system.deskscripts)}; local (returnedVal); returnedVal = adrScript^ (path); if Frontier.findertofront { Finder.bringToFront ()}; Frontier.findertofront = false; return (returnedVal)} \ No newline at end of file --- 1,3 ---- FrontierVcsFile:1:scpt:system.verbs.builtins.Frontier.finder2Click ! on finder2Click (path) { ÇChanges Ç2/16/06; 7:11:18 PM by TAC Çminor script formatting tweaks Çadded support for open recent menu local (fileType = file.type (path)); Çmsg (fileType) local (adrScript = @Frontier.clickers.["type" + fileType]); if not (defined (adrScript^)) { adrScript = @Frontier.clickers.["type????"]}; if not (defined (system.deskscripts)) { // make sure the table is there new (tableType, @system.deskscripts)}; local (returnedVal = adrScript^ (path)); Frontier.openRecentMenu.addFile (path); if Frontier.finderToFront { Finder.bringToFront ()}; Frontier.finderToFront = false; return (returnedVal)} \ No newline at end of file |
|
From: creedon <icr...@us...> - 2006-02-18 18:42:52
|
Update of /cvsroot/frontierkernel/odbs/frontierRoot/system/verbs/builtins/Frontier/tools/windowTypes/commands In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17262 Modified Files: open Log Message: factored open recent menu code to Frontier.openRecentMenu Index: open =================================================================== RCS file: /cvsroot/frontierkernel/odbs/frontierRoot/system/verbs/builtins/Frontier/tools/windowTypes/commands/open,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** open 9 Feb 2006 03:13:02 -0000 1.4 --- open 18 Feb 2006 18:42:49 -0000 1.5 *************** *** 1,3 **** FrontierVcsFile:1:scpt:system.verbs.builtins.Frontier.tools.windowTypes.commands.open ! on open (f = nil) { ÇChanges Ç2/8/06; 5:18:31 PM by TAC Çadded some initialization for open recent menu Ç2/5/06; 11:14:02 AM by TAC Çupdate run callbacks to deal with the callback table not being there Ç9/24/05; 7:52:23 AM by TAC Çadded support for open recent menu Çreplicate what the kernel used to do for Frontier which was to scan the Frontier.clickers table getting the types of files that could be opened Çthe kernel now calls this script for Frontier when the Open menu item of the File menu is selected Ç2001 Ç12/2/01; 7:05:42 PM by JES Çif user.radio.settings.flExpired is defined, and true, open the serial number page. Ç07/03/01; 8:09:16 PM by JES ÇMigrated from builtins.pike.commands.open. Split out opml/outline file functionality into Frontier.tools.data.windowTypes.outlinerFile.open. Ç05/15/01; 1:33:09 AM by JES ÇFixed a bug where irrelevant whitespace would be preserved between the <?xml?> tag and the <opml> tag. If opening a .opml file, which has no contents, treat it as an empty OPML document, instead of as an empty text file. Fixed a bug where minimally represented OPML files (files with fewer than 200 characters) could not be opened. Ç03/5/01; 2:15:19 PM by JES ÇWhen opening OPML documents, set the window's timeCreated, so that it will be preserved in the dateCreated head element of the saved OPML. Ç02/21/01; 2:13:59 AM by JES ÇRecord the type and creator code when opening files on Macs. Record the line-ending format. Ç02/16/01; 1:36:30 PM by JES ÇMake sure that the window's modification time is the same as its table's lastOpened time. Prevents extraneous save-confirmation dialogs. Ç01/23/01; 7:40:05 PM by JES ÇSupport opml documents with unix line endings. Changed logic for determining if a file is an opml document so that Radio can open files that have xml headers, style sheet declarations, or comments before the <outlineDocument> element. Store the headers and comments so they can be included when the file is saved. Ç2000 Ç12/31/00; 5:30:33 PM by JES ÇOn Macs, convert opml to Mac text before converting to an outline. Ç12/19/00; 10:36:41 PM by JES ÇOn Macs, for text files whose extension corresponds to the type of an object database object, don't open the file in an outline. Makes it possible to import objects downloaded from apache servers which aren't configured to serve Frontier files with the correct mime type, or files copied from Windows computers. Ç12/15/00; 7:29:24 PM by PBS ÇOpen plain text files in an outline. Ç11/30/00; 12:14:58 AM by JES ÇDereference callback addresses in a try block in case a tool's odb is not opened Ç09/30/00; 12:47:45 PM by PBS ÇCall callbacks. Ç09/26/00; 3:46:09 PM by PBS ÇAdded explicit file type check for OPML in case the path is an 8.3 path or has a random suffix. Ç09/16/00; 3:35:19 PM by PBS ÇHandle .opml as well as .xml. Ç09/15/00; 1:56:44 PM by PBS ÇAllow an XML file of any type to be opened in the outliner. When it gets saved later, it's saved as raw XML, not as an outlineDocument. Ç07/23/00; 8:32:39 PM by PBS ÇCreated. Open a file. local (flOptionKey = kb.optionKey ()); if defined (user.radio.settings.flExpired) { if user.radio.settings.flExpired { radio.menuCommands.openPage (radio.data.systemurls.serialnumber); return (true)}}; if f == nil { local (typeList = 0); if not (system.environment.isRadio) { if not (flOptionKey) { local (adr); typeList = {'TABL'}; for adr in @Frontier.clickers { typeList = typeList + string.mid (nameOf (adr^), 5, 4)}}}; if not (file.getFileDialog ("Open a file:", @f, typeList)) { return (false)}}; //nothing was opened bundle { // user.prefs.openRecentMenu bundle { // init if not (defined (user.prefs.openRecentMenu)) { new (tableType, @user.prefs.openRecentMenu)}; if not (defined (user.prefs.openRecentMenu.items)) { new (tableType, @user.prefs.openRecentMenu.items)}; if not (defined (user.prefs.openRecentMenu.maxNumberOfItems)) { user.prefs.openRecentMenu.maxNumberOfItems = 20}}; local (adr, adrFileNameTable, i, fileNamesList = {}, newFileName); if sizeOf (user.prefs.openRecentMenu.items) == user.prefs.openRecentMenu.maxNumberOfItems { delete (@user.prefs.openRecentMenu.items [1])}; for i = sizeOf (user.prefs.openRecentMenu.items) downTo 1 { adr = @user.prefs.openRecentMenu.items [i]; if adr^ == f { delete (@user.prefs.openRecentMenu.items [i]); break}}; xml.addValue (@user.prefs.openRecentMenu.items, file.fileFromPath (f), f); bundle { // duplicate file names local (adr, adrFileNameTable, duplicateFileNameTable, s); new (tableType, @duplicateFileNameTable); for i = 1 to sizeOf (user.prefs.openRecentMenu.items) { adr = @user.prefs.openRecentMenu.items [i]; s = file.fileFromPath (adr^); if not (defined (duplicateFileNameTable.[s])) { new (tableType, @duplicateFileNameTable.[s])}; duplicateFileNameTable.[s].[adr] = nil}; for adrFileNameTable in @duplicateFileNameTable { if sizeOf (adrFileNameTable^) == 1 { continue}; for adr in adrFileNameTable { s = nameOf (adr^); adr = address (s); s = string.nthField (nameOf (adr^), '\t', 1) + "\t" + file.fileFromPath (adr^) + " Ñ " + string.popTrailing (file.fileFromPath (file.folderFromPath (adr^)), file.getPathChar ()); table.rename (adr, s)}}}; fileMenu.save ()}; on runCallbacks (stringAddress) { //call callbacks if defined (stringAddress^) { local (flConsumed = false); local (adrScript); for adrScript in @stringAddress^ { try { //11/30/00 JES while typeOf (adrScript^) == addressType { //follow addresses adrScript = adrScript^}; flConsumed = adrScript^ (f)}; //file is parameter if flConsumed { return (true)}}}; return (false)}; if runCallbacks ("user.tools.commandCallbacks.open") { return (true)}; if system.environment.isRadio { if runCallbacks ("user.pike.commandCallbacks.open") { return (true)}}; bundle { //look for a windowType that handles this command on runTypes (adrTypes) { local (adrType, flConsumed=false); for adrType in adrTypes { try { while typeOf (adrType^) == addressType { adrType = adrType^}; if defined (adrType^.open) { try { flConsumed = adrType^.open (f)}; if flConsumed { return (true)}}}}; return (false)}; if runTypes (@user.tools.windowTypes) { return (true)}; if runTypes (@Frontier.tools.data.windowTypes) { return (true)}}; fileMenu.open (f); return (true)}; Çbundle // testing Çopen () \ No newline at end of file --- 1,3 ---- FrontierVcsFile:1:scpt:system.verbs.builtins.Frontier.tools.windowTypes.commands.open ! on open (f = nil) { ÇChanges Ç2006 Ç2/16/06; 7:08:17 PM by TAC Çfactored open recent menu code to Frontier.openRecentMenu Ç2/8/06; 5:18:31 PM by TAC Çadded some initialization for open recent menu Ç2/5/06; 11:14:02 AM by TAC Çupdate run callbacks to deal with the callback table not being there Ç9/24/05; 7:52:23 AM by TAC Çadded support for open recent menu Çreplicate what the kernel used to do for Frontier which was to scan the Frontier.clickers table getting the types of files that could be opened Çthe kernel now calls this script for Frontier when the Open menu item of the File menu is selected Ç2001 Ç12/2/01; 7:05:42 PM by JES Çif user.radio.settings.flExpired is defined, and true, open the serial number page. Ç07/03/01; 8:09:16 PM by JES ÇMigrated from builtins.pike.commands.open. Split out opml/outline file functionality into Frontier.tools.data.windowTypes.outlinerFile.open. Ç05/15/01; 1:33:09 AM by JES ÇFixed a bug where irrelevant whitespace would be preserved between the <?xml?> tag and the <opml> tag. If opening a .opml file, which has no contents, treat it as an empty OPML document, instead of as an empty text file. Fixed a bug where minimally represented OPML files (files with fewer than 200 characters) could not be opened. Ç03/5/01; 2:15:19 PM by JES ÇWhen opening OPML documents, set the window's timeCreated, so that it will be preserved in the dateCreated head element of the saved OPML. Ç02/21/01; 2:13:59 AM by JES ÇRecord the type and creator code when opening files on Macs. Record the line-ending format. Ç02/16/01; 1:36:30 PM by JES ÇMake sure that the window's modification time is the same as its table's lastOpened time. Prevents extraneous save-confirmation dialogs. Ç01/23/01; 7:40:05 PM by JES ÇSupport opml documents with unix line endings. Changed logic for determining if a file is an opml document so that Radio can open files that have xml headers, style sheet declarations, or comments before the <outlineDocument> element. Store the headers and comments so they can be included when the file is saved. Ç2000 Ç12/31/00; 5:30:33 PM by JES ÇOn Macs, convert opml to Mac text before converting to an outline. Ç12/19/00; 10:36:41 PM by JES ÇOn Macs, for text files whose extension corresponds to the type of an object database object, don't open the file in an outline. Makes it possible to import objects downloaded from apache servers which aren't configured to serve Frontier files with the correct mime type, or files copied from Windows computers. Ç12/15/00; 7:29:24 PM by PBS ÇOpen plain text files in an outline. Ç11/30/00; 12:14:58 AM by JES ÇDereference callback addresses in a try block in case a tool's odb is not opened Ç09/30/00; 12:47:45 PM by PBS ÇCall callbacks. Ç09/26/00; 3:46:09 PM by PBS ÇAdded explicit file type check for OPML in case the path is an 8.3 path or has a random suffix. Ç09/16/00; 3:35:19 PM by PBS ÇHandle .opml as well as .xml. Ç09/15/00; 1:56:44 PM by PBS ÇAllow an XML file of any type to be opened in the outliner. When it gets saved later, it's saved as raw XML, not as an outlineDocument. Ç07/23/00; 8:32:39 PM by PBS ÇCreated. Open a file. local (flOptionKey = kb.optionKey ()); if defined (user.radio.settings.flExpired) { if user.radio.settings.flExpired { radio.menuCommands.openPage (radio.data.systemurls.serialnumber); return (true)}}; if f == nil { local (typeList = 0); if not (system.environment.isRadio) { if not (flOptionKey) { local (adr); typeList = {'TABL'}; for adr in @Frontier.clickers { typeList = typeList + string.mid (nameOf (adr^), 5, 4)}}}; if not (file.getFileDialog ("Open a file:", @f, typeList)) { return (false)}}; //nothing was opened Frontier.openRecentMenu.addFile (f); on runCallbacks (stringAddress) { //call callbacks if defined (stringAddress^) { local (flConsumed = false); local (adrScript); for adrScript in @stringAddress^ { try { //11/30/00 JES while typeOf (adrScript^) == addressType { //follow addresses adrScript = adrScript^}; flConsumed = adrScript^ (f)}; //file is parameter if flConsumed { return (true)}}}; return (false)}; if runCallbacks ("user.tools.commandCallbacks.open") { return (true)}; if system.environment.isRadio { if runCallbacks ("user.pike.commandCallbacks.open") { return (true)}}; bundle { //look for a windowType that handles this command on runTypes (adrTypes) { local (adrType, flConsumed=false); for adrType in adrTypes { try { while typeOf (adrType^) == addressType { adrType = adrType^}; if defined (adrType^.open) { try { flConsumed = adrType^.open (f)}; if flConsumed { return (true)}}}}; return (false)}; if runTypes (@user.tools.windowTypes) { return (true)}; if runTypes (@Frontier.tools.data.windowTypes) { return (true)}}; fileMenu.open (f); return (true)}; Çbundle // testing Çopen () \ No newline at end of file |