1
Fork 0
mirror of https://github.com/pds-nest/nest.git synced 2024-11-25 06:24:19 +00:00

Merge remote-tracking branch 'origin/main' into main

This commit is contained in:
Lorenzo Balugani 2021-05-17 15:29:17 +02:00
commit c13e5fff40
19 changed files with 10540 additions and 3426 deletions

View file

@ -0,0 +1,78 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<HTMLCodeStyleSettings>
<option name="HTML_UNIFORM_INDENT" value="true" />
<option name="HTML_ATTRIBUTE_WRAP" value="0" />
<option name="HTML_TEXT_WRAP" value="0" />
<option name="HTML_ALIGN_ATTRIBUTES" value="false" />
<option name="HTML_ELEMENTS_TO_INSERT_NEW_LINE_BEFORE" value="address,article,aside,blockquote,details,dialog,dd,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,main,nav,ol,p,pre,section,table,ul" />
<option name="HTML_ELEMENTS_TO_REMOVE_NEW_LINE_BEFORE" value="a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var" />
<option name="HTML_DO_NOT_INDENT_CHILDREN_OF" value="" />
<option name="HTML_DONT_ADD_BREAKS_IF_INLINE_CONTENT" value="" />
<option name="HTML_ENFORCE_QUOTES" value="true" />
<option name="HTML_NEWLINE_BEFORE_FIRST_ATTRIBUTE" value="When multiline" />
<option name="HTML_NEWLINE_AFTER_LAST_ATTRIBUTE" value="When multiline" />
</HTMLCodeStyleSettings>
<JSCodeStyleSettings version="0">
<option name="USE_SEMICOLON_AFTER_STATEMENT" value="false" />
<option name="FORCE_SEMICOLON_STYLE" value="true" />
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
<option name="REFORMAT_C_STYLE_COMMENTS" value="true" />
<option name="FORCE_QUOTE_STYlE" value="true" />
<option name="ENFORCE_TRAILING_COMMA" value="WhenMultiline" />
<option name="VAR_DECLARATION_WRAP" value="5" />
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
<option name="SPACES_WITHIN_IMPORTS" value="true" />
<option name="INDENT_CHAINED_CALLS" value="false" />
</JSCodeStyleSettings>
<ScalaCodeStyleSettings>
<option name="MULTILINE_STRING_CLOSING_QUOTES_ON_NEW_LINE" value="true" />
</ScalaCodeStyleSettings>
<codeStyleSettings language="HTML">
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JSON">
<indentOptions>
<option name="INDENT_SIZE" value="4" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JavaScript">
<option name="BLANK_LINES_AFTER_IMPORTS" value="2" />
<option name="BLANK_LINES_AROUND_CLASS" value="2" />
<option name="ELSE_ON_NEW_LINE" value="true" />
<option name="CATCH_ON_NEW_LINE" value="true" />
<option name="FINALLY_ON_NEW_LINE" value="true" />
<option name="ALIGN_MULTILINE_CHAINED_METHODS" value="true" />
<option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true" />
<option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true" />
<option name="SPACE_BEFORE_IF_PARENTHESES" value="false" />
<option name="SPACE_BEFORE_WHILE_PARENTHESES" value="false" />
<option name="SPACE_BEFORE_FOR_PARENTHESES" value="false" />
<option name="SPACE_BEFORE_CATCH_PARENTHESES" value="false" />
<option name="SPACE_BEFORE_SWITCH_PARENTHESES" value="false" />
<option name="METHOD_PARAMETERS_WRAP" value="5" />
<option name="METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE" value="true" />
<option name="METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE" value="true" />
<option name="METHOD_CALL_CHAIN_WRAP" value="5" />
<option name="PARENTHESES_EXPRESSION_LPAREN_WRAP" value="true" />
<option name="PARENTHESES_EXPRESSION_RPAREN_WRAP" value="true" />
<option name="BINARY_OPERATION_WRAP" value="5" />
<option name="TERNARY_OPERATION_WRAP" value="5" />
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
<option name="ARRAY_INITIALIZER_WRAP" value="5" />
<option name="ARRAY_INITIALIZER_LBRACE_ON_NEXT_LINE" value="true" />
<option name="ARRAY_INITIALIZER_RBRACE_ON_NEXT_LINE" value="true" />
<option name="IF_BRACE_FORCE" value="3" />
<option name="DOWHILE_BRACE_FORCE" value="3" />
<option name="WHILE_BRACE_FORCE" value="3" />
<option name="FOR_BRACE_FORCE" value="3" />
</codeStyleSettings>
<codeStyleSettings language="LESS">
<indentOptions>
<option name="INDENT_SIZE" value="4" />
</indentOptions>
</codeStyleSettings>
</code_scheme>
</component>

View file

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

View file

@ -2,7 +2,9 @@
| Data | Ora | Durata | Attività | | Data | Ora | Durata | Attività |
|------|-----|--------|----------| |------|-----|--------|----------|
|14/05 |10:00 | 1.0h | backlog grooming session | |14/05 |10:00 | 1.0h | Sprint Retrospective session |
Totale generale di tutti i componenti: 106.5h
# Log attività individuali dello Sprint 2 # Log attività individuali dello Sprint 2
@ -17,6 +19,12 @@ Chiara Calzolari - UI Designer
|03/05 | 1.0h | Testing frontend e segnalazione issues |03/05 | 1.0h | Testing frontend e segnalazione issues
|03/05 | 1.0h | Modifica mockup UI (Dashboard repository) |03/05 | 1.0h | Modifica mockup UI (Dashboard repository)
|04/05 | 1.0h | Modifica mockup UI (adeguamento al JS) |04/05 | 1.0h | Modifica mockup UI (adeguamento al JS)
|10/05 | 3.0h | Configurazione ambiente di sviluppo
|11/05 | 1.5h | Modifica UI (traduzione in Italiano)
|12/05 | 0.5h | Modifica UI (traduzione in Italiano)
|14/05 | 3.0h | Realizzazione video demo sprint 2
|-------|--------|
|totale| 11.0h |
Stefano Goldoni - Product Owner & Tester Stefano Goldoni - Product Owner & Tester
@ -27,8 +35,10 @@ Stefano Goldoni - Product Owner & Tester
|11/05 |2.5h |test utenti e repository |11/05 |2.5h |test utenti e repository
|12/05 |2.0h |test repository |12/05 |2.0h |test repository
|13/05 |2.5h |test repository |13/05 |2.5h |test repository
|14/05 |1.0h |test conditions |14/05 |3.0h |test conditions
|15/05 |1.0h |test conditions |15/05 |2.0h |test conditions + sonarqube scanner
|-------|--------|
|totale| 16.0h |
Lorenzo Balugani - DB & Backend Developer Lorenzo Balugani - DB & Backend Developer
@ -42,3 +52,91 @@ Lorenzo Balugani - DB & Backend Developer
|12/05|3.0h|Risolti issue pubblicati su Taiga |12/05|3.0h|Risolti issue pubblicati su Taiga
|13/05|1.0h|Bugfixing |13/05|1.0h|Bugfixing
|14/05|1.0h|Bugfixing |14/05|1.0h|Bugfixing
|-------|--------|
|totale| 19.0h |
Stefano Pigozzi - Sysadmin & Frontend Developer
| Data | Durata | Attività |
|-------|--------|----------|
|05/05|0.40h|Riunione
|05/05|0.21h|Documentazione
|06/05|0.09h|Sviluppo
|06/05|0.03h|Configurazione Taiga
|06/05|0.11h|Documentazione
|06/05|0.09h|Riunione
|06/05|0.20h|Documentazione
|06/05|0.39h|Sviluppo
|06/05|0.15h|Riunione
|06/05|1.04h|Riunione
|07/05|1.47h|Sviluppo
|07/05|0.17h|Sviluppo
|07/05|0.34h|Sviluppo
|07/05|0.34h|Project management
|07/05|2.44h|Sviluppo
|08/05|0.13h|Sviluppo
|08/05|0.29h|Sviluppo
|08/05|0.18h|Sviluppo
|10/05|1.00h|Sviluppo
|10/05|1.15h|Configurazione GitLab
|10/05|0.25h|Sviluppo
|10/05|0.39h|Sviluppo
|11/05|0.25h|Bugfixing
|11/05|3.57h|Sviluppo
|11/05|1.45h|Sviluppo
|12/05|0.10h|Sviluppo
|12/05|1.51h|Sviluppo
|13/05|1.00h|Sviluppo
|13/05|1.20h|Sviluppo
|14/05|0.20h|Sviluppo
|15/05|3.17h|Documentazione
|-------|--------|
|totale| 27.5h |
Flavia Cocca - Scrum Master & UI Designer
| Data | Durata | Attività |
|-------|--------|----------|
|04/05|0.5h|Riunione per con PO, nuovo backlog
|05/05|1.0h|Riunione
|07/05|3.0h|Refactoring test
|08/05|2.0h|Refactoring test
|09/05|3.0h|Nuovi test
|11/05|2.5h|Discussione test e risoluzione di alcune issue
|13/05|1.0h|Bugfixing
|14/05|1.0h|Sprint Retrospective
|15/05|2.0h|Documentazione
|-------|--------|
|totale| 16.0h |
Giovanni Anniballi - Tester
| Data | Durata | Attività |
|-------|--------|----------|
|04/05|0.5h|Incontro con SM e PO per valutare quali US andranno nello sprint2
|05/05|1.0h|Incontro con il team
|07/05|2.0h|Refactoring tests sugli user e primi utilizzi delle fixtures
|08/05|2.0h|Completamento test users
|10/05|1.0h|Ulteriori approcci (fallimentari) al coverage di SonarQube
|11/05|2.0h|Discussione sui test e correzioni bug
|12/05|1.0h|Test repository
|13/05|1.0h|Generazione coverage pytest e setting sonarqube (riuscito!)
|14/05|4.0h|Sprint review e retrospettiva, conclusione test repository
|15/05|2.5h|generazione nuovo coverage e fix a sonarqube 2h, fix piccoli bug segnalati da sonarqube 0.5h
|-------|--------|
|totale| 17.0h |
Giorgio Minoccari - Analyst & Backend Developer
| Data | Durata | Attività |
|-------|--------|----------|
|04/05 | 0.5h | Aggiunta della condizione sull'utente
|10/05 | 2.0h | Tentativo di inserimento delle query con place_id
|11/05 | 1.5h | Test per passare alla versione 2.0 delle API
|12/05 | 1.0h | Ritorno alla versione 1.1 perche' lascia disponibili le query sulla geolocalizzazione gratuitamente
|14/05 | 5.0h | Integrazione e inserimento dei tweet catturati nel database
|-------|--------|
|totale| 10.0h |

View file

@ -118,11 +118,11 @@ def page_alert(aid):
if not alert: if not alert:
return json_error("Could not find alert."), 404 return json_error("Could not find alert."), 404
if alert.repository not in [a.repository for a in user.authorizations] + user.owner_of: if alert.repository not in [a.repository for a in user.authorizations] + user.owner_of:
json_error("You are not authorized to proceed."), 403 return json_error("You are not authorized to proceed."), 403
if request.method == "GET": if request.method == "GET":
return json_success(alert.to_json()), 200 return json_success(alert.to_json()), 200
if alert.repository not in user.owner_of: if alert.repository not in user.owner_of:
json_error("You are not authorized to proceed."), 403 return json_error("You are not authorized to proceed."), 403
if request.method == "PATCH": if request.method == "PATCH":
if 'name' in request.json: if 'name' in request.json:
alert.name = request.json['name'] alert.name = request.json['name']

View file

@ -5,10 +5,9 @@ import nltk
from nltk.corpus import stopwords from nltk.corpus import stopwords
ext.init_app(app=app) ext.init_app(app=app)
def authenticate(): def authenticate():
c_k = "GEhtSyP9e98mzFeiOCSW0lvQX" c_k = "GEhtSyP9e98mzFeiOCSW0lvQX"
c_s = "438cmYrl5xqaX2W7I2Bf5A9nF1pN5VtM9f77WYQnAXg1BwKJ27" c_s = "438cmYrl5xqaX2W7I2Bf5A9nF1pN5VtM9f77WYQnAXg1BwKJ27"
@ -20,6 +19,7 @@ def authenticate():
api = tw.API(auth, wait_on_rate_limit=True) api = tw.API(auth, wait_on_rate_limit=True)
return api return api
def start_exploring(): def start_exploring():
api = authenticate() api = authenticate()
most_popular_hashtags = dict() most_popular_hashtags = dict()
@ -49,7 +49,7 @@ def start_exploring():
print(dict(sorted(most_popular_words.items(), key=lambda item: item[1]))) print(dict(sorted(most_popular_words.items(), key=lambda item: item[1])))
def search_repo_conditions(repository_id): def search_repo_conditions(repository_id, all_or):
repo = Repository.query.filter_by(id=repository_id).first() repo = Repository.query.filter_by(id=repository_id).first()
conditions = [use.condition for use in repo.uses] conditions = [use.condition for use in repo.uses]
conditions_type = dict() conditions_type = dict()
@ -64,22 +64,6 @@ def search_repo_conditions(repository_id):
print(types, ":", conditions_type[types]) print(types, ":", conditions_type[types])
if __name__ == "__main__": if __name__ == "__main__":
search_repo_conditions()
#print(stopwords.words('italian'))
with app.app_context(): with app.app_context():
ext.create_all(app=app) ext.create_all(app=app)
#start_exploring()

View file

@ -1,8 +1,6 @@
from nest_backend.app import app from nest_backend.app import app
from nest_backend.database import * from nest_backend.database import *
import tweepy as tw import tweepy as tw
import nltk
from nltk.corpus import stopwords
from datetime import datetime from datetime import datetime
ext.init_app(app=app) ext.init_app(app=app)
@ -13,31 +11,30 @@ def authenticate():
c_s = "438cmYrl5xqaX2W7I2Bf5A9nF1pN5VtM9f77WYQnAXg1BwKJ27" c_s = "438cmYrl5xqaX2W7I2Bf5A9nF1pN5VtM9f77WYQnAXg1BwKJ27"
a_t = "1380217745732689921-8gCfr8Zx9YHKvo4OVP3HAr3kfMRkgz" a_t = "1380217745732689921-8gCfr8Zx9YHKvo4OVP3HAr3kfMRkgz"
a_t_s = "jGOlgTs1i1itGMxDxAqFEDnv7QAui772n9hGxeSIKcwzS" a_t_s = "jGOlgTs1i1itGMxDxAqFEDnv7QAui772n9hGxeSIKcwzS"
b_t = "AAAAAAAAAAAAAAAAAAAAANjpOQEAAAAAYFKrqByk6WTMEwIYUJLrVnPeQuo%3DJUJUW2mFq9n20A7BtIRMT24PPFg1NXVtetrfp0tH1NkDFFNGo5"
auth = tw.OAuthHandler(c_k, c_s) auth = tw.OAuthHandler(c_k, c_s)
auth.set_access_token(a_t, a_t_s) auth.set_access_token(a_t, a_t_s)
api = tw.API(auth, wait_on_rate_limit=True) api = tw.API(auth, wait_on_rate_limit=True)
#client = tw.Client(b_t, c_k, c_s, a_t, a_t_s, wait_on_rate_limit=True); # client = tw.Client(b_t, c_k, c_s, a_t, a_t_s, wait_on_rate_limit=True);
return api return api
def search_repo_conditions(repository_id): def search_repo_conditions(repository_id):
api = authenticate() api = authenticate()
geocode="44.3591600,11.7132000,20km" geocode = "44.3591600,11.7132000,20km"
repo = Repository.query.filter_by(id=repository_id).first() repo = Repository.query.filter_by(id=repository_id).first()
if(repo == None): if repo is None:
print("Non esiste una repository con questo id") print("Non esiste una repository con questo id")
return False return False
conditions = [use for use in repo.conditions] conditions = [use for use in repo.conditions]
evaluation_mode = repo.evaluation_mode evaluation_mode = repo.evaluation_mode
conditions_type = dict() conditions_type = dict()
#Dividing condition into condition types # Dividing condition into condition types
for condition in conditions: for condition in conditions:
# print(condition.id) # print(condition.id)
if condition.type not in conditions_type.keys(): if condition.type not in conditions_type.keys():
conditions_type[condition.type]=[condition.content] conditions_type[condition.type] = [condition.content]
else: else:
conditions_type[condition.type].append(condition.content) conditions_type[condition.type].append(condition.content)
@ -55,15 +52,15 @@ def search_repo_conditions(repository_id):
queryString += ("#" + condition_content + " " + queryConjunction + " ") queryString += ("#" + condition_content + " " + queryConjunction + " ")
if ConditionType.coordinates in conditions_type.keys(): if ConditionType.coordinates in conditions_type.keys():
if evaluation_mode == ConditionMode.all_and: if evaluation_mode == ConditionMode.all_and:
if len(conditions_type[ConditionType.coordinates])==1: if len(conditions_type[ConditionType.coordinates]) == 1:
coordinates_tweet = conditions_type[ConditionType.coordinates][0].split() coordinates_tweet = conditions_type[ConditionType.coordinates][0].split()
coordinates_string = coordinates_tweet[2]+","+coordinates_tweet[3]+","+coordinates_tweet[1]+"km" coordinates_string = coordinates_tweet[2] + "," + coordinates_tweet[3] + "," + str(float(coordinates_tweet[1])/1000) + "km"
else: else:
return None return None
elif evaluation_mode == ConditionMode.all_or: elif evaluation_mode == ConditionMode.all_or:
for condition_content in conditions_type[ConditionType.coordinates]: for condition_content in conditions_type[ConditionType.coordinates]:
coordinates_tweet = condition_content.split() coordinates_tweet = condition_content.split()
coordinates_string = coordinates_tweet[2]+","+coordinates_tweet[3]+","+coordinates_tweet[1]+"km" coordinates_string = coordinates_tweet[2] + "," + coordinates_tweet[3] + "," + str(float(coordinates_tweet[1])/1000) + "km"
print(coordinates_string) print(coordinates_string)
for tweet in tw.Cursor(method=api.search, geocode=coordinates_string).items(10): for tweet in tw.Cursor(method=api.search, geocode=coordinates_string).items(10):
tweetsFound.append(tweet) tweetsFound.append(tweet)
@ -72,23 +69,25 @@ def search_repo_conditions(repository_id):
queryString += ("from:" + condition_content + " " + queryConjunction + " ") queryString += ("from:" + condition_content + " " + queryConjunction + " ")
if ConditionType.time in conditions_type.keys(): if ConditionType.time in conditions_type.keys():
for condition_content in conditions_type[ConditionType.time]: for condition_content in conditions_type[ConditionType.time]:
if condition_content[0]=='<': if condition_content[0] == '<':
queryString += ("until:" + condition_content + " " + queryConjunction + " ") queryString += ("until:" + condition_content + " " + queryConjunction + " ")
elif condition_content[0]=='>': elif condition_content[0] == '>':
queryString += ("since:" + condition_content + " " + queryConjunction + " ") queryString += ("since:" + condition_content + " " + queryConjunction + " ")
queryString = queryString[:-len(queryConjunction)-1] queryString = queryString[:-len(queryConjunction) - 1]
print(queryString) print(queryString)
if(evaluation_mode == ConditionMode.all_or): if evaluation_mode == ConditionMode.all_or:
for tweet in tw.Cursor(method=api.search, q=queryString).items(10): for tweet in tw.Cursor(method=api.search, q=queryString).items(10):
tweetsFound.append(tweet) tweetsFound.append(tweet)
print(tweet.user.name + ' : ' + tweet.text) print(tweet.user.name + ' : ' + tweet.text)
elif(evaluation_mode==ConditionMode.all_and): elif evaluation_mode == ConditionMode.all_and:
for tweet in tw.Cursor(method=api.search, q=queryString, geocode=coordinates_string).items(10): for tweet in tw.Cursor(method=api.search, q=queryString, geocode=coordinates_string).items(10):
tweetsFound.append(tweet) tweetsFound.append(tweet)
print(tweet.user.name + ' : ' + tweet.text) print(tweet.user.name + ' : ' + tweet.text)
for tweet in tweetsFound: for tweet in tweetsFound:
if not Tweet.query.filter_by(snowflake=str(tweet.id)).all(): if not Tweet.query.filter_by(snowflake=str(tweet.id)).all():
tweetDB = Tweet(snowflake=tweet.id, content=tweet.text, location=tweet.geo.coordinate.coordinates if tweet.geo is not None else "", insert_time=str(datetime.now())) tweetDB = Tweet(snowflake=tweet.id, content=tweet.text,
location=tweet.geo.coordinate.coordinates if tweet.geo is not None else "",
insert_time=str(datetime.now()))
ext.session.add(tweetDB) ext.session.add(tweetDB)
if not Composed.query.filter_by(snowflake=str(tweet.id), rid=repository_id).all(): if not Composed.query.filter_by(snowflake=str(tweet.id), rid=repository_id).all():
composed = Composed(rid=repository_id, snowflake=tweet.id) composed = Composed(rid=repository_id, snowflake=tweet.id)
@ -98,7 +97,5 @@ def search_repo_conditions(repository_id):
if __name__ == "__main__": if __name__ == "__main__":
search_repo_conditions(16) search_repo_conditions(16)
#print(stopwords.words('italian'))
with app.app_context(): with app.app_context():
ext.create_all(app=app) ext.create_all(app=app)
#start_exploring()

