diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml new file mode 100644 index 0000000..143acc9 --- /dev/null +++ b/.github/workflows/python-app.yml @@ -0,0 +1,39 @@ +# This workflow will install Python dependencies, run tests and lint with a single version of Python +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Python application + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +permissions: + contents: read + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up Python 3.10 + uses: actions/setup-python@v3 + with: + python-version: "3.10" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install flake8 pytest + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + - name: Lint with flake8 + run: | + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pytest diff --git a/.gitignore b/.gitignore index 42976dc..b2b25f9 100644 --- a/.gitignore +++ b/.gitignore @@ -129,12 +129,14 @@ celerybeat.pid # .env .env/ .venv/ +.query/ env/ venv/ ENV/ env.bak/ venv.bak/ pythonenv* +.query # Spyder project settings .spyderproject @@ -171,4 +173,7 @@ Thumbs.db # Code editor files .vscode -.idea \ No newline at end of file +.idea + +# Record csv +record.csv \ No newline at end of file diff --git a/out.dat b/out.dat new file mode 100644 index 0000000..46534db --- /dev/null +++ b/out.dat @@ -0,0 +1,2 @@ +Matched on: www.google.com +Name: Uniform Resource Locator (URL) diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index b99e122..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,53 +0,0 @@ -[tool.poetry] -name = "pywhat" -version = "5.1.0" -description = "What is that thing?" -authors = ["Bee "] -license = "MIT" -documentation = "https://github.com/bee-san/pyWhat/wiki" -readme = "README.md" - -[tool.poetry.dependencies] -python = "^3.7" -click = "^8.0.0" -rich = ">=11.0.0" -orjson = {version = "^3.6.1", optional = true} - -[tool.poetry.dev-dependencies] -pytest = "^7.0" -black = "^22.1.0" -isort = "^5.9.3" -flake8 = "^4.0" -requests = "^2.26.0" -pytest-black = "^0.3.12" -pytest-isort = "^2.0.0" -pytest-flake8 = "^1.0.7" -pytest-mypy = "^0.8.1" -types-requests = "^2.25.9" -types-orjson = "^3.6.0" - -[tool.poetry.extras] -optimize = ["orjson"] - -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" - -[tool.poetry.scripts] -pywhat = "pywhat.what:main" -what = "pywhat.what:main" - -[tool.isort] -profile = "black" -multi_line_output = 3 -include_trailing_comma = true -force_grid_wrap = 0 -use_parentheses = true -ensure_newline_before_comments = true -line_length = 88 - -[tool.mypy] -ignore_missing_imports = true - -[tool.pytest.ini_options] -addopts = "--black --isort --flake8 --mypy" diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index e510203..7410c68 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -1351,7 +1351,7 @@ }, { "Name": "Internet Protocol (IP) Address Version 6", - "Regex": "^((?=.*[0-9])\\[?(?:(?:[0-9a-f]{1,4}:){7,7}[0-9a-f]{1,4}|([0-9a-f]{4}:){1,7}:|([0-9a-f]{1,4}:){1,6}:[0-9a-f]{1,4}|([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}|([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}|([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}|([0-9a-fA]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}|[0-9a-f]{1,4}:((:[0-9a-f]{1,4}){1,6})|:((:[0-9a-f]{1,4}){1,7}|:)|fe80:(:[0-9a-f]{0,4}){0,4}%[0-9a-z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|(?:[0-9a-f]{1,4}:){1,4}:(?:(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\]?(?::[0-9]{1,5})?)$", + "Regex":"^((?=.*[0-9])\\[?(?:(?:[0-9a-f]{1,4}:){7,7}[0-9a-f]{1,4}|([0-9a-f]{4}:){1,7}:|([0-9a-f]{1,4}:){1,6}:[0-9a-f]{1,4}|([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}|([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}|([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}|([0-9a-fA]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}|[0-9a-f]{1,4}:((:[0-9a-f]{1,4}){1,6})|:((:[0-9a-f]{1,4}){1,7}|:)|fe80:(:[0-9a-f]{0,4}){0,4}%[0-9a-z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|(?:[0-9a-f]{1,4}:){1,4}:(?:(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\]?(?::[0-9]{1,5})?)$", "plural_name": false, "Description": null, "Rarity": 0.7, @@ -1366,11 +1366,19 @@ "Examples": { "Valid": [ "2001:0db8:85a3:0000:0000:8a2e:0370:7334", - "[2001:db8::1]:8080" + "[2001:db8::1]:8080", + "2001:db8:3333:4444:CCCC:DDDD:EEEE:FFFF", + "2001:DB8::1", + "2001:0db8:0001:0000:0000:0ab9:C0A8:0102", + "2001:db8:1::ab9:C0A8:102", + "ffff::", + "::ffff" ], - "Invalid": [] + "Invalid": [ + "::" + ] } - }, + }, { "Name": "Uniform Resource Locator (URL)", "Regex": "(?i)^((?:(?:(?:https?|ftp):\\/\\/(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(?:(?:https?|ftp):\\/\\/)?(?:[a-z0-9%.]+:[a-z0-9%]+@)?(?:(?:[a-z0-9\\_\\~]\\-?){0,62}[a-z0-9]\\.)*(?:(?:(?:[a-z0-9]\\-?){0,62}[a-z0-9])|(?:xn--[a-z0-9\\-]+))\\.(?:XN--VERMGENSBERATUNG-PWB|XN--VERMGENSBERATER-CTB|XN--CLCHC0EA0B2G2A9GCD|XN--W4R85EL8FHU5DNRA|NORTHWESTERNMUTUAL|TRAVELERSINSURANCE|XN--3OQ18VL8PN36A|XN--5SU34J936BGSG|XN--BCK1B9A5DRE4C|XN--MGBAH1A3HJKRD|XN--MGBAI9AZGQP6J|XN--MGBERP4A5D4AR|XN--XKC2DL3A5EE0H|XN--FZYS8D69UVGM|XN--MGBA7C0BBN0A|XN--MGBCPQ6GPA1A|XN--XKC2AL3HYE2A|AMERICANEXPRESS|KERRYPROPERTIES|SANDVIKCOROMANT|XN--I1B6B1A6A2E|XN--KCRX77D1X4A|XN--LGBBAT1AD8J|XN--MGBA3A4F16A|XN--MGBAAKC7DVF|XN--MGBC0A9AZCG|XN--NQV7FS00EMA|AFAMILYCOMPANY|AMERICANFAMILY|BANANAREPUBLIC|CANCERRESEARCH|COOKINGCHANNEL|KERRYLOGISTICS|WEATHERCHANNEL|XN--54B7FTA0CC|XN--6QQ986B3XL|XN--80AQECDR1A|XN--B4W605FERD|XN--FIQ228C5HS|XN--H2BREG3EVE|XN--JLQ480N2RG|XN--JLQ61U9W7B|XN--MGBA3A3EJT|XN--MGBAAM7A8H|XN--MGBAYH7GPA|XN--MGBBH1A71E|XN--MGBCA7DZDO|XN--MGBI4ECEXP|XN--MGBX4CD0AB|XN--RVC1E0AM3E|INTERNATIONAL|LIFEINSURANCE|TRAVELCHANNEL|WOLTERSKLUWER|XN--CCKWCXETD|XN--ECKVDTC9D|XN--FPCRJ9C3D|XN--FZC2C9E2C|XN--H2BRJ9C8C|XN--TIQ49XQYJ|XN--YFRO4I67O|XN--YGBI2AMMX|CONSTRUCTION|LPLFINANCIAL|SCHOLARSHIPS|VERSICHERUNG|XN--3E0B707E|XN--45BR5CYL|XN--4DBRK0CE|XN--80ADXHKS|XN--80ASEHDB|XN--8Y0A063A|XN--GCKR3F0F|XN--MGB9AWBF|XN--MGBAB2BD|XN--MGBGU82A|XN--MGBPL2FH|XN--MGBT3DHD|XN--MK1BU44C|XN--NGBC5AZD|XN--NGBE9E0A|XN--OGBPF8FL|XN--QCKA1PMC|ACCOUNTANTS|BARCLAYCARD|BLACKFRIDAY|BLOCKBUSTER|BRIDGESTONE|CALVINKLEIN|CONTRACTORS|CREDITUNION|ENGINEERING|ENTERPRISES|FOODNETWORK|INVESTMENTS|KERRYHOTELS|LAMBORGHINI|MOTORCYCLES|OLAYANGROUP|PHOTOGRAPHY|PLAYSTATION|PRODUCTIONS|PROGRESSIVE|REDUMBRELLA|WILLIAMHILL|XN--11B4C3D|XN--1CK2E1B|XN--1QQW23A|XN--2SCRJ9C|XN--3BST00M|XN--3DS443G|XN--3HCRJ9C|XN--42C2D9A|XN--45BRJ9C|XN--55QW42G|XN--6FRZ82G|XN--80AO21A|XN--9KRT00A|XN--CCK2B3B|XN--CZR694B|XN--D1ACJ3B|XN--EFVY88H|XN--FCT429K|XN--FJQ720A|XN--FLW351E|XN--G2XX48C|XN--GECRJ9C|XN--GK3AT1E|XN--H2BRJ9C|XN--HXT814E|XN--IMR513N|XN--J6W193G|XN--JVR189M|XN--KPRW13D|XN--KPRY57D|XN--MGBBH1A|XN--MGBTX2B|XN--MIX891F|XN--NYQY26A|XN--OTU796D|XN--PGBS0DH|XN--Q9JYB4C|XN--RHQV96G|XN--ROVU88B|XN--S9BRJ9C|XN--SES554G|XN--T60B56A|XN--VUQ861B|XN--W4RS40L|XN--XHQ521B|XN--ZFR164B|ACCOUNTANT|APARTMENTS|ASSOCIATES|BASKETBALL|BNPPARIBAS|BOEHRINGER|CAPITALONE|CONSULTING|CREDITCARD|CUISINELLA|EUROVISION|EXTRASPACE|FOUNDATION|HEALTHCARE|IMMOBILIEN|INDUSTRIES|MANAGEMENT|MITSUBISHI|NEXTDIRECT|PROPERTIES|PROTECTION|PRUDENTIAL|REALESTATE|REPUBLICAN|RESTAURANT|SCHAEFFLER|SWIFTCOVER|TATAMOTORS|TECHNOLOGY|UNIVERSITY|VLAANDEREN|VOLKSWAGEN|XN--30RR7Y|XN--3PXU8K|XN--45Q11C|XN--4GBRIM|XN--55QX5D|XN--5TZM5G|XN--80ASWG|XN--90A3AC|XN--9DBQ2A|XN--9ET52U|XN--C2BR7G|XN--CG4BKI|XN--CZRS0T|XN--CZRU2D|XN--FIQ64B|XN--FIQS8S|XN--FIQZ9S|XN--IO0A7I|XN--KPUT3I|XN--MXTQ1M|XN--O3CW4H|XN--PSSY2U|XN--Q7CE6A|XN--UNUP4Y|XN--WGBH1C|XN--WGBL6A|XN--Y9A3AQ|ACCENTURE|ALFAROMEO|ALLFINANZ|AMSTERDAM|ANALYTICS|AQUARELLE|BARCELONA|BLOOMBERG|CHRISTMAS|COMMUNITY|DIRECTORY|EDUCATION|EQUIPMENT|FAIRWINDS|FINANCIAL|FIRESTONE|FRESENIUS|FRONTDOOR|FURNITURE|GOLDPOINT|HISAMITSU|HOMEDEPOT|HOMEGOODS|HOMESENSE|INSTITUTE|INSURANCE|KUOKGROUP|LANCASTER|LANDROVER|LIFESTYLE|MARKETING|MARSHALLS|MELBOURNE|MICROSOFT|PANASONIC|PASSAGENS|PRAMERICA|RICHARDLI|SCJOHNSON|SHANGRILA|SOLUTIONS|STATEBANK|STATEFARM|STOCKHOLM|TRAVELERS|VACATIONS|XN--90AIS|XN--C1AVG|XN--D1ALF|XN--E1A4C|XN--FHBEI|XN--J1AEF|XN--J1AMH|XN--L1ACC|XN--NGBRX|XN--NQV7F|XN--P1ACF|XN--QXA6A|XN--TCKWE|XN--VHQUV|YODOBASHI|ABUDHABI|AIRFORCE|ALLSTATE|ATTORNEY|BARCLAYS|BAREFOOT|BARGAINS|BASEBALL|BOUTIQUE|BRADESCO|BROADWAY|BRUSSELS|BUDAPEST|BUILDERS|BUSINESS|CAPETOWN|CATERING|CATHOLIC|CIPRIANI|CITYEATS|CLEANING|CLINIQUE|CLOTHING|COMMBANK|COMPUTER|DELIVERY|DELOITTE|DEMOCRAT|DIAMONDS|DISCOUNT|DISCOVER|DOWNLOAD|ENGINEER|ERICSSON|ETISALAT|EXCHANGE|FEEDBACK|FIDELITY|FIRMDALE|FOOTBALL|FRONTIER|GOODYEAR|GRAINGER|GRAPHICS|GUARDIAN|HDFCBANK|HELSINKI|HOLDINGS|HOSPITAL|INFINITI|IPIRANGA|ISTANBUL|JPMORGAN|LIGHTING|LUNDBECK|MARRIOTT|MASERATI|MCKINSEY|MEMORIAL|MERCKMSD|MORTGAGE|OBSERVER|PARTNERS|PHARMACY|PICTURES|PLUMBING|PROPERTY|REDSTONE|RELIANCE|SAARLAND|SAMSCLUB|SECURITY|SERVICES|SHOPPING|SHOWTIME|SOFTBANK|SOFTWARE|STCGROUP|SUPPLIES|TRAINING|VANGUARD|VENTURES|VERISIGN|WOODSIDE|XN--90AE|XN--NODE|XN--P1AI|XN--QXAM|YOKOHAMA|ABOGADO|ACADEMY|AGAKHAN|ALIBABA|ANDROID|ATHLETA|AUCTION|AUDIBLE|AUSPOST|AVIANCA|BANAMEX|BAUHAUS|BENTLEY|BESTBUY|BOOKING|BROTHER|BUGATTI|CAPITAL|CARAVAN|CAREERS|CHANNEL|CHARITY|CHINTAI|CITADEL|CLUBMED|COLLEGE|COLOGNE|COMCAST|COMPANY|COMPARE|CONTACT|COOKING|CORSICA|COUNTRY|COUPONS|COURSES|CRICKET|CRUISES|DENTIST|DIGITAL|DOMAINS|EXPOSED|EXPRESS|FARMERS|FASHION|FERRARI|FERRERO|FINANCE|FISHING|FITNESS|FLIGHTS|FLORIST|FLOWERS|FORSALE|FROGANS|FUJITSU|GALLERY|GENTING|GODADDY|GROCERY|GUITARS|HAMBURG|HANGOUT|HITACHI|HOLIDAY|HOSTING|HOTELES|HOTMAIL|HYUNDAI|ISMAILI|JEWELRY|JUNIPER|KITCHEN|KOMATSU|LACAIXA|LANXESS|LASALLE|LATROBE|LECLERC|LIMITED|LINCOLN|MARKETS|MONSTER|NETBANK|NETFLIX|NETWORK|NEUSTAR|OKINAWA|OLDNAVY|ORGANIC|ORIGINS|PHILIPS|PIONEER|POLITIE|REALTOR|RECIPES|RENTALS|REVIEWS|REXROTH|SAMSUNG|SANDVIK|SCHMIDT|SCHWARZ|SCIENCE|SHIKSHA|SINGLES|STAPLES|STORAGE|SUPPORT|SURGERY|SYSTEMS|TEMASEK|THEATER|THEATRE|TICKETS|TIFFANY|TOSHIBA|TRADING|WALMART|WANGGOU|WATCHES|WEATHER|WEBSITE|WEDDING|WHOSWHO|WINDOWS|WINNERS|XFINITY|YAMAXUN|YOUTUBE|ZUERICH|ABARTH|ABBOTT|ABBVIE|AFRICA|AGENCY|AIRBUS|AIRTEL|ALIPAY|ALSACE|ALSTOM|AMAZON|ANQUAN|ARAMCO|AUTHOR|BAYERN|BEAUTY|BERLIN|BHARTI|BOSTIK|BOSTON|BROKER|CAMERA|CAREER|CASINO|CENTER|CHANEL|CHROME|CHURCH|CIRCLE|CLAIMS|CLINIC|COFFEE|COMSEC|CONDOS|COUPON|CREDIT|CRUISE|DATING|DATSUN|DEALER|DEGREE|DENTAL|DESIGN|DIRECT|DOCTOR|DUNLOP|DUPONT|DURBAN|EMERCK|ENERGY|ESTATE|EVENTS|EXPERT|FAMILY|FLICKR|FUTBOL|GALLUP|GARDEN|GEORGE|GIVING|GLOBAL|GOOGLE|GRATIS|HEALTH|HERMES|HIPHOP|HOCKEY|HOTELS|HUGHES|IMAMAT|INSURE|INTUIT|JAGUAR|JOBURG|JUEGOS|KAUFEN|KINDER|KINDLE|KOSHER|LANCIA|LATINO|LAWYER|LEFRAK|LIVING|LOCKER|LONDON|LUXURY|MADRID|MAISON|MAKEUP|MARKET|MATTEL|MOBILE|MONASH|MORMON|MOSCOW|MUSEUM|MUTUAL|NAGOYA|NATURA|NISSAN|NISSAY|NORTON|NOWRUZ|OFFICE|OLAYAN|ONLINE|ORACLE|ORANGE|OTSUKA|PFIZER|PHOTOS|PHYSIO|PICTET|QUEBEC|RACING|REALTY|REISEN|REPAIR|REPORT|REVIEW|ROCHER|ROGERS|RYUKYU|SAFETY|SAKURA|SANOFI|SCHOOL|SCHULE|SEARCH|SECURE|SELECT|SHOUJI|SOCCER|SOCIAL|STREAM|STUDIO|SUPPLY|SUZUKI|SWATCH|SYDNEY|TAIPEI|TAOBAO|TARGET|TATTOO|TENNIS|TIENDA|TJMAXX|TKMAXX|TOYOTA|TRAVEL|UNICOM|VIAJES|VIKING|VILLAS|VIRGIN|VISION|VOTING|VOYAGE|VUELOS|WALTER|WEBCAM|XIHUAN|YACHTS|YANDEX|ZAPPOS|ACTOR|ADULT|AETNA|AMFAM|AMICA|APPLE|ARCHI|AUDIO|AUTOS|AZURE|BAIDU|BEATS|BIBLE|BINGO|BLACK|BOATS|BOSCH|BUILD|CANON|CARDS|CHASE|CHEAP|CISCO|CITIC|CLICK|CLOUD|COACH|CODES|CROWN|CYMRU|DABUR|DANCE|DEALS|DELTA|DRIVE|DUBAI|EARTH|EDEKA|EMAIL|EPSON|FAITH|FEDEX|FINAL|FOREX|FORUM|GALLO|GAMES|GIFTS|GIVES|GLADE|GLASS|GLOBO|GMAIL|GREEN|GRIPE|GROUP|GUCCI|GUIDE|HOMES|HONDA|HORSE|HOUSE|HYATT|IKANO|IRISH|JETZT|KOELN|KYOTO|LAMER|LEASE|LEGAL|LEXUS|LILLY|LINDE|LIPSY|LIXIL|LOANS|LOCUS|LOTTE|LOTTO|MACYS|MANGO|MEDIA|MIAMI|MONEY|MOVIE|NEXUS|NIKON|NINJA|NOKIA|NOWTV|OMEGA|OSAKA|PARIS|PARTS|PARTY|PHONE|PHOTO|PIZZA|PLACE|POKER|PRAXI|PRESS|PRIME|PROMO|QUEST|RADIO|REHAB|REISE|RICOH|ROCKS|RODEO|RUGBY|SALON|SENER|SEVEN|SHARP|SHELL|SHOES|SKYPE|SLING|SMART|SMILE|SOLAR|SPACE|SPORT|STADA|STORE|STUDY|STYLE|SUCKS|SWISS|TATAR|TIRES|TIROL|TMALL|TODAY|TOKYO|TOOLS|TORAY|TOTAL|TOURS|TRADE|TRUST|TUNES|TUSHU|UBANK|VEGAS|VIDEO|VODKA|VOLVO|WALES|WATCH|WEBER|WEIBO|WORKS|WORLD|XEROX|YAHOO|AARP|ABLE|ADAC|AERO|AKDN|ALLY|AMEX|ARAB|ARMY|ARPA|ARTE|ASDA|ASIA|AUDI|AUTO|BABY|BAND|BANK|BBVA|BEER|BEST|BIKE|BING|BLOG|BLUE|BOFA|BOND|BOOK|BUZZ|CAFE|CALL|CAMP|CARE|CARS|CASA|CASE|CASH|CBRE|CERN|CHAT|CITI|CITY|CLUB|COOL|COOP|CYOU|DATA|DATE|DCLK|DEAL|DELL|DESI|DIET|DISH|DOCS|DUCK|DVAG|ERNI|FAGE|FAIL|FANS|FARM|FAST|FIAT|FIDO|FILM|FIRE|FISH|FLIR|FOOD|FORD|FREE|FUND|GAME|GBIZ|GENT|GGEE|GIFT|GMBH|GOLD|GOLF|GOOG|GUGE|GURU|HAIR|HAUS|HDFC|HELP|HERE|HGTV|HOST|HSBC|ICBC|IEEE|IMDB|IMMO|INFO|ITAU|JAVA|JEEP|JOBS|JPRS|KDDI|KIWI|KPMG|KRED|LAND|LEGO|LGBT|LIDL|LIFE|LIKE|LIMO|LINK|LIVE|LOAN|LOFT|LOVE|LTDA|LUXE|MAIF|MEET|MEME|MENU|MINI|MINT|MOBI|MODA|MOTO|NAME|NAVY|NEWS|NEXT|NICO|NIKE|OLLO|OPEN|PAGE|PARS|PCCW|PICS|PING|PINK|PLAY|PLUS|POHL|PORN|POST|PROD|PROF|QPON|RAID|READ|REIT|RENT|REST|RICH|RMIT|ROOM|RSVP|RUHR|SAFE|SALE|SARL|SAVE|SAXO|SCOT|SEAT|SEEK|SEXY|SHAW|SHIA|SHOP|SHOW|SILK|SINA|SITE|SKIN|SNCF|SOHU|SONG|SONY|SPOT|STAR|SURF|TALK|TAXI|TEAM|TECH|TEVA|TIAA|TIPS|TOWN|TOYS|TUBE|VANA|VISA|VIVA|VIVO|VOTE|VOTO|WANG|WEIR|WIEN|WIKI|WINE|WORK|XBOX|YOGA|ZARA|ZERO|ZONE|AAA|ABB|ABC|ACO|ADS|AEG|AFL|AIG|ANZ|AOL|APP|ART|AWS|AXA|BAR|BBC|BBT|BCG|BCN|BET|BID|BIO|BIZ|BMS|BMW|BOM|BOO|BOT|BOX|BUY|BZH|CAB|CAL|CAM|CAR|CAT|CBA|CBN|CBS|CEO|CFA|CFD|COM|CPA|CRS|CSC|DAD|DAY|DDS|DEV|DHL|DIY|DNP|DOG|DOT|DTV|DVR|EAT|ECO|EDU|ESQ|EUS|FAN|FIT|FLY|FOO|FOX|FRL|FTR|FUN|FYI|GAL|GAP|GAY|GDN|GEA|GLE|GMO|GMX|GOO|GOP|GOT|GOV|HBO|HIV|HKT|HOT|HOW|IBM|ICE|ICU|IFM|INC|ING|INK|INT|IST|ITV|JCB|JIO|JLL|JMP|JNJ|JOT|JOY|KFH|KIA|KIM|KPN|KRD|LAT|LAW|LDS|LLC|LLP|LOL|LPL|LTD|MAN|MAP|MBA|MED|MEN|MIL|MIT|MLB|MLS|MMA|MOE|MOI|MOM|MOV|MSD|MTN|MTR|NAB|NBA|NEC|NET|NEW|NFL|NGO|NHK|NOW|NRA|NRW|NTT|NYC|OBI|OFF|ONE|ONG|ONL|OOO|ORG|OTT|OVH|PAY|PET|PHD|PID|PIN|PNC|PRO|PRU|PUB|PWC|QVC|RED|REN|RIL|RIO|RIP|RUN|RWE|SAP|SAS|SBI|SBS|SCA|SCB|SES|SEW|SEX|SFR|SKI|SKY|SOY|SPA|SRL|STC|TAB|TAX|TCI|TDK|TEL|THD|TJX|TOP|TRV|TUI|TVS|UBS|UNO|UOL|UPS|VET|VIG|VIN|VIP|WED|WIN|WME|WOW|WTC|WTF|XIN|XXX|XYZ|YOU|YUN|ZIP|AC|AD|AE|AF|AG|AI|AL|AM|AO|AQ|AR|AS|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BJ|BM|BN|BO|BR|BS|BT|BV|BW|BY|BZ|CA|CC|CD|CF|CG|CH|CI|CK|CL|CM|CN|CO|CR|CU|CV|CW|CX|CY|CZ|DE|DJ|DK|DM|DO|DZ|EC|EE|EG|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|ID|IE|IL|IM|IN|IO|IQ|IR|IS|IT|JE|JM|JO|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MG|MH|MK|ML|MM|MN|MO|MP|MQ|MR|MS|MT|MU|MV|MW|MX|MY|MZ|NA|NC|NE|NF|NG|NI|NL|NO|NP|NR|NU|NZ|OM|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|SS|ST|SU|SV|SX|SY|SZ|TC|TD|TF|TG|TH|TJ|TK|TL|TM|TN|TO|TR|TT|TV|TW|TZ|UA|UG|UK|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|YE|YT|ZA|ZM|ZW))(?::\\d{2,5})?(?:\\/[a-z0-9\\/\\-_%$@&()!?'=~*+:;,.]+)*\\/?(?:[?#]\\S*)*\\/?)$", @@ -2781,4 +2789,4 @@ "Invalid": [] } } -] +] \ No newline at end of file diff --git a/pywhat/__main__.py b/pywhat/__main__.py index cae6dfc..0cd4b2b 100644 --- a/pywhat/__main__.py +++ b/pywhat/__main__.py @@ -6,6 +6,67 @@ import platform import sys +import what +import threading + +from PyQt6.QtCore import QSize, Qt +from PyQt6.QtGui import QAction +from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QLineEdit, QVBoxLayout, QWidget, QMenu, QCheckBox + +class MainWindow(QMainWindow): + def __init__(self): + super().__init__() + + self.setWindowTitle("PyWhat-GUI") + + # self.label = QLabel("Enter Phrase Here") + # font = self.label.font() + # font.setPointSize(16) + # self.label.setFont(font) + # self.label.setAlignment(Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter) + + self.input = QLineEdit() + self.input.setPlaceholderText("Enter your phrase here.") + self.input.returnPressed.connect(self.searchThis) + + button = QPushButton("PyWhat Me!") + button.setCheckable(True) + button.clicked.connect(self.searchThis) + + layout = QVBoxLayout() + # layout.addWidget(self.label) + layout.addWidget(self.input) + layout.addWidget(button) + + + + self.container = QWidget() + self.container.setLayout(layout) + + self.setFixedSize(QSize(400, 300)) + + # Set the central widget of the Window. + self.setCentralWidget(self.container) + + def searchThis(self): + # print("Clicked!") + search = self.input.text() + # print(self.input.text()) + # sys.stdout = open('out.dat', 'w') + result = what.run({search}) + print("result", result) + # sys.stdout.close() + + + # def contextMenuEvent(self, e): + # context = QMenu(self) + # context.addAction(QAction("test 1", self)) + # context.addAction(QAction("test 2", self)) + # context.addAction(QAction("test 3", self)) + # context.exec(e.globalPos()) + + + if __name__ == "__main__": if sys.version_info < (3, 6): @@ -14,9 +75,16 @@ ) sys.exit(1) - from pywhat import what + # from pywhat import what + + app = QApplication(sys.argv) + global window + window = MainWindow() + window.show() + app.exec() + - if len(sys.argv) == 1: - what.main(["--help"]) + # if len(sys.argv) == 1: + # what.main(["--help"]) - what.main() + # what.main() diff --git a/pywhat/filter.py b/pywhat/filter.py index 30fe5f6..df679c8 100644 --- a/pywhat/filter.py +++ b/pywhat/filter.py @@ -1,7 +1,8 @@ from collections.abc import Mapping from typing import Optional -from pywhat.helper import AvailableTags, CaseInsensitiveSet, InvalidTag, load_regexes +# from pywhat.helper import AvailableTags, CaseInsensitiveSet, InvalidTag, load_regexes +from helper import AvailableTags, CaseInsensitiveSet, InvalidTag, load_regexes class Filter(Mapping): diff --git a/pywhat/helper.py b/pywhat/helper.py index 581ab93..ba9f3e4 100644 --- a/pywhat/helper.py +++ b/pywhat/helper.py @@ -4,6 +4,9 @@ import re from enum import Enum, auto from functools import lru_cache +from datetime import date +import csv +from pathlib import Path try: import orjson as json @@ -103,3 +106,109 @@ def str_to_key(s: str): return getattr(Keys, s.upper()) except AttributeError: raise ValueError + + +class Query: + def __init__(self, is_file: bool, content: str): + if is_file: + self.type = "File" + else: + self.type = "String" + self.content = content + self.query_date = ( + date.today() + ) # record the date of the query in format "yyyy-mm-dd" + + def early_than_start_date(self, another_date) -> bool: + return self.query_date < another_date + + def late_than_end_date(self, another_date) -> bool: + return self.query_date > another_date + + def set_date(self, date_str): + date_list = date_str.split("-") + date_int_list = [int(s) for s in date_list] + self.query_date = date(date_int_list[0], date_int_list[1], date_int_list[2]) + + def is_file(self): + return self.type == "File" + + def record(self): + filename = Path(__file__).parent / "Data" / "record.csv" + with open(filename, "a", newline="") as file: + writer = csv.writer(file) + row = [self.type, self.content, self.query_date] + writer.writerow(row) + + +class Recorder: + def __init__(self): + self.csv_path = Path(__file__).parent / "Data" / "record.csv" + + def is_exist_csv(self): + if os.path.exists(self.csv_path): + return True + else: + return False + + def create_csv(self): + with open(self.csv_path, "w", newline="") as file: + writer = csv.writer(file, delimiter=",") + row = ["type", "content", "date"] + writer.writerow(row) + + def write_query(self, is_file: bool, content: str): + query = Query(is_file, content) + if not self.is_exist_csv(): + self.create_csv() + query.record() + + def get_len_csv(self): + if not self.is_exist_csv(): + return 0 + else: + with open(self.csv_path, "r") as file: + length = len(file.readlines()) + return length - 1 + + def get_range_data(self, start_date, end_date): + if not self.is_exist_csv(): + return [] + queries = [] + with open(self.csv_path, "r") as file: + content = file.readlines() + content = content[::-1] + for row in content[:-1]: + strings = row.split(",") + query = Query(strings[0], strings[1]) + query.set_date(strings[2]) + if query.early_than_start_date(start_date): + break + elif query.late_than_end_date(end_date): + continue + else: + queries.append(row) + return queries + + def print_csv(self, lines: int): + if not self.is_exist_csv(): + print("No queries history so far") + return + else: + length = self.get_len_csv() + actual_lines = length + if lines > 100 and length > 100: + lines = 100 + print( + "The required number is large. The output will show the lastest 100 queries." + ) + if length > lines: + actual_lines = lines + with open(self.csv_path, "r") as file: + content = file.readlines() + content = content[::-1] + for row in content[:-1]: + if actual_lines == 0: + break + print(row) + actual_lines -= 1 diff --git a/pywhat/identifier.py b/pywhat/identifier.py index c24927d..a2a9aee 100644 --- a/pywhat/identifier.py +++ b/pywhat/identifier.py @@ -2,10 +2,15 @@ import os.path from typing import Callable, Optional -import pywhat.magic_numbers -from pywhat.filter import Distribution, Filter -from pywhat.helper import Keys -from pywhat.regex_identifier import RegexIdentifier +# import pywhat.magic_numbers +# from pywhat.filter import Distribution, Filter +# from pywhat.helper import Keys +# from pywhat.regex_identifier import RegexIdentifier + +import magic_numbers +from filter import Distribution, Filter +from helper import Keys +from regex_identifier import RegexIdentifier class Identifier: @@ -63,7 +68,7 @@ def identify( else: short_name = os.path.basename(string) - magic_numbers = pywhat.magic_numbers.get_magic_nums(string) + magic_numberss = magic_numbers.get_magic_nums(string) with open(string, "r", encoding="utf-8", errors="ignore") as file: contents = [file.read()] @@ -74,11 +79,11 @@ def identify( contents, dist=dist, boundaryless=boundaryless ) - if not magic_numbers: - magic_numbers = pywhat.magic_numbers.check_magic_nums(string) + if not magic_numberss: + magic_numberss = magic_numbers.check_magic_nums(string) - if magic_numbers: - identify_obj["File Signatures"][short_name] = magic_numbers + if magic_numberss: + identify_obj["File Signatures"][short_name] = magic_numberss else: short_name = "text" regex = self._regex_id.check( @@ -87,6 +92,8 @@ def identify( if regex: identify_obj["Regexes"][short_name] = regex + + print("Processed a string or a file \'{}\'".format(string)) for key_, value in identify_obj.items(): # if there are zero regex or file signature matches, set it to None diff --git a/pywhat/magic_numbers.py b/pywhat/magic_numbers.py index 0d1a0ab..da8bf9c 100644 --- a/pywhat/magic_numbers.py +++ b/pywhat/magic_numbers.py @@ -1,6 +1,7 @@ import binascii -from pywhat.helper import read_json +# from pywhat.helper import read_json +from helper import read_json def get_magic_nums(file_loc): diff --git a/pywhat/regex_identifier.py b/pywhat/regex_identifier.py index fd4f592..9db3192 100644 --- a/pywhat/regex_identifier.py +++ b/pywhat/regex_identifier.py @@ -1,7 +1,8 @@ import re from typing import Optional -from pywhat.filter import Distribution, Filter +# from pywhat.filter import Distribution, Filter +from filter import Distribution, Filter class RegexIdentifier: diff --git a/pywhat/what.py b/pywhat/what.py index 5627bda..ad4d08d 100644 --- a/pywhat/what.py +++ b/pywhat/what.py @@ -2,11 +2,16 @@ import click from rich.console import Console +import os -from pywhat import __version__, identifier, printer -from pywhat.filter import Distribution, Filter -from pywhat.helper import AvailableTags, InvalidTag, Keys, str_to_key +import identifier, filter, helper, printer +from filter import Distribution, Filter +from helper import AvailableTags, InvalidTag, Keys, str_to_key, Recorder +from datetime import date +# from pywhat import __version__, identifier, printer +# from pywhat.filter import Distribution, Filter +# from pywhat.helper import AvailableTags, InvalidTag, Keys, str_to_key def print_tags(ctx, opts, value): if value: @@ -121,6 +126,11 @@ def get_text(ctx, opts, value): help="Format output according to specified rules.", ) @click.option("-pt", "--print-tags", is_flag=True, help="Add flags to output") + +@click.option("--query", required = False, help = "Search queries history in a specific range", is_flag = True) +@click.option("--start-date", type= click.DateTime(formats=["%Y-%m-%d"]), default = str(date.today())) +@click.option("--end-date", type= click.DateTime(formats=["%Y-%m-%d"]), default = str(date.today())) +@click.option("--print-history", type = int) def main(**kwargs): """ pyWhat - Identify what something is. @@ -248,8 +258,31 @@ def main(**kwargs): * what 'this/is/a/path' """ - if kwargs["text_input"] is None: + + if kwargs["text_input"] is None and not kwargs['query'] and not kwargs['print_history']: + # kwargs["window"] sys.exit("Text input expected. Run 'pywhat --help' for help") + + recorder = Recorder() + if kwargs['query']: + print(recorder.get_range_data(kwargs['start_date'].date(), kwargs['end_date'].date())) + if kwargs['text_input'] is None: + sys.exit() + + if kwargs['print_history']: + recorder.print_csv(kwargs['print_history']) + if kwargs['text_input'] is None: + sys.exit() + + # print(kwargs['text_input']) + + is_file = False + if os.path.exists(kwargs['text_input']): + is_file = True + print("Recogined as the file(s)") + else: + print("Recogined as the string") + recorder.write_query(is_file, content = kwargs['text_input']) dist = Distribution( create_filter(kwargs["rarity"], kwargs["include"], kwargs["exclude"]) ) @@ -289,6 +322,7 @@ def main(**kwargs): p.format_print(identified_output, kwargs["format"]) else: p.print_raw(identified_output, kwargs["text_input"], kwargs["print_tags"]) + return "hello" class What_Object: