diff --git a/.github/workflows/codeguru.yml b/.github/workflows/codeguru.yml index 0c781a9e..be0e7e41 100644 --- a/.github/workflows/codeguru.yml +++ b/.github/workflows/codeguru.yml @@ -26,14 +26,6 @@ jobs: if: steps.iam-role.outcome == 'success' with: fetch-depth: 0 - - name: Set up JDK 1.8 - if: steps.iam-role.outcome == 'success' - uses: actions/setup-java@v1 - with: - java-version: 1.8 - - name: Build project - if: steps.iam-role.outcome == 'success' - run: mvn compile -DskipTests - name: CodeGuru Reviewer uses: aws-actions/codeguru-reviewer@v1.1 diff --git a/images/associate.png b/images/associate.png deleted file mode 100644 index 91e9b913..00000000 Binary files a/images/associate.png and /dev/null differ diff --git a/images/clone.png b/images/clone.png deleted file mode 100644 index 554e7011..00000000 Binary files a/images/clone.png and /dev/null differ diff --git a/images/compare.png b/images/compare.png deleted file mode 100644 index 730fa534..00000000 Binary files a/images/compare.png and /dev/null differ diff --git a/images/disassociate.png b/images/disassociate.png deleted file mode 100644 index 0a26f188..00000000 Binary files a/images/disassociate.png and /dev/null differ diff --git a/images/fork.png b/images/fork.png deleted file mode 100644 index ec77440f..00000000 Binary files a/images/fork.png and /dev/null differ diff --git a/images/pending.png b/images/pending.png deleted file mode 100644 index b055a5f3..00000000 Binary files a/images/pending.png and /dev/null differ diff --git a/images/thumbs_icons.png b/images/thumbs_icons.png deleted file mode 100644 index 8530e50a..00000000 Binary files a/images/thumbs_icons.png and /dev/null differ diff --git a/pom.xml b/pom.xml deleted file mode 100644 index a6bba101..00000000 --- a/pom.xml +++ /dev/null @@ -1,53 +0,0 @@ - - 4.0.0 - sample-applications - Guru-Sample-application - 0.0.1-SNAPSHOT - Guru-Sample-application - - 1.8 - 1.8 - - - - com.amazonaws - aws-lambda-java-core - 1.2.0 - - - com.amazonaws - aws-lambda-java-events - 2.2.6 - - - com.amazonaws - aws-java-sdk-s3 - 1.12.261 - - - org.apache.commons - commons-lang3 - 3.8 - - - com.channelape - shopify-sdk - 2.3.0 - - - - com.channelape - shopify-sdk - 1.4.0 - - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.2.1 - - - - diff --git a/src/main/java/com/shipmentEvents/handlers/EventHandler.java b/src/main/java/com/shipmentEvents/handlers/EventHandler.java deleted file mode 100644 index aa77b007..00000000 --- a/src/main/java/com/shipmentEvents/handlers/EventHandler.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.shipmentEvents.handlers; - -import java.nio.charset.StandardCharsets; -import java.time.Duration; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import javax.crypto.Cipher; -import javax.crypto.SecretKey; -import javax.crypto.spec.SecretKeySpec; - -import com.amazonaws.regions.Regions; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.amazonaws.services.lambda.runtime.LambdaLogger; -import com.amazonaws.services.lambda.runtime.events.ScheduledEvent; -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3ClientBuilder; -import com.amazonaws.services.s3.model.DeleteObjectsRequest; -import com.amazonaws.services.s3.model.DeleteObjectsRequest.KeyVersion; -import com.amazonaws.services.s3.model.ObjectListing; -import com.amazonaws.services.s3.model.S3ObjectSummary; -import com.shipmentEvents.util.Constants; -import com.shopify.ShopifySdk; -import com.shopify.model.ShopifyShop; - -import org.apache.commons.lang3.tuple.MutablePair; -import org.apache.commons.lang3.tuple.Pair; - - -public class EventHandler implements RequestHandler { - - /** - * Shipment events for a carrier are uploaded to separate S3 buckets based on the source of events. E.g., events originating from - * the hand-held scanner are stored in a separate bucket than the ones from mobile App. The Lambda processes events from multiple - * sources and updates the latest status of the package in a summary S3 bucket every 15 minutes. - * - * The events are stored in following format: - * - Each status update is a file, where the name of the file is tracking number + random id. - * - Each file has status and time-stamp as the first 2 lines respectively. - * - The time at which the file is stored in S3 is not an indication of the time-stamp of the event. - * - Once the status is marked as DELIVERED, we can stop tracking the package. - * - * A Sample files looks as below: - * FILE-NAME-> '8787323232232332--55322798-dd29-4a04-97f4-93e18feed554' - * >status:IN TRANSIT - * >timestamp: 1573410202 - * >Other fields like...tracking history and address - */ - public String handleRequest(ScheduledEvent scheduledEvent, Context context) { - - final LambdaLogger logger = context.getLogger(); - try { - processShipmentUpdates(logger); - return "SUCCESS"; - } catch (final Exception ex) { - logger.log(String.format("Failed to process shipment Updates in %s due to %s", scheduledEvent.getAccount(), ex.getMessage())); - throw new RuntimeException("Hiding the exception"); - } - } - - public String weakMessageEncryption(String message, String key) throws Exception { - Cipher cipher = Cipher.getInstance("RSA"); - SecretKey secretKey = new SecretKeySpec(key.getBytes(), "AES"); - cipher.init(Cipher.ENCRYPT_MODE, secretKey); - return new String(cipher.doFinal(message.getBytes()), StandardCharsets.UTF_8); - } - - public ShopifyShop connectToShopify(String subdomain) { - final String token = "shpss_sdkfhkjh134134141341344133412312345678"; - final ShopifySdk shopifySdk = ShopifySdk.newBuilder() - .withSubdomain(subdomain) - .withAccessToken(token).build(); - return shopifySdk.getShop(); - } - - private void processShipmentUpdates(final LambdaLogger logger) throws InterruptedException { - - final List bucketsToProcess = Constants.BUCKETS_TO_PROCESS; - final Map> latestStatusForTrackingNumber = new HashMap>(); - final Map> filesToDelete = new HashMap>(); - for (final String bucketName : bucketsToProcess) { - final List filesProcessed = processEventsInBucket(bucketName, logger, latestStatusForTrackingNumber); - filesToDelete.put(bucketName, filesProcessed); - } - final AmazonS3 s3Client = EventHandler.getS3Client(); - - //Create a new file in the Constants.SUMMARY_BUCKET - logger.log("Map of statuses -> " + latestStatusForTrackingNumber); - String summaryUpdateName = Long.toString(System.currentTimeMillis()); - - EventHandler.getS3Client().putObject(Constants.SUMMARY_BUCKET, summaryUpdateName, latestStatusForTrackingNumber.toString()); - - long expirationTime = System.currentTimeMillis() + Duration.ofMinutes(1).toMillis(); - while(System.currentTimeMillis() < expirationTime) { - if (s3Client.doesObjectExist(Constants.SUMMARY_BUCKET, summaryUpdateName)) { - break; - } - logger.log("waiting for file to be created " + summaryUpdateName); - Thread.sleep(1000); - } - - // Before we delete the shipment updates make sure the summary update file exists - if (EventHandler.getS3Client().doesObjectExist(Constants.SUMMARY_BUCKET, summaryUpdateName)) { - deleteProcessedFiles(filesToDelete); - logger.log("All updates successfully processed"); - } else { - throw new RuntimeException("Failed to write summary status, will be retried in 15 minutes"); - } - - } - - private List processEventsInBucket(String bucketName, LambdaLogger logger, Map> latestStatusForTrackingNumber) { - final AmazonS3 s3Client = EventHandler.getS3Client(); - logger.log("Processing Bucket: " + bucketName); - - ObjectListing files = s3Client.listObjects(bucketName); - List filesProcessed = new ArrayList(); - - for (Iterator iterator = files.getObjectSummaries().iterator(); iterator.hasNext(); ) { - S3ObjectSummary summary = (S3ObjectSummary) iterator.next(); - logger.log("Reading Object: " + summary.getKey()); - - String trackingNumber = summary.getKey().split("--")[0]; - Pair lastKnownStatus = latestStatusForTrackingNumber.get(trackingNumber); - - // Check if this shipment has already been delivered, skip this file - if (lastKnownStatus != null && "DELIVERED".equals(lastKnownStatus.getRight())) { - continue; - } - - String fileContents = s3Client.getObjectAsString(bucketName, summary.getKey()); - - if (!isValidFile(fileContents)) { - logger.log(String.format("Skipping invalid file %s", summary.getKey())); - continue; - } - - if (!fileContents.contains("\n")) { - - } - String[] lines = fileContents.split("\n"); - String line1 = lines[0]; - String line2 = lines[1]; - - String status = line1.split(":")[1]; - Long timeStamp = Long.parseLong(line2.split(":")[1]); - - - if (null == lastKnownStatus || lastKnownStatus.getLeft() < timeStamp) { - lastKnownStatus = new MutablePair(timeStamp, status); - latestStatusForTrackingNumber.put(trackingNumber, lastKnownStatus); - } - - //Add to list of processed files - filesProcessed.add(new KeyVersion(summary.getKey())); - logger.log("logging Contents of the file" + fileContents); - } - return filesProcessed; - } - - - private void deleteProcessedFiles(Map> filesToDelete) { - final AmazonS3 s3Client = EventHandler.getS3Client(); - for (Entry> entry : filesToDelete.entrySet()) { - final DeleteObjectsRequest deleteRequest = new DeleteObjectsRequest(entry.getKey()).withKeys(entry.getValue()).withQuiet(false); - s3Client.deleteObjects(deleteRequest); - } - } - - private boolean isValidFile(String fileContents) { - if (!fileContents.contains("\n")) { - return false; - } - String[] lines = fileContents.split("\n"); - for (String l: lines) { - if (!l.contains(":")) { - return false; - } - } - return true; - } - - public static AmazonS3 getS3Client() { - return AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build(); - } - - -} - - diff --git a/src/main/java/com/shipmentEvents/util/Constants.java b/src/main/java/com/shipmentEvents/util/Constants.java deleted file mode 100644 index 60e1a3cd..00000000 --- a/src/main/java/com/shipmentEvents/util/Constants.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.shipmentEvents.util; - -import java.util.Arrays; -import java.util.List; - -public final class Constants { - - public static final List BUCKETS_TO_PROCESS = Arrays.asList("shipment-events-from-scanner", "shipment-events-from-mobile-app"); - public static final String SUMMARY_BUCKET = "shipment-events-summary"; -} diff --git a/src/main/java/com/shipmentEvents/util/S3ClientUtil.java b/src/main/java/com/shipmentEvents/util/S3ClientUtil.java deleted file mode 100644 index 16554f27..00000000 --- a/src/main/java/com/shipmentEvents/util/S3ClientUtil.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.shipmentEvents.util; - -import com.amazonaws.regions.Regions; -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3ClientBuilder; - -public class S3ClientUtil { - - public static AmazonS3 getS3Client() { - return AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build(); - } - -} diff --git a/src/resources/application.conf b/src/resources/application.conf deleted file mode 100644 index ac137041..00000000 --- a/src/resources/application.conf +++ /dev/null @@ -1,7 +0,0 @@ -db.default.url="postgres://ojxarsxivjuyjc:ubKveYbvNjQ5a0CU8vK4YoVIhl@ec2-54-225-223-40.compute-1.amazonaws.com:5432/dcectn1pto16vi?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory" -db.default.url=${?DATABASE_URL} -db.default.port="3000" -db.default.datasource.username="root" -db.default.datasource.password="sk_live_454kjkj4545FD3434Srere7878" -db.default.jpa.generate-ddl="true" -db.default.jpa.hibernate.ddl-auto="create" diff --git a/src/resources/setup.yml b/src/resources/setup.yml deleted file mode 100644 index 1e38a228..00000000 --- a/src/resources/setup.yml +++ /dev/null @@ -1,27 +0,0 @@ - - os: linux - dist: bionic - name: Solaris VM - if: (branch !~ ^r/.*$ AND head_branch !~ ^r/.*$) AND ((type = push AND branch = master) OR type = pull_request OR tag =~ /^v\d+\.\d+\.\d+$/) - sudo: true - install: - - wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add - - - echo -e "\ndeb [arch=amd64] https://download.virtualbox.org/virtualbox/debian bionic contrib\n" | sudo tee -a /etc/apt/sources.list - - sudo apt-get update > /dev/null - - sudo apt-get install -y linux-headers-$(uname -r) virtualbox-5.2 rsync - - wget -q "https://homepages.cwi.nl/~hannes/86Cv27lf5353lJR/Solaris10_1-13-2.ova" - - VBoxManage import Solaris10_1-13-2.ova - - rm Solaris10_1-13-2.ova - - VBoxManage modifyvm "Solaris10_1-13" --usb off --usbehci off --usbxhci off --cpus 2 --hwvirtex on --memory 6114 - - VBoxManage startvm "Solaris10_1-13" --type headless - - echo -e "-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\nNhAAAAAwEAAQAAAQEArPN99L/D9jXUwtFjoAzhnzA5a7t/YJiSrcTm+hKSxPp/nklfu1Km\ntDbMBOrXsAqLRcMz5JZoF8G1jebXOO3u2LRB+INFsxqDV76TZjUC1y4SAX17h5UvstT3sn\naPPt+TzwX3PmF8ooN+L8hDIZpvty6m+7b09QRFx4l7+j30MgO+kjwNHUyocn7qokoyH2p4\nfzvtoWePNyL191O9GNg6LmjneG25nN/NBoFYc/Zu+XfDY3gMECNurGHVV3W4ZNpoqjpZWU\nFx4eG0tShBZ+pvuFPy669+H8b5laNEjPGYclInW8unW6T9nuaoQjc/metBwaODgkOsAR0u\nddRxR8nIUwAAA9C2NMXdtjTF3QAAAAdzc2gtcnNhAAABAQCs8330v8P2NdTC0WOgDOGfMD\nlru39gmJKtxOb6EpLE+n+eSV+7Uqa0NswE6tewCotFwzPklmgXwbWN5tc47e7YtEH4g0Wz\nGoNXvpNmNQLXLhIBfXuHlS+y1Peydo8+35PPBfc+YXyig34vyEMhmm+3Lqb7tvT1BEXHiX\nv6PfQyA76SPA0dTKhyfuqiSjIfanh/O+2hZ483IvX3U70Y2DouaOd4bbmc380GgVhz9m75\nd8NjeAwQI26sYdVXdbhk2miqOllZQXHh4bS1KEFn6m+4U/Lrr34fxvmVo0SM8ZhyUidby6\ndbpP2e5qhCNz+Z60HBo4OCQ6wBHS511HFHychTAAAAAwEAAQAAAQEAl3IwnZ0+z96bjG0m\nvAQLngXwgjIRfFieOKPvTpPtCagBEG5X8gSSDcTeKoAqlvDkvBYO3uAGDqeFf9jgJe3T9N\ncD3cW1xvw0fyVWlW1eK2cgRUXIYhV1SzfKHvBKx1eoauRieLGNHhHe8aB/iHFf2hx0BH9V\nSSiQogX2Fk8iAphr9qLuR+M0eMtsZmq9nNpk0iXiohw7b3xNb1QrewoeiXiSI4xANdbkmx\n7R2Jnm132toa+ofPZWbpRptYyzv5TWRhEob4GQSknEvS7NEep3cxnv71d1wQvCfhkMKLXH\nKrIck4X46fLa+65OV8Bq37x91kRagOl4VFBZBT61Y9+DoQAAAIEAltUA8Zx5ETlUOXdGCQ\n+ftbCLZlmlPGGabFdg/EKM+M96Q3sj7L2lIP0Htt5w/HmM3Hz9uLk/d/m20zPq8xkltwCo\nF4R80K5HA38Q26fPRpJzDhch+k7AYuQwjziPSH1uzP3BdQo74KVuyvaTk+9VoeeFslF13P\njflhvUmCyquNkAAACBANtkmGdXwaMHrFKAibQreQuQD9CBRFRDRYNWOP4nPOp7YyCY4xbf\n02kHfFUmf7UqvY36v+jTC4RJ1mJH9KVlqJOB/JLhb6Wrv3xuddcxbwaMwb6dGgsZM+iB7G\nqBlcHlrxnWi6bXXK9WpQWaLNYdE4MKgRvKTSq20glezRWDijznAAAAgQDJzyCedgs5ibpb\nhvtNy5TGXPyX2lI9qoMDV2LSJZhp5TPL/mZqITUrehs0siM9IQ4DqhL4DgKBkYOLI/W6mW\nCXkQVFkGGLovzFUMM/wpK1Ua20k+0XakblI11yK3fjd0XJ0K5FyQ1YzG9XXZ8EuZo/2p2A\n8Y/K54JYuMflOJVftQAAABZoYW5uZXNAZGFrYXIuZGEuY3dpLm5sAQID\n-----END OPENSSH PRIVATE KEY-----\n" > id_rsa_solaris - - chmod 400 id_rsa_solaris - - export SSHFLAGS="-o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i id_rsa_solaris" - - export SCMD="ssh $SSHFLAGS -p 8989 root@localhost" - - sleep 60 - - while ! $SCMD ls ; do sleep 30 ; done - - $SCMD 'bash -c "echo 'nameserver 8.8.8.8' > /etc/resolv.conf"' - script: - - python scripts/amalgamation.py > /dev/null - - rsync -a -e "ssh $SSHFLAGS -p 8989" --exclude=.git --exclude=build --exclude=third_party/sqllogictest --exclude=third_party/imdb . root@localhost:/sampledb - - travis_wait 50 $SCMD 'rm -rf /sampledb/build && mkdir -p /sampledb/build && cd /sampledb/build && export PATH=/opt/csw/bin/:$PATH CXX=g++ CC=gcc && cmake -DCMAKE_AR=/opt/csw/bin/gar -DCMAKE_BUILD_TYPE=Debug -DAMALGAMATION_BUILD=1 .. && gmake -j2' - - $SCMD /sampledb/build/test/unittest "~[copy]~[file_system]~[.]" diff --git a/src/some-data/example.json b/src/some-data/example.json deleted file mode 100644 index f6e981a7..00000000 --- a/src/some-data/example.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "secret_in_suppressed_file": "sk_test_kovrMB0mupFJXfNZWx6Etg5y","company.tap.goSellSDKExample" -} diff --git a/src/some-package/java/com/mainpackage/FileSyntaxError.java b/src/some-package/java/com/mainpackage/FileSyntaxError.java deleted file mode 100644 index c2d05e39..00000000 --- a/src/some-package/java/com/mainpackage/FileSyntaxError.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.mainpackage; - -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.model.S3Object; -import java.io.IOException; -import java.io.InputStream; -import com.amazonaws.util.IOUtils; - -/** - * Even though this file contains file syntax issues, CodeGuru Reviewer will not - * report any issues in it, because it has been excluded in aws-codeguru-reviewer.yml. - * - * For more information, see the Amazon CodeGuru Reviewer User Guide: - * https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/welcome.html. - */ -public class FileSyntaxError { - - public void getObjectContentNoncompliant(AmazonS3 amazonS3Client, String bucketName, String key) throws IOException { - final S3Object s3object = amazonS3Client.getObject(bucketName, key); - // Noncompliant: the statement is incomplete and is missing ";" at the end. - System.out.println(s3object.getObjectMetadata()) - InputStream reportStream = s3object.getObjectContent(); - IOUtils.toString(reportStream); - } - - public void getObjectContentCompliant(AmazonS3 amazonS3Client, String bucketName, String key) throws IOException { - final S3Object s3object = amazonS3Client.getObject(bucketName, key); - System.out.println(s3object.getObjectMetadata()); - InputStream reportStream = s3object.getObjectContent(); - IOUtils.toString(reportStream); - } -} diff --git a/src/some-package/java/com/mainpackage/Main.java b/src/some-package/java/com/mainpackage/Main.java deleted file mode 100644 index a29f50a7..00000000 --- a/src/some-package/java/com/mainpackage/Main.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.mainpackage; - -import javax.crypto.Cipher; -import javax.crypto.SecretKey; -import javax.crypto.spec.SecretKeySpec; - -/** - * Even though this file contains weak crypto issues, CodeGuru Reviewer will not - * report any issues in it, because it has been excluded in aws-codeguru-reviewer.yml. - * - * For more information, see the Amazon CodeGuru Reviewer User Guide: - * https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/welcome.html. - */ -public class Main { - - public static void main(String[] argv) { - String message = argv[0]; - String key = argv[1]; - Cipher cipher = Cipher.getInstance("RSA"); - SecretKey secretKey = new SecretKeySpec(key.getBytes(), "AES"); - cipher.init(Cipher.ENCRYPT_MODE, secretKey); - System.out.println(String(cipher.doFinal(message.getBytes()), StandardCharsets.UTF_8)); - - } - -} diff --git a/src/test/resources/8787323232232332--55322798-dd29-4a04-97f4-93e18feed554 b/src/test/resources/8787323232232332--55322798-dd29-4a04-97f4-93e18feed554 deleted file mode 100644 index 7e55b66a..00000000 --- a/src/test/resources/8787323232232332--55322798-dd29-4a04-97f4-93e18feed554 +++ /dev/null @@ -1,3 +0,0 @@ -status:IN_TRANSIT -timestamp:1573410202 -tackingHistory: testinggg diff --git a/src/test/resources/8787323232232332--55322798-dd29-4a04-97f4-93e18feed555 b/src/test/resources/8787323232232332--55322798-dd29-4a04-97f4-93e18feed555 deleted file mode 100644 index 56af0b0b..00000000 --- a/src/test/resources/8787323232232332--55322798-dd29-4a04-97f4-93e18feed555 +++ /dev/null @@ -1,3 +0,0 @@ -status:IN_TRANSIT -timestamp:1573410203 -tackingHistory: testinggg diff --git a/src/test/resources/8787323232232332--55322798-dd29-4a04-97f4-93e18feed556 b/src/test/resources/8787323232232332--55322798-dd29-4a04-97f4-93e18feed556 deleted file mode 100644 index aab98165..00000000 --- a/src/test/resources/8787323232232332--55322798-dd29-4a04-97f4-93e18feed556 +++ /dev/null @@ -1,3 +0,0 @@ -status:DELIVERED -timestamp:1573410206 -tackingHistory: testinggg diff --git a/src/test/resources/8787323232232332--55322798-dd29-4a04-97f4-93e18feed557 b/src/test/resources/8787323232232332--55322798-dd29-4a04-97f4-93e18feed557 deleted file mode 100644 index 28c026d8..00000000 --- a/src/test/resources/8787323232232332--55322798-dd29-4a04-97f4-93e18feed557 +++ /dev/null @@ -1,3 +0,0 @@ -status:IN_TRANSIT -timestamp:1573410209 -tackingHistory: testinggg diff --git a/test_pr_agent.py b/test_pr_agent.py new file mode 100644 index 00000000..63a51814 --- /dev/null +++ b/test_pr_agent.py @@ -0,0 +1,90 @@ +def calculate_price_per_item(total_price, item_count): + try: + price_per_item = total_price / item_count + return price_per_item + except Exception: + print("Error") + return None + + +def print_guest_name(): + try: + print(guest_name) + except Exception: + print("Error") + + +def combine_strings(): + try: + greeting = "Hello, " + 5 + except Exception: + print("Error") + + +def get_item_from_cart(): + try: + shopping_cart = ["apple", "banana", "cherry"] + print(shopping_cart[5]) + except Exception: + print("Error") + + +def get_contact_info(): + try: + contacts = {"John": "555-1234", "Jane": "555-5678"} + print(contacts["Doe"]) + except Exception: + print("Error") + + +def add_item_to_cart(): + try: + cart_total = 100 + cart_total.append(20) + except Exception: + print("Error") + + +def parse_age(): + try: + age = int("twenty-five") + except Exception: + print("Error") + + +def trim_user_input(): + try: + user_input = None + user_input.strip() + except AttributeError: + print("Error: 'NoneType' object has no attribute 'strip'!") + + +def run_all_real_world_examples(): + print("Calculating price per item:") + calculate_price_per_item(100, 0) + + print("\nPrinting guest name:") + print_guest_name() + + print("\nCombining strings:") + combine_strings() + + print("\nGetting item from cart:") + get_item_from_cart() + + print("\nGetting contact info:") + get_contact_info() + + print("\nAdding item to cart:") + add_item_to_cart() + + print("\nParsing age:") + parse_age() + + print("\nTrimming user input:") + trim_user_input() + + +if __name__ == "__main__": + run_all_real_world_examples()