View file

@ -8,6 +8,7 @@ import PageDashboard from "./routes/PageDashboard"
import PageRoot from "./routes/PageRoot" import PageRoot from "./routes/PageRoot"
import PageEdit from "./routes/PageEdit" import PageEdit from "./routes/PageEdit"
import PageUsers from "./routes/PageUsers" import PageUsers from "./routes/PageUsers"
import PageRepository from "./routes/PageRepository"
export default function PageSwitcher({ ...props }) { export default function PageSwitcher({ ...props }) {
@ -16,6 +17,9 @@ export default function PageSwitcher({ ...props }) {
<Route path={"/repositories/:id/edit"} exact={true}> <Route path={"/repositories/:id/edit"} exact={true}>
<PageEdit/> <PageEdit/>
</Route> </Route>
<Route path={"/repositories/:id"} exact={true}>
<PageRepository/>
</Route>
<Route path={"/login"} exact={true}> <Route path={"/login"} exact={true}>
<PageLogin/> <PageLogin/>
</Route> </Route>

View file

@ -16,7 +16,7 @@
} }
.Left { .Left {
width: 250px; width: 280px;
height: 60px; height: 60px;
display: grid; display: grid;
@ -97,7 +97,7 @@
} }
.Right { .Right {
width: 250px; width: 280px;
height: 60px; height: 60px;
padding: 5px; padding: 5px;

View file

@ -50,7 +50,7 @@ export default function BoxRepositoriesActive({
} }
return ( return (
<BoxFullScrollable header={"Le tue repository attive"} {...props}> <BoxFullScrollable header={"Repository attivi"} {...props}>
{contents} {contents}
</BoxFullScrollable> </BoxFullScrollable>
) )

View file

@ -50,7 +50,7 @@ export default function BoxRepositoriesArchived({
} }
return ( return (
<BoxFullScrollable header={"Le tue repository archiviate"} {...props}> <BoxFullScrollable header={"Repository archiviati"} {...props}>
{contents} {contents}
</BoxFullScrollable> </BoxFullScrollable>
) )

View file

@ -41,7 +41,7 @@ export default function BoxRepositoryCreate({ ...props }) {
save() save()
}} }}
> >
<FormLabel htmlFor={"repo-name"} text={"Nome della repository"}> <FormLabel htmlFor={"repo-name"} text={"Nome repository"}>
<InputWithIcon <InputWithIcon
id={"repo-name"} id={"repo-name"}
icon={faFolder} icon={faFolder}
@ -49,14 +49,14 @@ export default function BoxRepositoryCreate({ ...props }) {
onChange={e => setName(e.target.value)} onChange={e => setName(e.target.value)}
/> />
</FormLabel> </FormLabel>
<FormLabel htmlFor={"filter-mode"} text={"Aggiutngi tweet se soddisfano:"}> <FormLabel htmlFor={"filter-mode"} text={"Richiedi"}>
<label> <label>
<Radio <Radio
name={"filter-mode"} name={"filter-mode"}
onChange={() => setEvaluationMode(0)} onChange={() => setEvaluationMode(0)}
checked={evaluationMode === 0} checked={evaluationMode === 0}
/> />
Un filtro Almeno una cond.
</label> </label>
&nbsp; &nbsp;
<label> <label>
@ -65,7 +65,7 @@ export default function BoxRepositoryCreate({ ...props }) {
onChange={() => setEvaluationMode(1)} onChange={() => setEvaluationMode(1)}
checked={evaluationMode === 1} checked={evaluationMode === 1}
/> />
Tutti i filtri Tutte le cond.
</label> </label>
</FormLabel> </FormLabel>
{error ? {error ?
@ -81,7 +81,7 @@ export default function BoxRepositoryCreate({ ...props }) {
color={"Red"} color={"Red"}
onClick={() => revert()} onClick={() => revert()}
> >
Rollback edits Annulla modifiche
</Button> </Button>
<Button <Button
style={{ "gridColumn": "2" }} style={{ "gridColumn": "2" }}
@ -89,7 +89,7 @@ export default function BoxRepositoryCreate({ ...props }) {
color={"Green"} color={"Green"}
onClick={_ => goToOnSuccess(save, history, "/repositories")()} onClick={_ => goToOnSuccess(save, history, "/repositories")()}
> >
Save changes Salva modifiche
</Button> </Button>
</> </>
: :

View file

@ -0,0 +1,33 @@
import React from "react"
import BoxFull from "../base/BoxFull"
import ReactWordcloud from "react-wordcloud"
/**
* A Box which displays a wordcloud.
*
* @param words - A list of word objects, made of a string "text" and a number "value"
* @param props - Additional props to pass to the box.
* @returns {JSX.Element}
* @constructor
*/
export default function BoxWordcloud({ words, props }) {
return (
<BoxFull header={"Wordcloud"} {...props}>
<div style={{"width": "100%", "height": "100%"}}>
<ReactWordcloud
options={{
colors: [
"var(--fg-primary)",
],
fontFamily: "Bree Serif",
fontSizes: [12, 128],
size: undefined,
deterministic: true,
}}
words={words}
/>
</div>
</BoxFull>
)
}

View file

@ -22,7 +22,7 @@ export default function PageRepositories({ children, className, ...props }) {
} }
return {} return {}
}, },
[bv.apiRequest, bv.refreshResource], [bv],
) )
return ( return (

View file

@ -0,0 +1,13 @@
import React from "react"
import Style from "./PageRepository.module.css"
import classNames from "classnames"
import BoxWordcloud from "../components/interactive/BoxWordcloud"
export default function PageRepository({ className, ...props }) {
return (
<div className={classNames(Style.PageRepository, className)} {...props}>
<BoxWordcloud className={Style.Wordcloud}/>
</div>
)
}

View file

@ -0,0 +1,14 @@
.PageRepository {
display: grid;
grid-template-areas: "a";
grid-gap: 10px;
width: 100%;
height: 100%;
}
.Wordcloud {
grid-area: a;
}

13531
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -20,6 +20,7 @@
"react-router": "^5.2.0", "react-router": "^5.2.0",
"react-router-dom": "^5.2.0", "react-router-dom": "^5.2.0",
"react-scripts": "4.0.3", "react-scripts": "4.0.3",
"react-wordcloud": "github:Steffo99/react-wordcloud",
"serve": "^11.3.2", "serve": "^11.3.2",
"web-vitals": "^1.1.1" "web-vitals": "^1.1.1"
}, },

98
poetry.lock generated
View file

@ -119,20 +119,17 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[[package]] [[package]]
name = "click" name = "click"
version = "8.0.0" version = "7.1.2"
description = "Composable command line interface toolkit" description = "Composable command line interface toolkit"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[package.dependencies]
colorama = {version = "*", markers = "platform_system == \"Windows\""}
[[package]] [[package]]
name = "colorama" name = "colorama"
version = "0.4.4" version = "0.4.4"
description = "Cross-platform colored terminal text." description = "Cross-platform colored terminal text."
category = "main" category = "dev"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
@ -146,17 +143,17 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[[package]] [[package]]
name = "flask" name = "flask"
version = "1.1.2" version = "1.1.4"
description = "A simple framework for building complex web applications." description = "A simple framework for building complex web applications."
category = "main" category = "main"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[package.dependencies] [package.dependencies]
click = ">=5.1" click = ">=5.1,<8.0"
itsdangerous = ">=0.24" itsdangerous = ">=0.24,<2.0"
Jinja2 = ">=2.10.1" Jinja2 = ">=2.10.1,<3.0"
Werkzeug = ">=0.15" Werkzeug = ">=0.15,<2.0"
[package.extras] [package.extras]
dev = ["pytest", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet", "sphinx-issues"] dev = ["pytest", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet", "sphinx-issues"]
@ -276,25 +273,25 @@ six = "*"
[[package]] [[package]]
name = "itsdangerous" name = "itsdangerous"
version = "2.0.0" version = "1.1.0"
description = "Safely pass data to untrusted environments and back." description = "Various helpers to pass data to untrusted environments and back."
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[[package]] [[package]]
name = "jinja2" name = "jinja2"
version = "3.0.0" version = "2.11.3"
description = "A very fast and expressive template engine." description = "A very fast and expressive template engine."
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[package.dependencies] [package.dependencies]
MarkupSafe = ">=2.0.0rc2" MarkupSafe = ">=0.23"
[package.extras] [package.extras]
i18n = ["Babel (>=2.7)"] i18n = ["Babel (>=0.8)"]
[[package]] [[package]]
name = "joblib" name = "joblib"
@ -498,14 +495,6 @@ category = "main"
optional = false optional = false
python-versions = ">=3.5" python-versions = ">=3.5"
[[package]]
name = "pysocks"
version = "1.7.1"
description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information."
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[[package]] [[package]]
name = "pytest" name = "pytest"
version = "6.2.4" version = "6.2.4"
@ -563,7 +552,6 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
certifi = ">=2017.4.17" certifi = ">=2017.4.17"
chardet = ">=3.0.2,<5" chardet = ">=3.0.2,<5"
idna = ">=2.5,<3" idna = ">=2.5,<3"
PySocks = {version = ">=1.5.6,<1.5.7 || >1.5.7", optional = true, markers = "extra == \"socks\""}
urllib3 = ">=1.21.1,<1.27" urllib3 = ">=1.21.1,<1.27"
[package.extras] [package.extras]
@ -772,21 +760,28 @@ telegram = ["requests"]
[[package]] [[package]]
name = "tweepy" name = "tweepy"
version = "3.10.0" version = "4.0.0a0"
description = "Twitter library for Python" description = "Twitter library for Python"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" python-versions = ">=3.6"
develop = false
[package.dependencies] [package.dependencies]
requests = {version = ">=2.11.1", extras = ["socks"]} requests = ">=2.11.1,<3"
requests-oauthlib = ">=0.7.0" requests-oauthlib = ">=1.0.0,<2"
six = ">=1.10.0"
[package.extras] [package.extras]
dev = ["coveralls (>=1.8.2)", "tox (>=2.4.0)"] dev = ["coveralls (>=2.1.0)", "tox (>=2.4.0)"]
socks = ["requests[socks] (>=2.11.1,<3)"]
test = ["mock (>=1.0.1)", "nose (>=1.3.3)", "vcrpy (>=1.10.3)"] test = ["mock (>=1.0.1)", "nose (>=1.3.3)", "vcrpy (>=1.10.3)"]
[package.source]
type = "git"
url = "https://github.com/tweepy/tweepy.git"
reference = "master"
resolved_reference = "69f1a58dceb0cd607f124ad25d3cfd879f6d5f39"
[[package]] [[package]]
name = "urllib3" name = "urllib3"
version = "1.26.4" version = "1.26.4"
@ -802,19 +797,20 @@ brotli = ["brotlipy (>=0.6.0)"]
[[package]] [[package]]
name = "werkzeug" name = "werkzeug"
version = "2.0.0" version = "1.0.1"
description = "The comprehensive WSGI web application library." description = "The comprehensive WSGI web application library."
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[package.extras] [package.extras]
dev = ["pytest", "pytest-timeout", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinx-issues"]
watchdog = ["watchdog"] watchdog = ["watchdog"]
[metadata] [metadata]
lock-version = "1.1" lock-version = "1.1"
python-versions = "^3.8.5" python-versions = "^3.8.5"
content-hash = "1ac47344a839aae5a929d7ce9914f62c76c1a591bc88dabb819fe15814f40031" content-hash = "ce716a14534bfcf41e82944d3eabf4cbeb743303f2c1a21e8360f802d89598d1"
[metadata.files] [metadata.files]
alabaster = [ alabaster = [
@ -898,8 +894,8 @@ chardet = [
{file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"},
] ]
click = [ click = [
{file = "click-8.0.0-py3-none-any.whl", hash = "sha256:e90e62ced43dc8105fb9a26d62f0d9340b5c8db053a814e25d95c19873ae87db"}, {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"},
{file = "click-8.0.0.tar.gz", hash = "sha256:7d8c289ee437bcb0316820ccee14aefcb056e58d31830ecab8e47eda6540e136"}, {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"},
] ]
colorama = [ colorama = [
{file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
@ -910,8 +906,8 @@ docutils = [
{file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"},
] ]
flask = [ flask = [
{file = "Flask-1.1.2-py2.py3-none-any.whl", hash = "sha256:8a4fdd8936eba2512e9c85df320a37e694c93945b33ef33c89946a340a238557"}, {file = "Flask-1.1.4-py2.py3-none-any.whl", hash = "sha256:c34f04500f2cbbea882b1acb02002ad6fe6b7ffa64a6164577995657f50aed22"},
{file = "Flask-1.1.2.tar.gz", hash = "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060"}, {file = "Flask-1.1.4.tar.gz", hash = "sha256:0fbeb6180d383a9186d0d6ed954e0042ad9f18e0e8de088b2b419d526927d196"},
] ]
flask-cors = [ flask-cors = [
{file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"}, {file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"},
@ -1000,12 +996,12 @@ isodate = [
{file = "isodate-0.6.0.tar.gz", hash = "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8"}, {file = "isodate-0.6.0.tar.gz", hash = "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8"},
] ]
itsdangerous = [ itsdangerous = [
{file = "itsdangerous-2.0.0-py3-none-any.whl", hash = "sha256:e2cb4ae918f07ab2a2f9a91dec2695bd1f25a19d31861a70015ad537ccb5e807"}, {file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"},
{file = "itsdangerous-2.0.0.tar.gz", hash = "sha256:99b1053ccce68066dfc0b4465ef8779027e6d577377c8270e21a3d6289cac111"}, {file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"},
] ]
jinja2 = [ jinja2 = [
{file = "Jinja2-3.0.0-py3-none-any.whl", hash = "sha256:2f2de5285cf37f33d33ecd4a9080b75c87cd0c1994d5a9c6df17131ea1f049c6"}, {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"},
{file = "Jinja2-3.0.0.tar.gz", hash = "sha256:ea8d7dd814ce9df6de6a761ec7f1cac98afe305b8cdc4aaae4e114b8d8ce24c5"}, {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"},
] ]
joblib = [ joblib = [
{file = "joblib-1.0.1-py3-none-any.whl", hash = "sha256:feeb1ec69c4d45129954f1b7034954241eedfd6ba39b5e9e4b6883be3332d5e5"}, {file = "joblib-1.0.1-py3-none-any.whl", hash = "sha256:feeb1ec69c4d45129954f1b7034954241eedfd6ba39b5e9e4b6883be3332d5e5"},
@ -1141,11 +1137,6 @@ pyparsing = [
pyrsistent = [ pyrsistent = [
{file = "pyrsistent-0.17.3.tar.gz", hash = "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e"}, {file = "pyrsistent-0.17.3.tar.gz", hash = "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e"},
] ]
pysocks = [
{file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"},
{file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"},
{file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"},
]
pytest = [ pytest = [
{file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"},
{file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"},
@ -1317,15 +1308,12 @@ tqdm = [
{file = "tqdm-4.60.0-py2.py3-none-any.whl", hash = "sha256:daec693491c52e9498632dfbe9ccfc4882a557f5fa08982db1b4d3adbe0887c3"}, {file = "tqdm-4.60.0-py2.py3-none-any.whl", hash = "sha256:daec693491c52e9498632dfbe9ccfc4882a557f5fa08982db1b4d3adbe0887c3"},
{file = "tqdm-4.60.0.tar.gz", hash = "sha256:ebdebdb95e3477ceea267decfc0784859aa3df3e27e22d23b83e9b272bf157ae"}, {file = "tqdm-4.60.0.tar.gz", hash = "sha256:ebdebdb95e3477ceea267decfc0784859aa3df3e27e22d23b83e9b272bf157ae"},
] ]
tweepy = [ tweepy = []
{file = "tweepy-3.10.0-py2.py3-none-any.whl", hash = "sha256:5e22003441a11f6f4c2ea4d05ec5532f541e9f5d874c3908270f0c28e649b53a"},
{file = "tweepy-3.10.0.tar.gz", hash = "sha256:76e6954b806ca470dda877f57db8792fff06a0beba0ed43efc3805771e39f06a"},
]
urllib3 = [ urllib3 = [
{file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"}, {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"},
{file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"}, {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"},
] ]
werkzeug = [ werkzeug = [
{file = "Werkzeug-2.0.0-py3-none-any.whl", hash = "sha256:64c02f6495ba01eddd6625b3675f357cd358a73f1e38458a56ad86c5baa30b53"}, {file = "Werkzeug-1.0.1-py2.py3-none-any.whl", hash = "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43"},
{file = "Werkzeug-2.0.0.tar.gz", hash = "sha256:3389bbfe6d40c6dd25e6d3f974155163c8b3de5bbda6a89342d4ab93fae80ba0"}, {file = "Werkzeug-1.0.1.tar.gz", hash = "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c"},
] ]

View file

@ -30,9 +30,9 @@ apispec-webframeworks = "^0.5.2"
marshmallow = "^3.11.1" marshmallow = "^3.11.1"
openapi-spec-validator = "^0.3.0" openapi-spec-validator = "^0.3.0"
flask-swagger-ui = "^3.36.0" flask-swagger-ui = "^3.36.0"
tweepy = "^3.10.0"
nltk = "^3.6.2" nltk = "^3.6.2"
gunicorn = "^20.1.0" gunicorn = "^20.1.0"
tweepy = {git = "https://github.com/tweepy/tweepy.git"}
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
pytest = "^6.2.3" pytest = "^6.2.3"