Open mdybowski opened 5 years ago
Traceback (most recent call last):
File "/home/runner/_test_runner.py", line 2, in <module>
import unit_tests
File "/home/runner/unit_tests.py", line 53, in <module>
class UnitTests(unittest.TestCase):
File "/home/runner/unit_tests.py", line 128, in UnitTests
model_database = ModelConfData(database_file='confwrld_user_database.csv')
File "/home/runner/unit_tests.py", line 58, in __init__
self.database = self._read_database(database_file)
File "/home/runner/unit_tests.py", line 70, in _read_database
datetime.strptime(row[2], "%Y-%m-%dT%H:%M:%S").timestamp(),
NameError: name 'datetime' is not defined
exit status 1
To wynik pierwszego testu - być może się mylę, ale czy błąd nie jest po stronie kodu testującego?
Mówiąc szczerze też nie rozumiem w jaki sposób to zadanie ma zostać rozwiązane. Jakieś podpowiedzi?
Pytanie do czego odnosi się data "date_updated"? Bo chociażby dla 1 przypadku, hasło się zmieniło, ale ta data nie.
"W pierwszej kolejności należy zresetować hasła klientom którzy nie zmieniali hasła od czasu ataku" Jak to rozumieć?
Też nie rozumiem np. po co nam pass_list w przypadku tej metody: ConfData.pwned_users(pass_list, hack_time) = ["mail1", "mail2", ..... ] Jeżeli dobrze rozumiem, to ma ona zwracać po prostu listę osób, dla których date_updated < hack_time
Treść jest trochę niezrozumiała, ale podejrzewam, że pwned_users ma zwrócić liste osób, dla których date_updated < hack_time i ich hasło znajduje się na liście najpopularniejszych haseł i do tego potrzebne jest nam pass list. Niestety nie mogę sprawdzić swojego rozumowania, bo tylko w tej funkcji otrzymuję, że mój program trwa za długo (nie mam pojęcia dlaczego tak jest, gdyż jest to funkcja bardzo podobna do pozostałych moich funkcji, a funkcja normalnie działa u mnie na komputerze)
Żeby testy działały nam w jakikolwiek sensowny sposób musimy zaimportować kilka bibliotek: from collections import defaultdict from collections import OrderedDict from datetime import datetime nawet jeśli z nich nie korzystamy
A w klasie ConfData jak ma wyglądać konstruktor tej klasy? Jego polami mają być obie listy klientów, czy jak to ma wyglądać ?
Nie mam pojęcia, ale ja dałam ścieżki do pliku, który wyciekł i do ogólnej bazy, tylko testy zupełnie mi nie działąją, wiec nie jestem w stanie zweryfikowac czegokolwiek
konstruktor przyjmuje nazwe pliku, w którym jest nasza lista osób i do pola data przypisuje dane z pliku w jakiś sformatowany sposób taki, żeby było nam wygodnie na nim operować. Taka analogiczna funkcja do funkcji get_data z wykładu
ten parametr musi mieć wartość domyślną (ja dałem "confwrld_user_database.csv")
Jeszcze jeżeli chodzi o testy, to przy run tests wyświetla mi sie cały czas "connecting to server" aż w końcu wyświetla się błąd:
Your program took too long to execute.
Make sure that it isn't waiting for input and that there is no infinite loop.
Natomiast jak uruchamiam program u siebie, to wszystko jest ok
Brzmi sensownie, dzięki, spróbuję podziałać :)
Problematyczna jest jeszcze ta funkcja , która nie jest w żaden sposób wspomniana, a jest wymagana do działania programu - read_passwords, istotne jest to, że ona musi być statyczna
Jednak miałem błąd w implementacji funkcji pwned_users, gdy go poprawiłem to zniknął komunikat o przekroczeniu czasu i zaliczyło test, więc taki sposób działania funkcji jaki napisałem wyżej powinien być poprawny
Ja odpuszczam, testy sa napisane w taki sposob ze nie da sie nic z tym zrobic a nie chce spedzic calej niedzieli zastanawiajac sie co autor mial na mysli...
Chcialbym tylko potwierdzic ze w weak_pass_users wychodzi wam 6375 osob z haslami ktore znajduja sie w liscie top 500, oraz 118 osob ktore maja hasla takie jak w top 10.
Co do reszty to spojrzalem sobie na dane i niestety nie maja sensu, ktos sie musial pomylic tworzac tabele z aktualnymi danymi.
Listy maja dokladnie ta sama dlugosc i dokladnie te same maile sa w jednej i drugiej. Listy roznia sie haslami oraz date_updated. I tu niestety mamy babola, w kazdym przypadku gdzie haslo zostalo zmienione (czytaj haslo w jednej bazie dla tego samego uzytkownika jest inne niz w drugiej bazie), date_updated jest wczesniejsze niz data hackowania, a dla wszystkich hasel ktore sie realnie nie zmienily (w jednej bazie takie samo jak w drugiej), date_updated jest nowe i jest wieksze od daty hackowania. Powinno byc dokladnie na odwrot...
Ciekawe czy znajdzie sie taki/taka co przejdzie testy :) Milej niedzieli!
Mi się udało zaliczyć wszsytkie testy, jednak zajęło mi to zdecydowanie więcej czasu niż bym chciał oraz w pewnych miejscach musiąłem się domyślać czego oczekują na wyjściu, bo nie zawsze zgadzało się to z tym co było napisane. confwrld_user_data_dump_10.11.2017.csv jeśli chodzi o tą listę nie była ona w żaden sposób użyta przeze mnie w rozwiązaniu ani nie widzę jej w przykładowym rozwiązaniu
Czy ktoś może wie o co może chodzić w tym błędzie do pierwszego testu ?
`Traceback (most recent call last): File "/home/runner/unit_tests.py", line 200, in test_conf_data_weak_pass_users self.model_database.weak_pass_users(self.pass_list) AssertionError: Lists differ: ['aoj[194022 chars]e.cl', 'aojbpalbqeplelfbizkvgupqm@hxrv.ar', 'b[776087 chars].cl'] != ['aoj[194022 chars]e.cl']
First list contains 25500 additional elements. First extra element 6375: 'aojbpalbqeplelfbizkvgupqm@hxrv.ar'
Diff is 1065790 characters long. Set self.maxDiff to None to see it.`
apropo importów - mój błąd, umknęły mi, przed chwilą zedytowałem testy i teraz powinno być dobrze, za wszelkie kłopoty bardzo przepraszam.
Traceback (most recent call last):
File "/home/runner/_test_runner.py", line 2, in
Czy ktoś może wie ja kto naprawić ? Moja metoda w klasie to def read_passwords(self, database_file): m = list() with open(database_file, 'r') as f: for line in f: m.append(line.strip('\n').split(',')) return m
Wygląda na to, że ta funkcja nie jest wykonywana na instancji, ale nie mam pojęcia jak mógłbym na to zaradzić
Ta funkcja musi być statyczna
A no jasne, dzięki :D
Hej, wie ktoś czemu nie mogą mi się timestampy przeparsować?
def read_file(self, file, *args): datastamps_parser = lambda x: pd.datetime.strptime(str(x), '%Y-%m-%dT%H:%M:%S') f = pd.read_csv(file, parse_dates = ['date_created', 'date_updated'], date_parser = datastamps_parser, sep = ',') print(f.columns) return f
error: ValueError: 'date_created' is not in list
ConfData.common_pass(pass_list, n=10) = ["pass1", "pass2", ..... ] Przyjmuje: pass_list -> struktura z wczytanymi hasłami i jej hashami n -> liczba haseł jakie chcemy otrzymać Zwraca: [["pass1", "pass1_hash"], ["pass1", "pass1_hash"], ...] listę list haseł i ich hashy SHA1
Co w przypadku, gdy po posortowaniu po liczbie wystąpień hasło_10, hasło_11 i hasło_12 ma taką samą liczbę? Które z haseł powinno znaleźć się na liście? Alfabetycznie?
@migasmonika Tak wypisujemy 10 haseł. jeżeli 10, 11, 12 mają taką ilość wystąpień, pierwsze które alfabetycznie się pojawi w tej trójce.
Dlaczego testy caly czas wymagaja utworzenia metod o ktorych nic nie ma napisane w tresci zadania? Mowie tu o read_passwords. Na Wtorkowym wykladzie ustalalismy ze wszystkie wymagane metody beda opisane...
Dlaczego testy caly czas wymagaja utworzenia metod o ktorych nic nie ma napisane w tresci zadania? Mowie tu o read_passwords. Na Wtorkowym wykladzie ustalalismy ze wszystkie wymagane metody beda opisane...
Dodany został Scaffold rozwiązania, jeśli jednak jest on z jakiś przyczyn niewidoczny to dokleiłem go w treści zadania. Mam nadzieję że teraz nie będzie problemu
Cześć, mam problem z przejściem testu common_pass_users. Wydaje mi się, że funkcja działa dobrze, ale test sprawdza jakąś swoją kolejność haseł w liście, zamiast robić to alfabetycznie.
Błąd wywalany przez test:
self.model_database.common_pass_users(self.pass_list, 21)
AssertionError: Lists differ: ['fuc[14 chars]r', 'cowboy', 'ford', 'merlin', 'murphy', 'pau[138 chars]ssy'] != ['fuc[14 chars]r', 'ford', 'cowboy', 'merlin', 'murphy', 'pau[139 chars]hjk']
First differing element 2:
'cowboy'
'ford'
['fucking',
'panther',
+ 'ford',
'cowboy',
- 'ford',
'merlin',
'murphy',
'paul',
'4321',
- 'booger',
'loveme',
'lover',
'michelle',
'pamela',
- 'asdfghjk',
+ 'booger',
+ 'winner',
+ 'victor',
+ 'pussy',
+ 'tester',
+ 'nascar',
+ 'cumshot',
'cookie',
+ 'asdfghjk']
- 'cumshot',
- 'december',
- 'fuck',
- 'horny',
- 'nascar',
- 'pussy']
Moja lista (tylko dla potrzeb githuba hasła wypisane razem z ilością powtórzeń w bazie).
[['fucking', 27], ['panther', 26], ['cowboy', 25], ['ford', 25], ['merlin', 24], ['murphy', 23], ['paul', 22], ['4321', 21], ['booger', 20], ['loveme', 20], ['lover', 20], ['michelle', 20], ['pamela', 20], ['asdfghjk', 19], ['cookie', 19], ['cumshot', 19], ['december', 19], ['fuck', 19], ['horny', 19], ['nascar', 19]]
Jak widać błędy wyrzuca przy hasłach, które mają taką samą liczbę powtórzeń, przy czym w mojej liście są one ustawione alfabetycznie, a w liście testowej nie do końca.
Czy to mój błąd i coś skopałem w liczeniu haseł, czy jednak testy?
Mam ten sam problem. Co najciekawsze w testach mamy loveme i lover, natomiast booger się już nie pojawia a jest pierwsze w kolejności alfabetycznej. Nawet gdyby iść od drugiej strony to pierwszy jest pamela, który również nie występuje...
Chyba wiem jak to działa. Wypisuje w takiej kolejności, że n1 występuje w liście przed n2, jeśli n1 wystąpiło wiecej razy od n2. A jeśli wystapilo tyle samo razy to wtedy pierwszy jest ten, który pierwszy się pojawił w pliku z tymi userami.
Dodatkowo nie wiem co się zadziało, ale jak odpaliłem restart wszystkiego to od tamtej pory pojawia się komunikat o infinite loop co bym nie zrobił. Nawet jak usunę dosłowni wszystko i zostaje biała tablica.
Taaaa... Już wiem co jest "nie tak" z common_pass_users:
Edited: wróć, most_common działa ok ale tylko z OrderedDict tak mi się wydaje
A czy też masz może ten problem odnosnie nieskończonej pętli ? Bo nie wiem czy to tylko u mnie czy coś się zepsuło globalnie. Nawet jak usunę wszystko, nie ma żadnego zapisanego kodu to pisze ze mam infinity loop.
Nie mam problemu z tym. Spróbuj na tym repl.it "zacząć od nowa"
No właśnie restartowalem już parę razy i nadal to samo, nie wiem co robić :/
Ja mam dość dziwny problem z metodą common_pass_users, na razie zupełnie niezwiązany z kolejnością haseł, tylko z długością samej listy.
Jak wywołuję print("Length: "+ str(len(my_data.common_pass_users(my_pass_list)))) to output wygląda tak:
['fucking', 'panther', 'ford', 'cowboy', 'merlin', 'murphy', 'paul', '4321', 'loveme', 'lover'] Length: 10
Natomiast z testu wynika błąd wskazujący na pustą listę:
Traceback (most recent call last): File "/home/runner/unit_tests.py", line 210, in test_test_conf_data_common_pass_users_with_default_args self.assertEqual(len(common_pass_users), 10) AssertionError: 0 != 10
Jakieś pomysły? Bo zupełnie nie mam pomysłu co może być powodem.
I jeszcze jedno pytanie, jakie warunki mają być spełnione przy safe_users? W dwóch miejscach jest to nieco inaczej sformułowane:
hasło nie figuruje na liście oraz zmienili hasło od ataku
Zwraca listę ludzi którzy nie figurowali w wycieku i mają bezpieczne hasła.
Ja to rozumiem tak, że date_updated ma być > od hack_time i hasło nie widnieje w top500, ale jak tak robię, to z testów wynika, że brakuje mi ponad 7000 użytkowników na liście:
Traceback (most recent call last): File "/home/runner/unit_tests.py", line 246, in test_conf_data_safe_users self.model_database.safe_users(self.pass_list, self.hack_time) AssertionError: Lists differ: ['aaeut@gweh.cl', 'adugzqcnuqhchfcguikdje@go[23944 chars].sm'] != ['aojbpalbqeplelfbizkvgupqm@hxrv.ar', 'ggwkg[254237 chars].cl'] First differing element 0: 'aaeut@gweh.cl' 'aojbpalbqeplelfbizkvgupqm@hxrv.ar' Second list contains 7572 additional elements. First extra element 784: 'rbkkmrbdcrjewnyylxyvptzeusje@fikd.ar' Diff is 305676 characters long. Set self.maxDiff to None to see it.
I jeszcze jedno pytanie, jakie warunki mają być spełnione przy safe_users? W dwóch miejscach jest to nieco inaczej sformułowane:
- hasło nie figuruje na liście oraz zmienili hasło od ataku
- Zwraca listę ludzi którzy nie figurowali w wycieku i mają bezpieczne hasła.
Ja to rozumiem tak, że date_updated ma być > od hack_time i hasło nie widnieje w top500, ale jak tak robię, to z testów wynika, że brakuje mi ponad 7000 użytkowników na liście:
Też to tak rozumiem, z bazy danych wszystkich użytkowników wybieram tych, którzy last update mają wcześniej niż data ataku ORAZ hasło jest na liście top500, co najdziwniejsze zbiory te nie przecinają się -> tablica wyników jest pusta.
Dobra, przeszło mi testy: ma być date_updated <= hack_time lub hasło nie jest w top 500. Zaczęłam przechodzić przez wszystkie kombinacje tego warunku i w końcu coś zadziałało.
Zostało mi jeszcze common_pass i ten dziwny błąd w takim razie.
pt., 30 lis 2018 o 23:11 Max notifications@github.com napisał(a):
I jeszcze jedno pytanie, jakie warunki mają być spełnione przy safe_users? W dwóch miejscach jest to nieco inaczej sformułowane:
- hasło nie figuruje na liście oraz zmienili hasło od ataku
- Zwraca listę ludzi którzy nie figurowali w wycieku i mają bezpieczne hasła.
Ja to rozumiem tak, że date_updated ma być > od hack_time i hasło nie widnieje w top500, ale jak tak robię, to z testów wynika, że brakuje mi ponad 7000 użytkowników na liście:
Też to tak rozumiem, z bazy danych wszystkich użytkowników wybieram tych, którzy last update mają wcześniej niż data ataku ORAZ hasło jest na liście top500, co najdziwniejsze zbiory te nie przecinają się -> tablica wyników jest pusta.
— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/daftcode/daftacademy-python4beginners-autumn2018/issues/9#issuecomment-443355196, or mute the thread https://github.com/notifications/unsubscribe-auth/AlSUZg7ZOrn2UN05KD4uESrBqXmYHoikks5u0a0WgaJpZM4YxOd7 .
U mnie okazało się, że safe_users to dokładnie dopełnienie użytkowników z pwned_users.
@KulerOvZuo @Bazyl29 jak udało się Wam rozwiązać problem w common_pass (swoją drogą czy dokumentacji jest common_pass a w testach common_pass_users?) dotyczący kolejności wypisywanych haseł? Bo korzystam z OrderDict i mimo to zwracana jest zła kolejność.
Counter(OrderedDict(sorted(_dict.items(), key=lambda t: t[1], reverse=True))).most_common(n) gdzie _dict to słownik hasło + liczba wystąpień
Udało się przejść pierwszy z testów ale na kolejnym znowu się wywalił.
Traceback (most recent call last):
File "/home/runner/unit_tests.py", line 212, in test_conf_data_common_pass_users_with_all_params
self.model_database.common_pass_users(self.pass_list, 21)
AssertionError: Lists differ: ['fuc[72 chars]'lover', 'michelle', 'pamela', 'loveme', 'boog[78 chars]uck'] != ['fuc[72 chars]'loveme', 'lover', 'michelle', 'pamela', 'boog[81 chars]hjk']
First differing element 8:
'lover'
'loveme'
['fucking',
'panther',
'ford',
'cowboy',
'merlin',
'murphy',
'paul',
'4321',
+ 'loveme',
'lover',
'michelle',
'pamela',
- 'loveme',
'booger',
'winner',
- 'horny',
+ 'victor',
+ 'pussy',
'tester',
+ 'nascar',
'cumshot',
+ 'cookie',
+ 'asdfghjk']
- 'pussy',
- 'december',
- 'victor',
- 'fuck']
Ma ktoś pomysł, dlaczego to nie przechodzi testów?
def common_pass_users(self, pass_list, n=10):
pass_dict=OrderedDict()
pass_counts_dict=OrderedDict()
for i in range(len(pass_list)):
pass_dict[pass_list[i][1]]=pass_list[i][0]
pass_counts_dict[pass_list[i][1]]=0
for record in self.database:
if record[1] in pass_dict:
pass_counts_dict[record[1]]+=1
n_most_common_pass_list=[]
for i in Counter(OrderedDict(sorted(pass_counts_dict.items(), key=lambda t: t[1], reverse=True))).most_common(n):
n_most_common_pass_list.append(pass_dict[i[0]])
return n_most_common_pass_list
Chyba coś zmieniło się w testach. Rozwiązanie, w którym bierzemy w kolejności alfabetycznej dla haseł o tej samej liczbie wystąpień przechodzi.
Faktycznie, ten sam kod przechodzi teraz jeden z testów, ale na drugim zwraca następujący błąd: Traceback (most recent call last):
File "/home/runner/unit_tests.py", line 211, in test_test_conf_data_common_pass_users_with_default_args
set(self.model_database.common_pass_users(self.pass_list))
AssertionError: Items in the first set but not the second:
'michelle'
'lover'
Items in the second set but not the first:
'booger'
'loveme'
U mnie zadziałało zwykłe sortowanie słownika po liczbie wystąpień i kluczu a następnie wybór pierwszych n-elementów. Nie używałam OrderDicta, ale możliwe, że to jedno z rozwiązań.
Niestety, ale to zadanie, a w szczególności testy do niego wyjątkowo niepoważnie traktują uczestników tego kursu. Funkcja "ConfData.common_pass(pass_list, n=10)" z domyślmym parametrem może zwrócić 4 różne, 4 równie poprawne odpowiedzi. Wszystko przez to, że mamy 5 haseł, które występują 20 razy każde i na nieszczęście są one ex aequo 9. pod względem popularności.
Czy mógłbym prosić o potwierdzenie od prowadzących, że nie daliście pustego outa do 1 testu i to całkowity przypadek, że ten kod przechodzi pierwszy test (i pewnie jedyny sprawdzający weak_pass)? def weak_pass_users(self, pass_list): return list() Edit: Czy mógłbym też prosić o potwierdzenie, że mamy zwrócić listę list? Jak próbuję ją zwrócić to dostaję `Traceback (most recent call last): File "/home/runner/unit_tests.py", line 185, in test_conf_data_common_pass_users_with_all_params set(common_pass_users), TypeError: unhashable type: 'list'` a jak zwracam listę tupli to wywalam się linijkę później.
mkmkl93:
Edit: Czy mógłbym też prosić o potwierdzenie, że mamy zwrócić listę list? Jak próbuję ją zwrócić to dostaję
Traceback (most recent call last): File "/home/runner/unit_tests.py", line 185, in test_conf_data_common_pass_users_with_all_params set(common_pass_users), TypeError: unhashable type: 'list'
a jak zwracam listę tupli to wywalam się linijkę później. Mi wychodzi, że mamy zwrócić listę haseł: ["pass1", "pass2", ...] a nie jak błędnie podane w zadaniu listę list: [["pass1", "pass1_hash"], ["pass1", "pass1_hash"], ...] no i nie listę tupli.
Uff... wreszcie ConfData.common_pass() ok :sweat_smile: Aby kod podany przez @KulerOvZuo zadziałał i uwzględnił, że w przypadku haseł z tą samą liczbą wystąpień sortujemy je dodatkowo alfabetycznie, można go tak uzupełnić:
Counter(OrderedDict(sorted(_dict.items(), key=lambda t: (-t[1],t[0]) ))).most_common(n)
Jaki właściwie powinien być output ConfData.common_pass() na domyślnych ustawieniach? Mi zwraca: ['fucking', 'panther', 'cowboy', 'ford', 'merlin', 'murphy', 'paul', '4321', 'booger', 'loveme'] i testy krzyczą, że to źle:
Traceback (most recent call last): File "/home/runner/unit_tests.py", line 189, in test_test_conf_data_common_pass_users_with_default_args set(self.model_database.common_pass_users(self.pass_list)) AssertionError: Items in the first set but not the second: 'paul' 'cowboy' 'loveme' '4321' 'murphy' 'fucking' 'booger' 'merlin' 'panther' 'ford'
Czy ktoś może spotkał się z taką sytuacją, że wszystkie testy zaznaczone są na zielono, ale całe zadanie ma status Failed? Jakieś wskazówki z czego może to wynikać? Może jakiś dodatkowy warunek, który nie jest uwzględniony w testach?
Jak właściwie ma wyglądać struktura ConfData ? Czy to ma być klasa ? Ponadto testy mówią o braku metody read_passwords. Czy to też należy napisać ?