ipp_quickbase_devkit 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +87 -0
- data/README.rdoc +112 -0
- data/doc/QuickBaseClient.rb.htm +1896 -0
- data/doc/ReleaseNotes.txt +43 -0
- data/doc/qbc.makeCSVFile.qbc +4 -0
- data/doc/qbc.makeCSVFile.rb +4 -0
- data/doc/quickbase_adapter.rb.htm +399 -0
- data/examples/cookbookfiles/QuickBaseAPICookbook.html +2590 -0
- data/examples/cookbookfiles/addChangeRemoveUserRole.rb +21 -0
- data/examples/cookbookfiles/addOrEditRecord.rb +10 -0
- data/examples/cookbookfiles/application_object.rb +55 -0
- data/examples/cookbookfiles/applyRubyFormulas.rb +10 -0
- data/examples/cookbookfiles/average.rb +27 -0
- data/examples/cookbookfiles/backupApplication.rb +8 -0
- data/examples/cookbookfiles/cacheSchemas.rb +53 -0
- data/examples/cookbookfiles/calculateRunningTotals.rb +11 -0
- data/examples/cookbookfiles/copyrecords.rb +73 -0
- data/examples/cookbookfiles/count.rb +26 -0
- data/examples/cookbookfiles/createRecordNavigatorHTML.rb +42 -0
- data/examples/cookbookfiles/createReportDashboard.rb +35 -0
- data/examples/cookbookfiles/createTable.rb +12 -0
- data/examples/cookbookfiles/deviation.rb +25 -0
- data/examples/cookbookfiles/downloadCookbook.rb +97 -0
- data/examples/cookbookfiles/downloadFile.rb +10 -0
- data/examples/cookbookfiles/downloadFilesToFolder.rb +81 -0
- data/examples/cookbookfiles/downloadToTextFile.rb +64 -0
- data/examples/cookbookfiles/dumpSchema.rb +11 -0
- data/examples/cookbookfiles/duplicateRecord.rb +8 -0
- data/examples/cookbookfiles/dynamicMethods.rb +33 -0
- data/examples/cookbookfiles/editRecords.rb +15 -0
- data/examples/cookbookfiles/findJohnsLast10Records.rb +17 -0
- data/examples/cookbookfiles/findRubyRecords.rb +17 -0
- data/examples/cookbookfiles/formatCurrency.rb +24 -0
- data/examples/cookbookfiles/formatDate.rb +10 -0
- data/examples/cookbookfiles/formatDuration.rb +27 -0
- data/examples/cookbookfiles/formatPercent.rb +24 -0
- data/examples/cookbookfiles/getAllValuesForFields.rb +18 -0
- data/examples/cookbookfiles/getAppDTMInfo.rb +29 -0
- data/examples/cookbookfiles/getApplicationVariable.rb +5 -0
- data/examples/cookbookfiles/getChildTableDBID.rb +11 -0
- data/examples/cookbookfiles/getColumnListForReport.rb +6 -0
- data/examples/cookbookfiles/getFieldChoices.rb +13 -0
- data/examples/cookbookfiles/getFieldIDs.rb +6 -0
- data/examples/cookbookfiles/getFieldNames.rb +6 -0
- data/examples/cookbookfiles/getLastModTime.rb +8 -0
- data/examples/cookbookfiles/getLastRecModTime.rb +8 -0
- data/examples/cookbookfiles/getNumRecords.rb +8 -0
- data/examples/cookbookfiles/getNumTables.rb +4 -0
- data/examples/cookbookfiles/getRecord.rb +5 -0
- data/examples/cookbookfiles/getRecordDisplayURL.rb +13 -0
- data/examples/cookbookfiles/getRecordsAddedToday.rb +20 -0
- data/examples/cookbookfiles/getRecordsAsJSON.rb +6 -0
- data/examples/cookbookfiles/getReportNames.rb +25 -0
- data/examples/cookbookfiles/getRoleInfo.rb +48 -0
- data/examples/cookbookfiles/getServerStatus.rb +11 -0
- data/examples/cookbookfiles/getSortListForReport.rb +6 -0
- data/examples/cookbookfiles/getTableIDs.rb +6 -0
- data/examples/cookbookfiles/getTableName.rb +8 -0
- data/examples/cookbookfiles/getTableNames.rb +25 -0
- data/examples/cookbookfiles/getTimeCreated.rb +8 -0
- data/examples/cookbookfiles/getTimeInMilliseconds.rb +5 -0
- data/examples/cookbookfiles/getUserInfo.rb +26 -0
- data/examples/cookbookfiles/getUserRole.rb +15 -0
- data/examples/cookbookfiles/intranet.rb +101 -0
- data/examples/cookbookfiles/isAverageField.rb +17 -0
- data/examples/cookbookfiles/isDbidString.rb +8 -0
- data/examples/cookbookfiles/isTotalField.rb +16 -0
- data/examples/cookbookfiles/iterateDBPages.rb +8 -0
- data/examples/cookbookfiles/iterateFilteredRecords.rb +12 -0
- data/examples/cookbookfiles/iterateJoinRecords.rb +68 -0
- data/examples/cookbookfiles/iterateRecordInfos.rb +8 -0
- data/examples/cookbookfiles/iterateRecords.rb +23 -0
- data/examples/cookbookfiles/iterateSummaryRecords.rb +13 -0
- data/examples/cookbookfiles/iterateUnionRecords.rb +38 -0
- data/examples/cookbookfiles/listAccessibleApplications.rb +6 -0
- data/examples/cookbookfiles/logRequestAndResponseXML.rb +8 -0
- data/examples/cookbookfiles/lookupFieldPropertyByName.rb +62 -0
- data/examples/cookbookfiles/lookupFieldTypeByName.rb +10 -0
- data/examples/cookbookfiles/makeCSVFile.rb +4 -0
- data/examples/cookbookfiles/makeSlideShow.rb +42 -0
- data/examples/cookbookfiles/makerecs.rb +64 -0
- data/examples/cookbookfiles/max.rb +26 -0
- data/examples/cookbookfiles/min.rb +26 -0
- data/examples/cookbookfiles/percent.rb +29 -0
- data/examples/cookbookfiles/printChildElements.rb +54 -0
- data/examples/cookbookfiles/printNewRecords.rb +12 -0
- data/examples/cookbookfiles/processRESTRequest.rb +21 -0
- data/examples/cookbookfiles/provisionAndInviteNewUser.rb +13 -0
- data/examples/cookbookfiles/purgeRecords.rb +15 -0
- data/examples/cookbookfiles/quickbase_adapter.rb.htm +397 -0
- data/examples/cookbookfiles/quickbase_record_finder.zip +0 -0
- data/examples/cookbookfiles/recordAndFieldIterator.rb +24 -0
- data/examples/cookbookfiles/runImport.rb +9 -0
- data/examples/cookbookfiles/runQuickBaseTwitterConnector.rb +41 -0
- data/examples/cookbookfiles/sendToQuickBase.rb +33 -0
- data/examples/cookbookfiles/setDBvar.rb +6 -0
- data/examples/cookbookfiles/showRequestAndResponseXML.rb +8 -0
- data/examples/cookbookfiles/sqlQuery.rb +11 -0
- data/examples/cookbookfiles/stopOnError.rb +10 -0
- data/examples/cookbookfiles/sum.rb +26 -0
- data/examples/cookbookfiles/twitterFromQuickBase.rb +42 -0
- data/examples/cookbookfiles/twitterWithQuickBase.rb +36 -0
- data/examples/cookbookfiles/uploadCSVData.rb +20 -0
- data/examples/cookbookfiles/uploadExcelData.rb +22 -0
- data/examples/cookbookfiles/uploadFileEveryHour.rb +18 -0
- data/examples/cookbookfiles/uploadFileIntoNewRecord.rb +8 -0
- data/examples/cookbookfiles/uploadFilesFromFolder.exe +0 -0
- data/examples/cookbookfiles/uploadFilesFromFolder.rb +69 -0
- data/examples/cookbookfiles/useCompanyURL.rb +12 -0
- data/examples/cookbookfiles/userRoles.rb +49 -0
- data/examples/cookbookfiles/watchCommunityForum.rb +5 -0
- data/examples/cookbookfiles/wikifyTable.rb +29 -0
- data/examples/cookbookfiles/xmlShortcuts.rb +33 -0
- data/examples/pmp/app/controllers/application.rb +7 -0
- data/examples/pmp/app/controllers/contacts_controller.rb +8 -0
- data/examples/pmp/app/controllers/document_library_controller.rb +2 -0
- data/examples/pmp/app/controllers/issues_controller.rb +5 -0
- data/examples/pmp/app/controllers/projects_controller.rb +22 -0
- data/examples/pmp/app/controllers/resources_controller.rb +2 -0
- data/examples/pmp/app/controllers/tasks_controller.rb +13 -0
- data/examples/pmp/app/controllers/time_cards_controller.rb +5 -0
- data/examples/pmp/app/helpers/application_helper.rb +3 -0
- data/examples/pmp/app/helpers/contacts_helper.rb +2 -0
- data/examples/pmp/app/helpers/document_library_helper.rb +2 -0
- data/examples/pmp/app/helpers/issues_helper.rb +2 -0
- data/examples/pmp/app/helpers/projects_helper.rb +2 -0
- data/examples/pmp/app/helpers/resources_helper.rb +2 -0
- data/examples/pmp/app/helpers/tasks_helper.rb +2 -0
- data/examples/pmp/app/helpers/time_cards_helper.rb +2 -0
- data/examples/pmp/app/models/contacts.rb +26 -0
- data/examples/pmp/app/models/document_library.rb +2 -0
- data/examples/pmp/app/models/issues.rb +6 -0
- data/examples/pmp/app/models/projects.rb +26 -0
- data/examples/pmp/app/models/resources.rb +2 -0
- data/examples/pmp/app/models/tasks.rb +12 -0
- data/examples/pmp/app/models/time_cards.rb +7 -0
- data/examples/pmp/app/schemas/contacts.xml +1 -0
- data/examples/pmp/app/schemas/document_library.xml +1 -0
- data/examples/pmp/app/schemas/issues.xml +1 -0
- data/examples/pmp/app/schemas/pmp.xml +1 -0
- data/examples/pmp/app/schemas/projects.xml +1 -0
- data/examples/pmp/app/schemas/readme.txt +8 -0
- data/examples/pmp/app/schemas/resources.xml +1 -0
- data/examples/pmp/app/schemas/tasks.xml +1 -0
- data/examples/pmp/app/schemas/time_cards.xml +1 -0
- data/examples/pmp/app/views/contacts/companies.rhtml +31 -0
- data/examples/pmp/app/views/contacts/project_contacts.rhtml +31 -0
- data/examples/pmp/app/views/issues/filter_issues.rhtml +26 -0
- data/examples/pmp/app/views/layouts/application.rhtml +56 -0
- data/examples/pmp/app/views/projects/all_projects.rhtml +33 -0
- data/examples/pmp/app/views/projects/home.rhtml +11 -0
- data/examples/pmp/app/views/projects/my_open_projects.rhtml +27 -0
- data/examples/pmp/app/views/projects/open_projects.rhtml +44 -0
- data/examples/pmp/app/views/projects/project_sorted_by_company.rhtml +40 -0
- data/examples/pmp/app/views/projects/projects_sorted_by_priority.rhtml +30 -0
- data/examples/pmp/app/views/projects/updated_projects.rhtml +0 -0
- data/examples/pmp/app/views/tasks/all_tasks.rhtml +27 -0
- data/examples/pmp/app/views/tasks/search.rhtml +23 -0
- data/examples/pmp/app/views/tasks/search2.rhtml +23 -0
- data/examples/pmp/app/views/tasks/search3.rhtml +23 -0
- data/examples/pmp/app/views/time_cards/summary.rhtml +38 -0
- data/examples/pmp/config/boot.rb +45 -0
- data/examples/pmp/config/database.yml +30 -0
- data/examples/pmp/config/environment.rb +60 -0
- data/examples/pmp/config/environments/development.rb +21 -0
- data/examples/pmp/config/environments/production.rb +18 -0
- data/examples/pmp/config/environments/test.rb +19 -0
- data/examples/pmp/config/routes.rb +23 -0
- data/examples/pmp/db/migrate/001_create_projects.rb +10 -0
- data/examples/pmp/db/migrate/002_create_tasks.rb +10 -0
- data/examples/pmp/db/migrate/003_create_issues.rb +10 -0
- data/examples/pmp/db/migrate/004_create_document_libraries.rb +10 -0
- data/examples/pmp/db/migrate/005_create_resources.rb +10 -0
- data/examples/pmp/db/migrate/006_create_time_cards.rb +10 -0
- data/examples/pmp/db/migrate/007_create_contacts.rb +10 -0
- data/examples/pmp/public/404.html +30 -0
- data/examples/pmp/public/500.html +30 -0
- data/examples/pmp/public/app.index.html +277 -0
- data/examples/pmp/public/dispatch.cgi +10 -0
- data/examples/pmp/public/dispatch.fcgi +24 -0
- data/examples/pmp/public/dispatch.rb +10 -0
- data/examples/pmp/public/favicon.ico +0 -0
- data/examples/pmp/public/images/rails.png +0 -0
- data/examples/pmp/public/javascripts/application.js +2 -0
- data/examples/pmp/public/javascripts/controls.js +833 -0
- data/examples/pmp/public/javascripts/dragdrop.js +942 -0
- data/examples/pmp/public/javascripts/effects.js +1088 -0
- data/examples/pmp/public/javascripts/prototype.js +2515 -0
- data/examples/pmp/public/robots.txt +1 -0
- data/examples/pmp/test/fixtures/contacts.yml +5 -0
- data/examples/pmp/test/fixtures/document_libraries.yml +5 -0
- data/examples/pmp/test/fixtures/issues.yml +5 -0
- data/examples/pmp/test/fixtures/projects.yml +5 -0
- data/examples/pmp/test/fixtures/resources.yml +5 -0
- data/examples/pmp/test/fixtures/tasks.yml +5 -0
- data/examples/pmp/test/fixtures/time_cards.yml +5 -0
- data/examples/pmp/test/functional/contacts_controller_test.rb +18 -0
- data/examples/pmp/test/functional/document_library_controller_test.rb +18 -0
- data/examples/pmp/test/functional/issues_controller_test.rb +18 -0
- data/examples/pmp/test/functional/projects_controller_test.rb +18 -0
- data/examples/pmp/test/functional/resources_controller_test.rb +18 -0
- data/examples/pmp/test/functional/tasks_controller_test.rb +18 -0
- data/examples/pmp/test/functional/time_cards_controller_test.rb +18 -0
- data/examples/pmp/test/test_helper.rb +28 -0
- data/examples/pmp/test/unit/contacts_test.rb +10 -0
- data/examples/pmp/test/unit/document_library_test.rb +10 -0
- data/examples/pmp/test/unit/issues_test.rb +10 -0
- data/examples/pmp/test/unit/projects_test.rb +10 -0
- data/examples/pmp/test/unit/resources_test.rb +10 -0
- data/examples/pmp/test/unit/tasks_test.rb +10 -0
- data/examples/pmp/test/unit/time_cards_test.rb +10 -0
- data/lib/QuickBaseClient.rb +5054 -0
- data/lib/QuickBaseCommandLineClient.rb +401 -0
- data/lib/QuickBaseContactsAppBuilder.rb +419 -0
- data/lib/QuickBaseEmailer.rb +334 -0
- data/lib/QuickBaseEventNotifier.rb +592 -0
- data/lib/QuickBaseMisc.rb +96 -0
- data/lib/QuickBaseObjects.rb +566 -0
- data/lib/QuickBaseRSSGenerator.rb +286 -0
- data/lib/QuickBaseTextData.rb +545 -0
- data/lib/QuickBaseTwitterConnector.rb +300 -0
- data/lib/QuickBaseWebClient.rb +126 -0
- data/lib/WorkPlaceClient.rb +45 -0
- data/lib/qbc.makeCSVFile.qbc +4 -0
- data/lib/qbc.makeCSVFile.rb +17 -0
- data/lib/quickbase_adapter.rb +320 -0
- data/lib/runFieldEntryDialog.rb +151 -0
- data/lib/runOfflineFieldEntryDialog.rb +203 -0
- data/rakefile +100 -0
- data/test/run_tests.bat +7 -0
- data/test/spec_all_tests.rb +13 -0
- data/test/spec_smoke_tests.rb +58 -0
- data/test/spec_workplace_addrecord_test.rb +46 -0
- data/test/spec_workplace_base_test.rb +57 -0
- data/test/spec_workplace_editrecord_test.rb +38 -0
- data/test/spec_workplace_json_test.rb +38 -0
- data/test/spec_workplace_objects_test.rb +39 -0
- data/test/spec_workplace_smoke_tests.rb +45 -0
- metadata +353 -0
@@ -0,0 +1,401 @@
|
|
1
|
+
#--#####################################################################
|
2
|
+
# Copyright (c) 2009 Gareth Lewis and Intuit, Inc.
|
3
|
+
#
|
4
|
+
# All rights reserved. This program and the accompanying materials
|
5
|
+
# are made available under the terms of the Eclipse Public License v1.0
|
6
|
+
# which accompanies this distribution, and is available at
|
7
|
+
# http://www.opensource.org/licenses/eclipse-1.0.php
|
8
|
+
#
|
9
|
+
# Contributors:
|
10
|
+
# Gareth Lewis - Initial contribution.
|
11
|
+
# Intuit Partner Platform.
|
12
|
+
#++#####################################################################
|
13
|
+
|
14
|
+
require 'QuickBaseClient'
|
15
|
+
|
16
|
+
module QuickBase
|
17
|
+
|
18
|
+
# This implements an extensible command line interface to QuickBase.
|
19
|
+
# Use setCommand() and setCommandAlias() to extend or modify the interface.
|
20
|
+
#
|
21
|
+
# Call run() to use the command line interactively.
|
22
|
+
#
|
23
|
+
# Call run( filename ) to run the commands in a file.
|
24
|
+
#
|
25
|
+
# Commands entered during an interactive session can be recorded to a file.
|
26
|
+
#
|
27
|
+
# In addition to the @commands loaded in initialize(), any public method
|
28
|
+
# from class Client can be used as a command, and any line of Ruby code
|
29
|
+
# can be executed.
|
30
|
+
#
|
31
|
+
# Run a command line client session interactively, or using the commands in a file. e.g.:
|
32
|
+
# * ruby QuickBaseCommandLineClient.rb run
|
33
|
+
# * ruby QuickBaseCommandLineClient.rb run dailyTasks.qbc
|
34
|
+
# * ruby -e "require 'quickbasecommandlineclient';QuickBase::CommandLineClient.new.run"
|
35
|
+
#
|
36
|
+
class CommandLineClient < Client
|
37
|
+
|
38
|
+
attr_reader :usage, :commands, :aliases, :availableCommands
|
39
|
+
|
40
|
+
# Information needed to display and run a command
|
41
|
+
class Command
|
42
|
+
attr_reader :name, :desc, :prerequisite, :args, :code, :prompt
|
43
|
+
def initialize( name, desc, prerequisite, args, code, prompt = nil )
|
44
|
+
@name, @desc, @prerequisite, @args, @code, @prompt = name, desc, prerequisite, args, code, prompt
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Display a message telling the user what to do.
|
49
|
+
def showUsage
|
50
|
+
if @usage.nil?
|
51
|
+
@usage = <<USAGE
|
52
|
+
|
53
|
+
Enter a command from the list of available commands.
|
54
|
+
The list of commands may change after each command.
|
55
|
+
Type TABs, commas, or spaces between parts of a command.
|
56
|
+
Use double-quotes if your commands contain TABs, commas or spaces.
|
57
|
+
|
58
|
+
e.g. addfield "my text field" text
|
59
|
+
|
60
|
+
USAGE
|
61
|
+
end
|
62
|
+
|
63
|
+
puts @usage
|
64
|
+
end
|
65
|
+
|
66
|
+
# Set up some basic commands and their abbreviations
|
67
|
+
def initialize
|
68
|
+
super
|
69
|
+
|
70
|
+
# the main purpose of commands and aliases loaded here is reduce the
|
71
|
+
# steps, typing and clicking needed to get simple things done in QuickBase
|
72
|
+
|
73
|
+
setCommand( "signin", "Sign into QuickBase", "@ticket.nil?", [ "username", "password" ], [ :authenticate ] )
|
74
|
+
|
75
|
+
setCommand( "create", "Create an application", "@ticket", [ "application name", "description" ], [ :createDatabase, :onChangedDbid ] )
|
76
|
+
setCommand( "copy", "Copy an application, with/out data", "@ticket and @dbid", [ "name", "desc", "keep data?" ], [ :_cloneDatabase, :onChangedDbid ] )
|
77
|
+
setCommand( "open", "Open an application", "@ticket", [ "application name" ], [ :findDBByname, :onChangedDbid ] )
|
78
|
+
setCommand( "use", "Use a table from the current application","@ticket and @dbid and @chdbids", [ "table name" ], [ :lookupChdbid, :onChangedDbid ] )
|
79
|
+
|
80
|
+
setCommand( "select", "Select records using a query name", "@ticket and @dbid", [ "query name" ], [ :_doQueryName, :resetrid ] )
|
81
|
+
setCommand( "setrecord", "Set the active record", "@ticket and @dbid", [ "record number" ], [ :_setActiveRecord ] )
|
82
|
+
|
83
|
+
setCommand( "changerecords", "Conditionally set field value", "@ticket and @dbid and @fields", [ "field", "value", "testfld", "test", "testval" ], [ :changeRecords ], "Are you sure?" )
|
84
|
+
setCommand( "deleterecords", "Conditionally delete records", "@ticket and @dbid and @fields", [ "test field", "test", "test value" ], [ :deleteRecords ], "Are you sure?" )
|
85
|
+
setCommand( "deleteallrecords", "Delete all records", "@ticket and @dbid", nil, [ :deleteRecords, :resetrid ], "Are you sure?" )
|
86
|
+
|
87
|
+
setCommand( "addrecord","Add a record to the active table", "@ticket and @dbid", nil, [ :_addRecord, :_getRecordInfo ] )
|
88
|
+
setCommand( "setfield", "Set a field value in the active record", "@ticket and @dbid and @rid", [ "field name", "value"], [ :setFieldValue ] )
|
89
|
+
|
90
|
+
setCommand( "addfield", "Add a field to the active table", "@ticket and @dbid", [ "field name" , "field type" ], [ :_addField ] )
|
91
|
+
setCommand( "addfieldchoices", "Add value choices for a field", "@ticket and @dbid", [ "field name" , "[choice1,choice2]" ], [ :_fieldNameAddChoices ] )
|
92
|
+
|
93
|
+
setCommand( "importfile","Import records from a CSV file", "@ticket and @dbid", [ "file name" ], [ :importCSVFile, :resetrid ] )
|
94
|
+
setCommand( "importexcelfile","Import records from Excel", "@ticket and @dbid", [ "Excel(.xls) file name", "last import column" ], [ :_importFromExcel, :resetrid ] )
|
95
|
+
setCommand( "exportfile","Export records to a CSV file", "@ticket and @dbid", [ "file name" ], [ :makeSVFile ] )
|
96
|
+
|
97
|
+
setCommand( "uploadfile", "Upload a file into a new record", "@ticket and @dbid", [ "file name", "file attachment field name" ], [:_uploadFile] )
|
98
|
+
setCommand( "updatefile", "Update the file attachment in a record","@ticket and @dbid and @rid", [ "file name", "file attachment field name" ], [:_updateFile] )
|
99
|
+
|
100
|
+
setCommand( "deletefield", "Delete a field from the active table", "@ticket and @dbid", [ "field name" ], [:_deleteFieldName], "Are you sure?" )
|
101
|
+
setCommand( "deletetable", "Delete the active table", "@ticket and @dbid", nil, [ :_deleteDatabase, :resetrid ], "Are you sure?" )
|
102
|
+
|
103
|
+
setCommand( "print", "Prints the results of the last command", "@ticket", nil, [ :_printChildElements ] )
|
104
|
+
setCommand( "listapps", "Lists the applications you can access", "@ticket", nil, [ :grantedDBs, :_printChildElements ] )
|
105
|
+
|
106
|
+
setCommand( "uselog", "Logs requests and responses to a file", "true", [ "log file" ], [ :logToFile ] )
|
107
|
+
|
108
|
+
setCommand( "signout", "Sign out of QuickBase", "@ticket", nil, [ :signOut ] )
|
109
|
+
|
110
|
+
@aliases = { "si" => "signin", "la" => "listapps", "o" => "open",
|
111
|
+
"p" => "print", "so" => "signout", "af" => "addfield",
|
112
|
+
"sel" => "select", "ar" => "addrecord", "sf" => "setfield",
|
113
|
+
"sr" => "setrecord", "q" => "quit", "if" => "importfile",
|
114
|
+
"ef" => "exportfile", "ulf" => "uploadfile", "udf" => "updatefile",
|
115
|
+
"r" => "run", "ul" => "uselog" }
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
# Add a command to the list of available commands
|
120
|
+
def setCommand( name, desc, prerequisite, args, code, prompt = nil )
|
121
|
+
@commands = Hash.new if @commands.nil?
|
122
|
+
cmd = Command.new( name, desc, prerequisite, args, code, prompt )
|
123
|
+
@commands[ name ] = cmd
|
124
|
+
end
|
125
|
+
|
126
|
+
# Set the alias, or abbreviation, for a command
|
127
|
+
def setCommandAlias( anAlias, cmd )
|
128
|
+
@aliases = Hash.new if @aliases.nil?
|
129
|
+
@aliases[ anAlias ] = cmd
|
130
|
+
end
|
131
|
+
|
132
|
+
# Get a list of commands that are valid now
|
133
|
+
def evalAvailableCommands
|
134
|
+
@availableCommands = Array.new
|
135
|
+
@commands.each{ |name,cmd|
|
136
|
+
@availableCommands << name if eval( cmd.prerequisite )
|
137
|
+
}
|
138
|
+
end
|
139
|
+
|
140
|
+
# Make a string to display a command to the user
|
141
|
+
def cmdString( command, include_desc = true )
|
142
|
+
|
143
|
+
ret = ""
|
144
|
+
|
145
|
+
cmd = @commands[command]
|
146
|
+
if cmd
|
147
|
+
|
148
|
+
cmdalias = ""
|
149
|
+
if @aliases and @aliases.has_value?( cmd.name )
|
150
|
+
@aliases.each{ |k,v| cmdalias << "#{k}," if v == cmd.name }
|
151
|
+
cmdalias[-1] = ""
|
152
|
+
cmdalias = "(#{cmdalias})"
|
153
|
+
end
|
154
|
+
|
155
|
+
if cmd.args
|
156
|
+
if include_desc
|
157
|
+
ret = "#{cmd.name}#{cmdalias} '#{cmd.args.join( ',' )}': #{cmd.desc}"
|
158
|
+
else
|
159
|
+
ret = "#{cmd.name}#{cmdalias} '#{cmd.args.join( ',' )}'"
|
160
|
+
end
|
161
|
+
else
|
162
|
+
if include_desc
|
163
|
+
ret = "#{cmd.name}#{cmdalias} : #{cmd.desc}"
|
164
|
+
else
|
165
|
+
ret = "#{cmd.name}#{cmdalias}"
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
ret
|
170
|
+
end
|
171
|
+
|
172
|
+
# Display the commands currently available
|
173
|
+
def showAvailableCommands
|
174
|
+
evalAvailableCommands
|
175
|
+
puts "\nCommands available:"
|
176
|
+
puts
|
177
|
+
puts " quit(q): End this command session"
|
178
|
+
puts " usage: Show how to use this program"
|
179
|
+
puts " ruby 'rubycode': run a line of ruby language code"
|
180
|
+
puts " run(r) 'filename': run the commands in a file"
|
181
|
+
puts " record 'filename': records your commands in a file"
|
182
|
+
@availableCommands.sort().each { |cmd| puts " #{cmdString( cmd )}" }
|
183
|
+
puts "\n"
|
184
|
+
end
|
185
|
+
|
186
|
+
# Prompt the user if a command requires an 'Are you sure?' type of response
|
187
|
+
def prompt( promptString )
|
188
|
+
if promptString
|
189
|
+
print "#{promptString} (Press 'y' if Yes): "
|
190
|
+
yn = gets
|
191
|
+
yn.chop!
|
192
|
+
return false if yn != "y"
|
193
|
+
end
|
194
|
+
true
|
195
|
+
end
|
196
|
+
|
197
|
+
# The main command entry and processing loop
|
198
|
+
def run( filename = nil )
|
199
|
+
|
200
|
+
begin
|
201
|
+
|
202
|
+
if filename
|
203
|
+
file = File.new( filename )
|
204
|
+
else
|
205
|
+
showUsage
|
206
|
+
end
|
207
|
+
|
208
|
+
recordedCommandsFile = nil
|
209
|
+
|
210
|
+
loop {
|
211
|
+
|
212
|
+
resetErrorInfo
|
213
|
+
|
214
|
+
if filename.nil?
|
215
|
+
showAvailableCommands
|
216
|
+
|
217
|
+
print "Enter a command: "
|
218
|
+
inputLine = gets
|
219
|
+
|
220
|
+
else
|
221
|
+
evalAvailableCommands
|
222
|
+
inputLine = file.gets
|
223
|
+
break if inputLine.nil?
|
224
|
+
end
|
225
|
+
|
226
|
+
if inputLine.index( '\t' )
|
227
|
+
separator = "\t"
|
228
|
+
elsif inputLine.index( "," )
|
229
|
+
separator = ","
|
230
|
+
else
|
231
|
+
separator = " "
|
232
|
+
end
|
233
|
+
|
234
|
+
args = inputLine.split
|
235
|
+
inputcommand = args[0]
|
236
|
+
|
237
|
+
if filename.nil? and recordedCommandsFile and inputcommand != "record"
|
238
|
+
recordedCommandsFile.write( inputLine )
|
239
|
+
end
|
240
|
+
|
241
|
+
input = splitString( inputLine, separator )
|
242
|
+
|
243
|
+
if input and input.length > 0
|
244
|
+
|
245
|
+
(0..input.length-1).each{ |i| input[i].strip!;input[i].gsub!( "\"", "") }
|
246
|
+
|
247
|
+
if @aliases and @aliases.include?( inputcommand )
|
248
|
+
command = @aliases[ inputcommand ]
|
249
|
+
else
|
250
|
+
command = inputcommand
|
251
|
+
end
|
252
|
+
|
253
|
+
break if command == "quit"
|
254
|
+
|
255
|
+
if command == "usage"
|
256
|
+
showUsage
|
257
|
+
elsif command == "record"
|
258
|
+
if input.length == 2
|
259
|
+
recordedCommandsFile.close if recordedCommandsFile
|
260
|
+
recordedCommandsFile = File.open( input[ 1 ], "w" )
|
261
|
+
puts "Unable to open file '#{input[ 1 ]}' for writing." if recordedCommandsFile.nil?
|
262
|
+
elsif input.length < 2
|
263
|
+
puts "Command file name is missing. Enter 'record filename'"
|
264
|
+
end
|
265
|
+
elsif command == "run"
|
266
|
+
if input.length == 2 and FileTest.readable?( input[ 1 ] )
|
267
|
+
run( input[ 1 ] )
|
268
|
+
elsif input.length < 2
|
269
|
+
puts "Command file name is missing. Enter 'run filename'"
|
270
|
+
else
|
271
|
+
puts "'#{input[1]}' is not a readable file"
|
272
|
+
end
|
273
|
+
elsif command == "ruby"
|
274
|
+
begin
|
275
|
+
inputLine.sub!( "ruby", "" )
|
276
|
+
puts inputLine
|
277
|
+
eval( inputLine )
|
278
|
+
rescue StandardError => e
|
279
|
+
puts "Error: #{e}"
|
280
|
+
end
|
281
|
+
elsif command == "?"
|
282
|
+
showAvailableCommands
|
283
|
+
puts "API commands:\n#{clientMethods().sort().join(', ')}\n"
|
284
|
+
elsif @commands and @commands.include?( command ) and @availableCommands.include?( command )
|
285
|
+
|
286
|
+
cmd = @commands[ command ]
|
287
|
+
input.shift
|
288
|
+
|
289
|
+
if cmd.args and cmd.args.length == 1
|
290
|
+
inputLine.sub!( inputcommand, "" )
|
291
|
+
inputLine.strip!
|
292
|
+
input = [ inputLine ]
|
293
|
+
end
|
294
|
+
|
295
|
+
if prompt( cmd.prompt )
|
296
|
+
begin
|
297
|
+
if cmd.args and input.length == cmd.args.length
|
298
|
+
case input.length
|
299
|
+
when 1
|
300
|
+
puts "#{cmd.code[0]}( #{input[0]} )"
|
301
|
+
send( cmd.code[0], input[0] )
|
302
|
+
when 2
|
303
|
+
puts "#{cmd.code[0]}( #{input[0]}, #{input[1]} )"
|
304
|
+
send( cmd.code[0], input[0], input[1] )
|
305
|
+
when 3
|
306
|
+
puts "#{cmd.code[0]}( #{input[0]}, #{input[1]}, #{input[2]} )"
|
307
|
+
send( cmd.code[0], input[0], input[1], input[2] )
|
308
|
+
when 4
|
309
|
+
puts "#{cmd.code[0]}( #{input[0]}, #{input[1]}, #{input[2]} , #{input[3]})"
|
310
|
+
send( cmd.code[0], input[0], input[1], input[2], input[3] )
|
311
|
+
when 5
|
312
|
+
puts "#{cmd.code[0]}( #{input[0]}, #{input[1]}, #{input[2]} , #{input[3]}, #{input[4]})"
|
313
|
+
send( cmd.code[0], input[0], input[1], input[2], input[3], input[4] )
|
314
|
+
end
|
315
|
+
|
316
|
+
(1..cmd.code.length-1).each{ |c|
|
317
|
+
puts "#{cmd.code[c]}"
|
318
|
+
send( cmd.code[c] )
|
319
|
+
}
|
320
|
+
|
321
|
+
elsif cmd.args.nil?
|
322
|
+
cmd.code.each{ |c|
|
323
|
+
puts "#{c}"
|
324
|
+
send( c )
|
325
|
+
}
|
326
|
+
else
|
327
|
+
puts "Information missing: #{cmdString( command, false )}"
|
328
|
+
end
|
329
|
+
rescue StandardError => e
|
330
|
+
puts "Error: #{e}"
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
elsif clientMethods().include?( command )
|
335
|
+
puts inputLine
|
336
|
+
begin
|
337
|
+
eval( inputLine )
|
338
|
+
rescue StandardError => e
|
339
|
+
puts "Error: #{e}"
|
340
|
+
end
|
341
|
+
else
|
342
|
+
puts "Invalid command '#{inputcommand}'"
|
343
|
+
end
|
344
|
+
|
345
|
+
if (!@requestSucceeded.nil?) and @requestSucceeded == false
|
346
|
+
puts "\n#{@lastError}"
|
347
|
+
end
|
348
|
+
|
349
|
+
if filename.nil?
|
350
|
+
print "\nPress Enter to continue..."
|
351
|
+
gets
|
352
|
+
end
|
353
|
+
|
354
|
+
end
|
355
|
+
|
356
|
+
}
|
357
|
+
|
358
|
+
rescue StandardError => e
|
359
|
+
puts "Error: #{e}"
|
360
|
+
ensure
|
361
|
+
signOut if @ticket and filename.nil?
|
362
|
+
recordedCommandsFile.close if recordedCommandsFile
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
end #class CommandLineClient -------------------------------------
|
367
|
+
|
368
|
+
end #module QuickBase ---------------------------------------------
|
369
|
+
|
370
|
+
def testQuickBaseCLClient( filename = nil )
|
371
|
+
include QuickBase
|
372
|
+
qbCLClient = CommandLineClient.new
|
373
|
+
qbCLClient.run( filename )
|
374
|
+
end
|
375
|
+
|
376
|
+
#-----------------------------------------------------------------------------------
|
377
|
+
# To test the QuickBase::CommandLineClient, copy the #require 'QuickBaseCommandLineClient'
|
378
|
+
# and '#testQuickBaseCLClient' lines # below into testQBCLC.rb, uncomment the
|
379
|
+
# lines and run 'ruby testQBCLC.rb' .
|
380
|
+
#-----------------------------------------------------------------------------------
|
381
|
+
#require 'QuickBaseCommandLineClient'
|
382
|
+
#testQuickBaseCLClient
|
383
|
+
|
384
|
+
# Run a command line client session interactively, or using the commands in a file.
|
385
|
+
# e.g. ruby QuickBaseCommandLineClient.rb run
|
386
|
+
# e.g. ruby QuickBaseCommandLineClient.rb run dailyTasks.qbc
|
387
|
+
if __FILE__ == $0 and ARGV.length > 0
|
388
|
+
if ARGV[0] == "run"
|
389
|
+
qbclc = QuickBase::CommandLineClient.new
|
390
|
+
if ARGV.length > 1
|
391
|
+
if FileTest.readable?( ARGV[1] )
|
392
|
+
qbclc.run( ARGV[1] )
|
393
|
+
else
|
394
|
+
puts "File '#{ARGV[1]}' is not a readable file."
|
395
|
+
end
|
396
|
+
else
|
397
|
+
ARGV.shift
|
398
|
+
qbclc.run()
|
399
|
+
end
|
400
|
+
end
|
401
|
+
end
|
@@ -0,0 +1,419 @@
|
|
1
|
+
#--#####################################################################
|
2
|
+
# Copyright (c) 2009 Gareth Lewis and Intuit, Inc.
|
3
|
+
#
|
4
|
+
# All rights reserved. This program and the accompanying materials
|
5
|
+
# are made available under the terms of the Eclipse Public License v1.0
|
6
|
+
# which accompanies this distribution, and is available at
|
7
|
+
# http://www.opensource.org/licenses/eclipse-1.0.php
|
8
|
+
#
|
9
|
+
# Contributors:
|
10
|
+
# Gareth Lewis - Initial contribution.
|
11
|
+
# Intuit Partner Platform.
|
12
|
+
#++#####################################################################
|
13
|
+
|
14
|
+
require 'WorkPlaceClient'
|
15
|
+
|
16
|
+
# usage: ruby QuickBaseContactsAppBuilder.rb username password [useWorkPlace].
|
17
|
+
# Creates a very simple Contacts database in QuickBase and a Rails app for it.
|
18
|
+
class QuickBaseContactsAppBuilder
|
19
|
+
|
20
|
+
def initialize(username,password,useWorkPlace=nil)
|
21
|
+
begin
|
22
|
+
if useWorkPlace
|
23
|
+
@qbc = QuickBase::WorkPlaceClient.new(username,password)
|
24
|
+
else
|
25
|
+
@qbc = QuickBase::Client.new(username,password)
|
26
|
+
end
|
27
|
+
|
28
|
+
raise @qbc.errtext if ! @qbc.requestSucceeded
|
29
|
+
|
30
|
+
@useWorkPlace = useWorkPlace
|
31
|
+
@username, @password = username,password
|
32
|
+
|
33
|
+
@rails_appname = @username.downcase.gsub( /\W/, "_" )
|
34
|
+
@rails_appname << "_contacts"
|
35
|
+
@rootClassName = ""
|
36
|
+
@rails_appname.split(/_/).each{|s| @rootClassName << s.capitalize }
|
37
|
+
@modelClassName = @rootClassName.dup
|
38
|
+
@modelClassName[-1] = ""
|
39
|
+
@modelFileName = @rails_appname.dup
|
40
|
+
@modelFileName[-1] = ""
|
41
|
+
@modelFileName << ".rb"
|
42
|
+
|
43
|
+
buildApp
|
44
|
+
rescue StandardError => connectionError
|
45
|
+
puts "\n\nError connectiong to #{ useWorkPlace ? 'workplace.intuit.com' : 'www.quickbase.com'}: #{connectionError}\n\n"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def buildApp
|
52
|
+
if runRailsCommand
|
53
|
+
#@qbc.printRequestsAndResponses=true
|
54
|
+
if @qbc.findDBByName(@rails_appname) or @qbc.createDatabase(@rails_appname,"This application was generated using QuickBaseContactsAppBuilder.rb.")
|
55
|
+
begin
|
56
|
+
@contactsTableID = @qbc.lookupChdbid(@rails_appname, @qbc.dbid)
|
57
|
+
addFields
|
58
|
+
addSampleData
|
59
|
+
begin
|
60
|
+
generateRailsFiles
|
61
|
+
displayDoneMsg
|
62
|
+
rescue StandardError => localerror
|
63
|
+
puts "\n\nError generating rails files: #{localerror}\n\n"
|
64
|
+
end
|
65
|
+
rescue StandardError => qberror
|
66
|
+
if qberror.to_s.include?("Invalid Application Token")
|
67
|
+
puts "\n\nPlease go to QuickBase, open the '#{@rails_appname}' app, uncheck 'Require Application Tokens' and run this ruby script again.\n\n"
|
68
|
+
else
|
69
|
+
puts "\n\nError adding fields or data to the '#{@rails_appname}' app: #{qberror}."
|
70
|
+
puts "Please go to QuickBase, open the '#{@rails_appname}' app, uncheck 'Require Application Tokens' and run this ruby script again.\n\n"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
else
|
74
|
+
puts "Error creating the #{@rails_appname} application.\nAre '#{@username}' and '#{@password}' correct?\n"
|
75
|
+
end
|
76
|
+
else
|
77
|
+
puts "Error running 'rails #{@rails_appname}'.\n"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def fields
|
82
|
+
["name","phone","email","title","company"]
|
83
|
+
end
|
84
|
+
|
85
|
+
def addFields
|
86
|
+
@clist = ""
|
87
|
+
fields.each{|field|
|
88
|
+
id,label = @qbc.addField(@contactsTableID,field,"text")
|
89
|
+
@clist << "#{id.dup}."
|
90
|
+
}
|
91
|
+
@clist[-1] = ""
|
92
|
+
end
|
93
|
+
|
94
|
+
def addSampleData
|
95
|
+
|
96
|
+
sampleData = <<ENDSampleData
|
97
|
+
Fred Davis,434-344-1243,freddavis@internet.com,CEO,DavisCo
|
98
|
+
David Fredis,344-434-1243,davidfredis@email.com,Product Manager,Blaxo LLC
|
99
|
+
Freda Davis,434-344-1243,fredadavis@internet.com,Technical Lead,Nerds Inc.
|
100
|
+
Andy Tabo,454-344-1243,atabo@internet.co.uk,Senior Advisor,Carpet World
|
101
|
+
Larry Good,334-344-1243,lgood@yahaol.com,VP,Harbor Ventures LLC
|
102
|
+
ENDSampleData
|
103
|
+
|
104
|
+
@qbc.importFromCSV(@contactsTableID, @qbc.formatImportCSV(sampleData), @clist)
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
def runRailsCommand
|
109
|
+
ret = verifyDirectories
|
110
|
+
if runningOnWindows
|
111
|
+
ret = system('rails.bat', @rails_appname) unless ret
|
112
|
+
ret = system('rails.cmd', @rails_appname) unless ret
|
113
|
+
else
|
114
|
+
ret = system('rails', @rails_appname) unless ret
|
115
|
+
end
|
116
|
+
ret
|
117
|
+
end
|
118
|
+
|
119
|
+
def generateRailsFiles
|
120
|
+
#verifyDirectories
|
121
|
+
generateModel
|
122
|
+
generateViews
|
123
|
+
generateController
|
124
|
+
generateHelper
|
125
|
+
generateDatabaseConfig
|
126
|
+
generateRoutes
|
127
|
+
renameIndexHTML
|
128
|
+
end
|
129
|
+
|
130
|
+
def verifyDirectories
|
131
|
+
ok = File.directory?("#{@rails_appname}/app/models/")
|
132
|
+
ok = File.directory?("#{@rails_appname}/app/views/#{@rails_appname}/") if ok
|
133
|
+
ok = File.directory?("#{@rails_appname}/app/controllers/") if ok
|
134
|
+
ok = File.directory?("#{@rails_appname}/app/helpers/") if ok
|
135
|
+
ok = File.directory?("#{@rails_appname}/config/") if ok
|
136
|
+
ok
|
137
|
+
end
|
138
|
+
|
139
|
+
def generateModel
|
140
|
+
|
141
|
+
modelCode = <<ENDModelCode
|
142
|
+
|
143
|
+
class #{@modelClassName} < ActiveRecord::Base
|
144
|
+
def self.listAll
|
145
|
+
find_by_sql("#{@contactsTableID}:{'0'.CT.''}")
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
ENDModelCode
|
150
|
+
|
151
|
+
File.open("#{@rails_appname}/app/models/#{@modelFileName}", "w"){|f|f.write(modelCode)}
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
def generateViews
|
156
|
+
Dir.mkdir("#{@rails_appname}/app/views/#{@rails_appname}/") unless File.directory?("#{@rails_appname}/app/views/#{@rails_appname}/")
|
157
|
+
generateListAllView
|
158
|
+
generateShowView
|
159
|
+
generateNewView
|
160
|
+
generateEditView
|
161
|
+
generateNewContactForm
|
162
|
+
generateEditContactForm
|
163
|
+
end
|
164
|
+
|
165
|
+
def generateListAllView
|
166
|
+
|
167
|
+
listAllCode = <<ENDListAllCode
|
168
|
+
|
169
|
+
<h1>List All</h1>
|
170
|
+
<hr>
|
171
|
+
<% for contact in @contacts do %>
|
172
|
+
<%= contact.name %>,<%= contact.phone %>,<%= contact.email %>,<%= contact.title %>,<%= contact.company %>
|
173
|
+
<%= link_to 'Show', :action => 'show', :id => contact %>,
|
174
|
+
<%= link_to 'Edit', :action => 'edit', :id => contact %>,
|
175
|
+
<%= link_to 'Destroy', { :action => 'destroy', :id => contact }, :confirm => 'Are you sure?', :method => :post %> <hr>
|
176
|
+
<% end %>
|
177
|
+
<%= link_to 'New', :action => 'new' %>
|
178
|
+
ENDListAllCode
|
179
|
+
|
180
|
+
File.open("#{@rails_appname}/app/views/#{@rails_appname}/listAll.rhtml", "w" ){|f|f.write(listAllCode)}
|
181
|
+
|
182
|
+
end
|
183
|
+
|
184
|
+
def generateShowView
|
185
|
+
|
186
|
+
showCode = <<ENDShowCode
|
187
|
+
<h1>Show</h1>
|
188
|
+
<hr>
|
189
|
+
|
190
|
+
<p><b>Name</b> <%= @contact.name %></p>
|
191
|
+
<p><b>Phone</b> <%= @contact.phone %></p>
|
192
|
+
<p><b>Email</b> <%= @contact.email %></p>
|
193
|
+
<p><b>Title</b> <%= @contact.title %></p>
|
194
|
+
<p><b>Company</b> <%= @contact.company %></p>
|
195
|
+
<%= link_to 'Edit', :action => 'edit', :id => @contact %> |
|
196
|
+
<%= link_to 'Back', :action => 'listAll' %>
|
197
|
+
ENDShowCode
|
198
|
+
|
199
|
+
File.open("#{@rails_appname}/app/views/#{@rails_appname}/show.rhtml", "w" ){|f|f.write(showCode)}
|
200
|
+
|
201
|
+
end
|
202
|
+
|
203
|
+
def generateNewView
|
204
|
+
|
205
|
+
newCode = <<ENDNewCode
|
206
|
+
<h1>New</h1>
|
207
|
+
<hr>
|
208
|
+
<% form_tag :action => 'create', :id => @contact do %>
|
209
|
+
<%= render :partial => 'newform' %>
|
210
|
+
<%= submit_tag 'Create' %>
|
211
|
+
<% end %>
|
212
|
+
<%= link_to 'Back', :action => 'listAll' %>
|
213
|
+
ENDNewCode
|
214
|
+
|
215
|
+
File.open("#{@rails_appname}/app/views/#{@rails_appname}/new.rhtml", "w" ){|f|f.write(newCode)}
|
216
|
+
|
217
|
+
end
|
218
|
+
|
219
|
+
def generateEditView
|
220
|
+
|
221
|
+
editCode = <<EndEditCode
|
222
|
+
<h1>Edit</h1>
|
223
|
+
<hr>
|
224
|
+
<% form_tag :action => 'update', :id => @contact do %>
|
225
|
+
<%= render :partial => 'editform' %>
|
226
|
+
<%= submit_tag 'Edit' %>
|
227
|
+
<% end %>
|
228
|
+
<%= link_to 'Show', :action => 'show', :id => @contact %> |
|
229
|
+
<%= link_to 'Back', :action => 'listAll' %>
|
230
|
+
EndEditCode
|
231
|
+
|
232
|
+
File.open("#{@rails_appname}/app/views/#{@rails_appname}/edit.rhtml", "w" ){|f|f.write(editCode)}
|
233
|
+
|
234
|
+
end
|
235
|
+
|
236
|
+
def generateEditContactForm
|
237
|
+
|
238
|
+
formCode = <<ENDFormCode
|
239
|
+
<p><b>Name</b> <%= text_field 'contact[]', 'name' %></p>
|
240
|
+
<p><b>Phone</b> <%= text_field 'contact[]', 'phone' %></p>
|
241
|
+
<p><b>Email</b> <%= text_field 'contact[]', 'email' %></p>
|
242
|
+
<p><b>Title</b> <%= text_field 'contact[]', 'title' %></p>
|
243
|
+
<p><b>Company</b> <%= text_field 'contact[]', 'company' %></p>
|
244
|
+
ENDFormCode
|
245
|
+
|
246
|
+
File.open("#{@rails_appname}/app/views/#{@rails_appname}/_editform.rhtml", "w" ){|f|f.write(formCode)}
|
247
|
+
|
248
|
+
end
|
249
|
+
|
250
|
+
def generateNewContactForm
|
251
|
+
formCode = <<ENDFormCode
|
252
|
+
<p><b>Name</b> <%= text_field '#{@modelClassName}', 'name' %></p>
|
253
|
+
<p><b>Phone</b> <%= text_field '#{@modelClassName}', 'phone' %></p>
|
254
|
+
<p><b>Email</b> <%= text_field '#{@modelClassName}', 'email' %></p>
|
255
|
+
<p><b>Title</b> <%= text_field '#{@modelClassName}', 'title' %></p>
|
256
|
+
<p><b>Company</b> <%= text_field '#{@modelClassName}', 'company' %></p>
|
257
|
+
ENDFormCode
|
258
|
+
|
259
|
+
File.open("#{@rails_appname}/app/views/#{@rails_appname}/_newform.rhtml", "w" ){|f|f.write(formCode)}
|
260
|
+
|
261
|
+
end
|
262
|
+
|
263
|
+
def generateController
|
264
|
+
|
265
|
+
controllerCode = <<ENDControllerCode
|
266
|
+
class #{@rootClassName}Controller < ApplicationController
|
267
|
+
def listAll
|
268
|
+
@contacts = #{@modelClassName}.listAll
|
269
|
+
end
|
270
|
+
def listChanges
|
271
|
+
@contacts = #{@modelClassName}.listChanges
|
272
|
+
end
|
273
|
+
def show
|
274
|
+
@contact = #{@modelClassName}.find(params[:id])
|
275
|
+
end
|
276
|
+
def new
|
277
|
+
@contact = #{@modelClassName}.new
|
278
|
+
end
|
279
|
+
def edit
|
280
|
+
@contact = #{@modelClassName}.find(params[:id])
|
281
|
+
end
|
282
|
+
def destroy
|
283
|
+
#{@modelClassName}.find(params[:id]).destroy
|
284
|
+
index
|
285
|
+
end
|
286
|
+
def index
|
287
|
+
listAll
|
288
|
+
render :action => 'listAll'
|
289
|
+
end
|
290
|
+
def update
|
291
|
+
@contact = #{@modelClassName}.find(params[:id])
|
292
|
+
if @contact.update_attributes(params[:contact][params[:id]])
|
293
|
+
flash[:notice] = 'Contact was successfully updated.'
|
294
|
+
redirect_to :action => 'show', :id => @contact
|
295
|
+
else
|
296
|
+
render :action => 'edit'
|
297
|
+
end
|
298
|
+
end
|
299
|
+
def create
|
300
|
+
@contact = #{@modelClassName}.new(params[:#{@modelClassName}])
|
301
|
+
if @contact.save
|
302
|
+
flash[:notice] = 'Contact was successfully created.'
|
303
|
+
redirect_to :action => 'listAll'
|
304
|
+
else
|
305
|
+
render :action => 'new'
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
ENDControllerCode
|
311
|
+
|
312
|
+
File.open( "#{@rails_appname}/app/controllers/#{@rails_appname}_controller.rb", "w" ){|f|f.write(controllerCode)}
|
313
|
+
|
314
|
+
end
|
315
|
+
|
316
|
+
def generateHelper
|
317
|
+
helperCode = "module #{@rootClassName}Helper\nend\n"
|
318
|
+
File.open( "#{@rails_appname}/app/helpers/#{@rails_appname}_helper.rb", "w" ){|f|f.write(helperCode)}
|
319
|
+
end
|
320
|
+
|
321
|
+
def generateDatabaseConfig
|
322
|
+
|
323
|
+
databaseConfig = <<END_databaseConfig
|
324
|
+
development:
|
325
|
+
adapter: quickbase
|
326
|
+
database: #{@rails_appname}
|
327
|
+
username: #{@username}
|
328
|
+
password: #{@password}
|
329
|
+
printRequestsAndResponses: false
|
330
|
+
useWorkPlace: #{@useWorkPlace ? "true" : "false"}
|
331
|
+
cacheSchemas: true
|
332
|
+
decimalPrecision: 38
|
333
|
+
host: localhost
|
334
|
+
|
335
|
+
# Warning: The database defined as 'test' will be erased and
|
336
|
+
# re-generated from your development database when you run 'rake'.
|
337
|
+
# Do not set this db to the same as development or production.
|
338
|
+
test:
|
339
|
+
adapter: quickbase
|
340
|
+
database: #{@rails_appname}
|
341
|
+
username: #{@username}
|
342
|
+
password: #{@password}
|
343
|
+
useWorkPlace: #{@useWorkPlace ? "true" : "false"}
|
344
|
+
cacheSchemas: true
|
345
|
+
decimalPrecision: 38
|
346
|
+
host: localhost
|
347
|
+
|
348
|
+
production:
|
349
|
+
adapter: quickbase
|
350
|
+
database: #{@rails_appname}
|
351
|
+
username: #{@username}
|
352
|
+
password: #{@password}
|
353
|
+
cacheSchemas: true
|
354
|
+
useWorkPlace: #{@useWorkPlace ? "true" : "false"}
|
355
|
+
decimalPrecision: 38
|
356
|
+
host: localhost
|
357
|
+
END_databaseConfig
|
358
|
+
|
359
|
+
File.open( "#{@rails_appname}/config/database.yml", "w" ) {|f| f.write( databaseConfig ) }
|
360
|
+
|
361
|
+
end
|
362
|
+
|
363
|
+
def generateRoutes
|
364
|
+
|
365
|
+
routesCode = <<ENDRoutesCode
|
366
|
+
ActionController::Routing::Routes.draw do |map|
|
367
|
+
# The priority is based upon order of creation: first created -> highest priority.
|
368
|
+
|
369
|
+
# Sample of regular route:
|
370
|
+
# map.connect 'products/:id', :controller => 'catalog', :action => 'view'
|
371
|
+
# Keep in mind you can assign values other than :controller and :action
|
372
|
+
|
373
|
+
# Sample of named route:
|
374
|
+
# map.purchase 'products/:id/purchase', :controller => 'catalog', :action => 'purchase'
|
375
|
+
# This route can be invoked with purchase_url(:id => product.id)
|
376
|
+
|
377
|
+
# You can have the root of your site routed by hooking up ''
|
378
|
+
# -- just remember to delete public/index.html.
|
379
|
+
map.connect '', :controller => "#{@rails_appname}", :action => "listAll"
|
380
|
+
|
381
|
+
# Allow downloading Web Service WSDL as a file with an extension
|
382
|
+
# instead of a file named 'wsdl'
|
383
|
+
map.connect ':controller/service.wsdl', :action => 'wsdl'
|
384
|
+
|
385
|
+
# Install the default route as the lowest priority.
|
386
|
+
map.connect ':controller/:action/:id.:format'
|
387
|
+
map.connect ':controller/:action/:id'
|
388
|
+
end
|
389
|
+
ENDRoutesCode
|
390
|
+
|
391
|
+
File.open( "#{@rails_appname}/config/routes.rb", "w" ) {|f| f.write( routesCode) }
|
392
|
+
|
393
|
+
end
|
394
|
+
|
395
|
+
def renameIndexHTML
|
396
|
+
File.rename( "#{@rails_appname}/public/index.html", "#{@rails_appname}/public/renamed.index.html" ) if File.exist?("#{@rails_appname}/public/index.html")
|
397
|
+
end
|
398
|
+
|
399
|
+
def displayDoneMsg
|
400
|
+
puts "\n\nDone creating the '#{@rails_appname}' application!\n\n"
|
401
|
+
puts "Please start 'ruby script/server' in the #{@rails_appname} directory"
|
402
|
+
puts "then go to http://localhost:3000/ in your browser.\n\n"
|
403
|
+
end
|
404
|
+
|
405
|
+
def runningOnWindows
|
406
|
+
RUBY_PLATFORM.split("-")[1].include?("mswin")
|
407
|
+
end
|
408
|
+
|
409
|
+
end
|
410
|
+
|
411
|
+
if ARGV[2]
|
412
|
+
QuickBaseContactsAppBuilder.new(ARGV[0],ARGV[1],ARGV[2])
|
413
|
+
elsif ARGV[1]
|
414
|
+
QuickBaseContactsAppBuilder.new(ARGV[0],ARGV[1])
|
415
|
+
else
|
416
|
+
puts "usage: ruby QuickBaseContactsAppBuilder.rb username password [useWorkPlace]"
|
417
|
+
puts "Creates a very simple Contacts database in QuickBase and a Rails app for it."
|
418
|
+
puts "To use workplace.intuit.com instead of www.quickbase.com, add 'useWorkPlace' at the end of the command."
|
419
|
+
end
|