1
0

worked on phab and wiki activity data collection

This commit is contained in:
Matthew Gaughan 2025-01-03 19:54:07 -06:00
parent ab771e25b7
commit 60dfe7e0a2
5 changed files with 413 additions and 116 deletions

View File

@ -0,0 +1,266 @@
import requests
import bz2
import shutil
import os
import concurrent.futures
YEARLY_PROJECTS = [
"dewiki", "frwiki", "eswiki", "itwiki", "ruwiki", "jawiki", "viwiki", "zhwiki",
"ptwiki", "enwiktionary", "plwiki", "nlwiki", "svwiki", "metawiki", "arwiki",
"shwiki", "cebwiki", "mgwiktionary", "fawiki", "frwiktionary", "ukwiki",
"hewiki", "kowiki", "srwiki", "trwiki", "loginwiki", "huwiki", "cawiki",
"nowiki", "mediawikiwiki", "fiwiki", "cswiki", "idwiki", "rowiki", "enwikisource",
"frwikisource", "ruwiktionary", "dawiki", "bgwiki", "incubatorwiki",
"enwikinews", "specieswiki", "thwiki"
]
MONTHLY_PROJECTS = ["wikidatawiki", "commonswiki", "enwiki"]
ALL_PROJECTS = [
"aawiki", "aawikibooks", "aawiktionary", "abwiki", "abwiktionary", "acewiki",
"adywiki", "aewikimedia", "afwiki", "afwikibooks", "afwikiquote", "afwiktionary",
"akwiki", "akwikibooks", "akwiktionary", "alswiki", "altwiki", "amiwiki",
"amwiki", "amwikimedia", "amwikiquote", "amwiktionary", "angwiki", "angwikibooks",
"angwikiquote", "angwikisource", "angwiktionary", "anpwiki", "anwiki",
"anwiktionary", "arcwiki", "arwiki", "arwikibooks", "arwikimedia", "arwikinews",
"arwikiquote", "arwikisource", "arwikiversity", "arwiktionary", "arywiki",
"arzwiki", "astwiki", "astwikibooks", "astwikiquote", "astwiktionary", "aswiki",
"aswikibooks", "aswikiquote", "aswikisource", "aswiktionary", "atjwiki",
"avkwiki", "avwiki", "avwiktionary", "awawiki", "aywiki", "aywikibooks",
"aywiktionary", "azbwiki", "azwiki", "azwikibooks", "azwikiquote", "azwikisource",
"azwiktionary", "banwiki", "banwikisource", "barwiki", "bat_smgwiki", "bawiki",
"bawikibooks", "bbcwiki", "bclwiki", "bclwikiquote", "bclwiktionary", "bdwikimedia",
"be_x_oldwiki", "betawikiversity", "bewiki", "bewikibooks", "bewikimedia",
"bewikiquote", "bewikisource", "bewiktionary", "bewwiki", "bgwiki", "bgwikibooks",
"bgwikinews", "bgwikiquote", "bgwikisource", "bgwiktionary", "bhwiki",
"bhwiktionary", "biwiki", "biwikibooks", "biwiktionary", "bjnwiki",
"bjnwikiquote", "bjnwiktionary", "blkwiki", "blkwiktionary", "bmwiki",
"bmwikibooks", "bmwikiquote", "bmwiktionary", "bnwiki", "bnwikibooks", "bnwikiquote",
"bnwikisource", "bnwikivoyage", "bnwiktionary", "bowiki", "bowikibooks",
"bowiktionary", "bpywiki", "brwiki", "brwikimedia", "brwikiquote", "brwikisource",
"brwiktionary", "bswiki", "bswikibooks", "bswikinews", "bswikiquote",
"bswikisource", "bswiktionary", "btmwiki", "btmwiktionary", "bugwiki",
"bxrwiki", "cawiki", "cawikibooks", "cawikimedia", "cawikinews", "cawikiquote",
"cawikisource", "cawiktionary", "cbk_zamwiki", "cdowiki", "cebwiki",
"cewiki", "chowiki", "chrwiki", "chrwiktionary", "chwiki", "chwikibooks",
"chwiktionary", "chywiki", "ckbwiki", "ckbwiktionary", "cnwikimedia", "commonswiki",
"cowiki", "cowikibooks", "cowikimedia", "cowikiquote", "cowiktionary",
"crhwiki", "crwiki", "crwikiquote", "crwiktionary", "csbwiki", "csbwiktionary",
"cswiki", "cswikibooks", "cswikinews", "cswikiquote", "cswikisource", "cswikiversity",
"cswikivoyage", "cswiktionary", "cuwiki", "cvwiki", "cvwikibooks", "cywiki",
"cywikibooks", "cywikiquote", "cywikisource", "cywiktionary", "dagwiki",
"dawiki", "dawikibooks", "dawikiquote", "dawikisource", "dawiktionary",
"dewiki", "dewikibooks", "dewikinews", "dewikiquote", "dewikisource",
"dewikiversity", "dewikivoyage", "dewiktionary", "dgawiki", "dinwiki", "diqwiki",
"diqwiktionary", "dkwikimedia", "donatewiki", "dsbwiki", "dtpwiki", "dtywiki",
"dvwiki", "dvwiktionary", "dzwiki", "dzwiktionary", "eewiki", "elwiki",
"elwikibooks", "elwikinews", "elwikiquote", "elwikisource", "elwikiversity",
"elwikivoyage", "elwiktionary", "emlwiki", "enwiki", "enwikibooks", "enwikinews",
"enwikiquote", "enwikisource", "enwikiversity", "enwikivoyage", "enwiktionary",
"eowiki", "eowikibooks", "eowikinews", "eowikiquote", "eowikisource", "eowikivoyage",
"eowiktionary", "eswiki", "eswikibooks", "eswikinews", "eswikiquote", "eswikisource",
"eswikiversity", "eswikivoyage", "eswiktionary", "etwiki", "etwikibooks",
"etwikimedia", "etwikiquote", "etwikisource", "etwiktionary", "euwiki", "euwikibooks",
"euwikiquote", "euwikisource", "euwiktionary", "extwiki", "fatwiki", "fawiki",
"fawikibooks", "fawikinews", "fawikiquote", "fawikisource", "fawikivoyage",
"fawiktionary", "ffwiki", "fiu_vrowiki", "fiwiki", "fiwikibooks", "fiwikimedia",
"fiwikinews", "fiwikiquote", "fiwikisource", "fiwikiversity", "fiwikivoyage",
"fiwiktionary", "fjwiki", "fjwiktionary", "fonwiki", "foundationwiki", "fowiki",
"fowikisource", "fowiktionary", "frpwiki", "frrwiki", "frwiki", "frwikibooks",
"frwikinews", "frwikiquote", "frwikisource", "frwikiversity", "frwikivoyage",
"frwiktionary", "furwiki", "fywiki", "fywikibooks", "fywiktionary", "gagwiki",
"ganwiki", "gawiki", "gawikibooks", "gawikiquote", "gawiktionary", "gcrwiki",
"gdwiki", "gdwiktionary", "glkwiki", "glwiki", "glwikibooks", "glwikiquote",
"glwikisource", "glwiktionary", "gnwiki", "gnwikibooks", "gnwiktionary",
"gomwiki", "gomwiktionary", "gorwiki", "gorwiktionary", "gotwiki", "gotwikibooks",
"gpewiki", "gucwiki", "gurwiki", "guwiki", "guwikibooks", "guwikiquote",
"guwikisource", "guwiktionary", "guwwiki", "guwwikinews", "guwwikiquote",
"guwwiktionary", "gvwiki", "gvwiktionary", "hakwiki", "hawiki", "hawiktionary",
"hawwiki", "hewiki", "hewikibooks", "hewikinews", "hewikiquote", "hewikisource",
"hewikivoyage", "hewiktionary", "hifwiki", "hifwiktionary", "hiwiki", "hiwikibooks",
"hiwikimedia", "hiwikiquote", "hiwikisource", "hiwikiversity", "hiwikivoyage",
"hiwiktionary", "howiki", "hrwiki", "hrwikibooks", "hrwikiquote", "hrwikisource",
"hrwiktionary", "hsbwiki", "hsbwiktionary", "htwiki", "htwikisource", "huwiki",
"huwikibooks", "huwikinews", "huwikiquote", "huwikisource", "huwiktionary",
"hywiki", "hywikibooks", "hywikiquote", "hywikisource", "hywiktionary",
"hywwiki", "hzwiki", "iawiki", "iawikibooks", "iawiktionary", "idwiki",
"idwikibooks", "idwikimedia", "idwikiquote", "idwikisource", "idwiktionary",
"iewiki", "iewikibooks", "iewiktionary", "iglwiki", "igwiki", "igwikiquote",
"igwiktionary", "iiwiki", "ikwiki", "ikwiktionary", "ilowiki", "incubatorwiki",
"inhwiki", "iowiki", "iowiktionary", "iswiki", "iswikibooks", "iswikiquote",
"iswikisource", "iswiktionary", "itwiki", "itwikibooks", "itwikinews",
"itwikiquote", "itwikisource", "itwikiversity", "itwikivoyage", "itwiktionary",
"iuwiki", "iuwiktionary", "jamwiki", "jawiki", "jawikibooks", "jawikinews",
"jawikiquote", "jawikisource", "jawikiversity", "jawikivoyage", "jawiktionary",
"jbowiki", "jbowiktionary", "jvwiki", "jvwikisource", "jvwiktionary",
"kaawiki", "kaawiktionary", "kabwiki", "kawiki", "kawikibooks", "kawikiquote",
"kawiktionary", "kbdwiki", "kbdwiktionary", "kbpwiki", "kcgwiki", "kcgwiktionary",
"kgwiki", "kiwiki", "kjwiki", "kkwiki", "kkwikibooks", "kkwikiquote", "kkwiktionary",
"klwiki", "klwiktionary", "kmwiki", "kmwikibooks", "kmwiktionary", "knwiki",
"knwikibooks", "knwikiquote", "knwikisource", "knwiktionary", "koiwiki",
"kowiki", "kowikibooks", "kowikinews", "kowikiquote", "kowikisource",
"kowikiversity", "kowiktionary", "krcwiki", "krwiki", "krwikiquote",
"kshwiki", "kswiki", "kswikibooks", "kswikiquote", "kswiktionary", "kuswiki",
"kuwiki", "kuwikibooks", "kuwikiquote", "kuwiktionary", "kvwiki", "kwwiki",
"kwwikiquote", "kwwiktionary", "kywiki", "kywikibooks", "kywikiquote",
"kywiktionary", "labswiki", "ladwiki", "lawiki", "lawikibooks", "lawikiquote",
"lawikisource", "lawiktionary", "lbewiki", "lbwiki", "lbwikibooks", "lbwikiquote",
"lbwiktionary", "lezwiki", "lfnwiki", "lgwiki", "lijwiki", "lijwikisource",
"liwiki", "liwikibooks", "liwikinews", "liwikiquote", "liwikisource", "liwiktionary",
"lldwiki", "lmowiki", "lmowiktionary", "lnwiki", "lnwikibooks", "lnwiktionary",
"loginwiki", "lowiki", "lowiktionary", "lrcwiki", "ltgwiki", "ltwiki",
"ltwikibooks", "ltwikiquote", "ltwikisource", "ltwiktionary", "lvwiki",
"lvwikibooks", "lvwiktionary", "madwiki", "maiwiki", "maiwikimedia", "map_bmswiki", "mdfwiki", "mediawikiwiki",
"metawiki", "mgwiki", "mgwikibooks", "mgwiktionary", "mhrwiki", "mhwiki",
"mhwiktionary", "minwiki", "minwiktionary", "miwiki", "miwikibooks", "miwiktionary",
"mkwiki", "mkwikibooks", "mkwikimedia", "mkwikisource", "mkwiktionary", "mlwiki",
"mlwikibooks", "mlwikiquote", "mlwikisource", "mlwiktionary", "mniwiki", "mniwiktionary",
"mnwiki", "mnwikibooks", "mnwiktionary", "mnwwiki", "mnwwiktionary", "mrjwiki",
"mrwiki", "mrwikibooks", "mrwikiquote", "mrwikisource", "mrwiktionary", "mswiki",
"mswikibooks", "mswikisource", "mswiktionary", "mtwiki", "mtwiktionary", "muswiki",
"mwlwiki", "mxwikimedia", "myvwiki", "mywiki", "mywikibooks", "mywiktionary",
"mznwiki", "nahwiki", "nahwikibooks", "nahwiktionary", "napwiki", "napwikisource",
"nawiki", "nawikibooks", "nawikiquote", "nawiktionary", "nds_nlwiki", "ndswiki",
"ndswikibooks", "ndswikiquote", "ndswiktionary", "newiki", "newikibooks",
"newiktionary", "newwiki", "ngwiki", "niawiki", "niawiktionary", "nlwiki",
"nlwikibooks", "nlwikimedia", "nlwikinews", "nlwikiquote", "nlwikisource",
"nlwikivoyage", "nlwiktionary", "nnwiki", "nnwikiquote", "nnwiktionary",
"nostalgiawiki", "novwiki", "nowiki", "nowikibooks", "nowikimedia", "nowikinews",
"nowikiquote", "nowikisource", "nowiktionary", "nqowiki", "nrmwiki", "nsowiki",
"nvwiki", "nycwikimedia", "nywiki", "nzwikimedia", "ocwiki", "ocwikibooks",
"ocwiktionary", "olowiki", "omwiki", "omwiktionary", "orwiki", "orwikisource",
"orwiktionary", "oswiki", "outreachwiki", "pagwiki", "pamwiki", "papwiki",
"pawiki", "pawikibooks", "pawikisource", "pawiktionary", "pcdwiki", "pcmwiki",
"pdcwiki", "pflwiki", "pihwiki", "piwiki", "piwiktionary", "plwiki", "plwikibooks",
"plwikimedia", "plwikinews", "plwikiquote", "plwikisource", "plwikivoyage",
"plwiktionary", "pmswiki", "pmswikisource", "pnbwiki", "pnbwiktionary", "pntwiki",
"pswiki", "pswikibooks", "pswikivoyage", "pswiktionary", "ptwiki", "ptwikibooks",
"ptwikimedia", "ptwikinews", "ptwikiquote", "ptwikisource", "ptwikiversity",
"ptwikivoyage", "ptwiktionary", "pwnwiki", "quwiki", "quwikibooks", "quwikiquote",
"quwiktionary", "rmwiki", "rmwikibooks", "rmwiktionary", "rmywiki", "rnwiki",
"rnwiktionary", "roa_rupwiki", "roa_rupwiktionary", "roa_tarawiki", "rowiki",
"rowikibooks", "rowikinews", "rowikiquote", "rowikisource", "rowikivoyage",
"rowiktionary", "rswikimedia", "ruewiki", "ruwiki", "ruwikibooks", "ruwikimedia",
"ruwikinews", "ruwikiquote", "ruwikisource", "ruwikiversity", "ruwikivoyage",
"ruwiktionary", "rwwiki", "rwwiktionary", "sahwiki", "sahwikiquote", "sahwikisource",
"satwiki", "sawiki", "sawikibooks", "sawikiquote", "sawikisource", "sawiktionary",
"scnwiki", "scnwiktionary", "scowiki", "scwiki", "scwiktionary", "sdwiki",
"sdwikinews", "sdwiktionary", "sewiki", "sewikibooks", "sewikimedia", "sgwiki",
"sgwiktionary", "shiwiki", "shnwiki", "shnwikibooks", "shnwikivoyage",
"shnwiktionary", "shwiki", "shwiktionary", "shywiktionary", "simplewiki",
"simplewikibooks", "simplewikiquote", "simplewiktionary", "siwiki", "siwikibooks",
"siwiktionary", "skrwiki", "skrwiktionary", "skwiki", "skwikibooks", "skwikiquote",
"skwikisource", "skwiktionary", "slwiki", "slwikibooks", "slwikiquote",
"slwikisource", "slwikiversity", "slwiktionary", "smnwiki", "smwiki", "smwiktionary",
"snwiki", "snwiktionary", "sourceswiki", "sowiki", "sowiktionary", "specieswiki",
"sqwiki", "sqwikibooks", "sqwikinews", "sqwikiquote", "sqwiktionary", "srnwiki",
"srwiki", "srwikibooks", "srwikinews", "srwikiquote", "srwikisource", "srwiktionary",
"sswiki", "sswiktionary", "stqwiki", "stwiki", "stwiktionary", "suwiki",
"suwikibooks", "suwikiquote", "suwikisource", "suwiktionary", "svwiki",
"svwikibooks", "svwikinews", "svwikiquote", "svwikisource", "svwikiversity",
"svwikivoyage", "svwiktionary", "swwiki", "swwikibooks", "swwiktionary",
"szlwiki", "szywiki", "tawiki", "tawikibooks", "tawikinews", "tawikiquote",
"tawikisource", "tawiktionary", "taywiki", "tcywiki", "tenwiki", "test2wiki",
"testwiki", "testwikidatawiki", "tetwiki", "tewiki", "tewikibooks", "tewikiquote",
"tewikisource", "tewiktionary", "tgwiki", "tgwikibooks", "tgwiktionary",
"thwiki", "thwikibooks", "thwikinews", "thwikiquote", "thwikisource", "thwiktionary",
"tiwiki", "tiwiktionary", "tkwiki", "tkwikibooks", "tkwikiquote", "tkwiktionary",
"tlwiki", "tlwikibooks", "tlwikiquote", "tlwiktionary", "tlywiki", "tnwiki",
"tnwiktionary", "towiki", "towiktionary", "tpiwiki", "tpiwiktionary", "trvwiki",
"trwiki", "trwikibooks", "trwikimedia", "trwikinews", "trwikiquote", "trwikisource",
"trwikivoyage", "trwiktionary", "tswiki", "tswiktionary", "ttwiki", "ttwikibooks",
"ttwikiquote", "ttwiktionary", "tumwiki", "twwiki", "twwiktionary", "tyvwiki",
"tywiki", "uawikimedia", "udmwiki", "ugwiki", "ugwikibooks", "ugwikiquote",
"ugwiktionary", "ukwiki", "ukwikibooks", "ukwikinews", "ukwikiquote", "ukwikisource",
"ukwikivoyage", "ukwiktionary", "urwiki", "urwikibooks", "urwikiquote", "urwiktionary",
"uzwiki", "uzwikibooks", "uzwikiquote", "uzwiktionary", "vecwiki", "vecwikisource",
"vecwiktionary", "vepwiki", "vewiki", "viwiki", "viwikibooks", "viwikiquote",
"viwikisource", "viwikivoyage", "viwiktionary", "vlswiki", "votewiki", "vowiki",
"vowikibooks", "vowikiquote", "vowiktionary", "warwiki", "wawiki", "wawikibooks",
"wawikisource", "wawiktionary", "wbwikimedia", "wikidatawiki", "wikifunctionswiki",
"wikimania2015wiki", "wikimania2016wiki", "wikimania2017wiki", "wowiki",
"wowikiquote", "wowiktionary", "wuuwiki", "xalwiki", "xhwiki", "xhwikibooks",
"xhwiktionary", "xmfwiki", "yiwiki", "yiwikisource", "yiwiktionary", "yowiki",
"yowikibooks", "yowiktionary", "yuewiktionary", "zawiki", "zawikibooks", "zawikiquote",
"zawiktionary", "zeawiki", "zghwiki", "zh_classicalwiki", "zh_min_nanwiki",
"zh_min_nanwikibooks", "zh_min_nanwikiquote", "zh_min_nanwikisource", "zh_min_nanwiktionary",
"zh_yuewiki", "zhwiki", "zhwikibooks", "zhwikinews", "zhwikiquote", "zhwikisource",
"zhwikiversity", "zhwikivoyage", "zhwiktionary", "zuwiki", "zuwikibooks", "zuwiktionary"
]
DUMP = "2024-11"
test_url = f"https://dumps.wikimedia.org/other/mediawiki_history/{DUMP}/aawiki/{DUMP}.aawiki.all-time.tsv.bz2"
DUMP_LOC_PREFIX = f"https://dumps.wikimedia.org/other/mediawiki_history/{DUMP}/"
FILE_LOC_PREFIX = "/data/users/mgaughan/mw-repo-lifecycles/wiki_activity_data/"
YEARS = ['2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024']
def download_file(url):
response = requests.get(url)
if "content-disposition" in response.headers:
content_disposition = response.headers["content-disposition"]
filename = FILE_LOC_PREFIX + content_disposition.split("filename=")[1]
else:
filename = FILE_LOC_PREFIX + url.split("/")[-1]
with open(filename, mode="wb") as file:
file.write(response.content)
print(f"Downloaded file {filename}")
return filename
def decompress(filepath):
decompressed_filepath = filepath[:-4]
with bz2.BZ2File(filepath) as fr, open(decompressed_filepath,"wb") as fw:
shutil.copyfileobj(fr,fw)
print(f"Decompressed {decompressed_filepath}")
#os.remove(filepath)
print(f"Deleted {filepath}")
def batch_parallel_for_yearly():
urls = []
for entry in YEARLY_PROJECTS:
for year in YEARS:
urls.append(f"{DUMP_LOC_PREFIX}{entry}/{DUMP}.{entry}.{year}.tsv.bz2")
def batch_parallel_for_single():
urls = []
for entry in ALL_PROJECTS:
if entry not in YEARLY_PROJECTS and entry not in MONTHLY_PROJECTS:
urls.append(f"{DUMP_LOC_PREFIX}{entry}/{DUMP}.{entry}.all-time.tsv.bz2")
for url in urls:
download_file(url)
'''
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
future_to_filepath = {executor.submit(download_file, url): url for url in urls}
for future in concurrent.futures.as_completed(future_to_filepath):
filepath = future_to_filepath[future]
try:
data = future
except KeyboardInterrupt:
print("Keyboard interrupt received, shutting down executor")
executor.shutdown(wait=False, cancel_futures=True)
except Exception as exc:
print('generated an exception: %s' % (exc))
'''
def decompress_directory(directory_name):
# Traverse the directory
for root, dirs, files in os.walk(directory_name):
for file in files:
if file.endswith('.bz2'):
# Full path to the file
filepath = os.path.join(root, file)
print(filepath)
# Apply the decompress function
decompress(filepath)
if __name__ == "__main__":
batch_parallel_for_single()
#decompress_directory(FILE_LOC_PREFIX)
#file = download_file(test_url)
#decompress("/data/users/mgaughan/mw-repo-lifecycles/wiki_activity_data/2024-11.zuwiktionary.all-time.tsv.bz2")

View File

@ -8,24 +8,27 @@ file_location = "/data/users/mgaughan/mw-repo-lifecycles/commit_data/"
repo_location = "/data/users/mgaughan/mw-repo-lifecycles/repo_artifacts/" repo_location = "/data/users/mgaughan/mw-repo-lifecycles/repo_artifacts/"
cst = datetime.timezone(datetime.timedelta(hours=-6)) cst = datetime.timezone(datetime.timedelta(hours=-6))
'''
repos = { repos = {
"core" : { "core" : {
"url": "https://gerrit.wikimedia.org/r/mediawiki/core", "url": "https://gerrit.wikimedia.org/r/mediawiki/core",
"from_date": datetime.datetime(2022, 9, 10, 00, 00, 00, tzinfo=cst), "from_date": datetime.datetime(2012, 1, 1, 00, 00, 00, tzinfo=cst),
"to_date": datetime.datetime(2022, 10, 10, 00, 00, 00, tzinfo=cst) "to_date": datetime.datetime(2014, 12, 31, 00, 00, 00, tzinfo=cst)
},
"parsoid" :{
"url": "https://gerrit.wikimedia.org/r/mediawiki/services/parsoid",
"from_date": datetime.datetime(2024, 6, 10, 00, 00, 00, tzinfo=cst),
"to_date": datetime.datetime(2024, 10, 10, 00, 00, 00, tzinfo=cst)
}, },
"visualeditor": { "visualeditor": {
"url": "https://gerrit.wikimedia.org/r/VisualEditor/VisualEditor", "url": "https://gerrit.wikimedia.org/r/VisualEditor/VisualEditor",
"from_date": datetime.datetime(2013, 5, 1, 00, 00, 00, tzinfo=cst), "from_date": datetime.datetime(2012, 1, 1, 00, 00, 00, tzinfo=cst),
"to_date": datetime.datetime(2013, 10, 10, 00, 00, 00, tzinfo=cst) "to_date": datetime.datetime(2013, 5, 1, 00, 00, 00, tzinfo=cst)
}
}
'''
repos = {
"visualeditor": {
"url": "https://gerrit.wikimedia.org/r/VisualEditor/VisualEditor",
"from_date": datetime.datetime(2012, 1, 1, 00, 00, 00, tzinfo=cst),
"to_date": datetime.datetime(2014, 12, 31, 00, 00, 00, tzinfo=cst)
} }
} }
for repo in repos.keys(): for repo in repos.keys():
print(repos[repo]) print(repos[repo])
print(repos[repo]['url']) print(repos[repo]['url'])

View File

@ -1,3 +0,0 @@
import os
import sys
import wget

File diff suppressed because one or more lines are too long

View File

@ -6,16 +6,8 @@ import pandas as pd
import requests import requests
import re import re
import datetime import datetime
import time
# phab=Phabricator("https://phabricator.wikimedia.org/")
tags = [
"VisualEditor",
"Parsoid"
]
#set phabricator api token
token = "api-wurg254ciq5uvfxlr4rszn5ynpy4"
api_base = 'https://phabricator.wikimedia.org/api/'
# the query task taken from MGerlach's notebook # the query task taken from MGerlach's notebook
def query_task_tag( def query_task_tag(
@ -23,8 +15,8 @@ def query_task_tag(
limit = 100, limit = 100,
ts1 = None, ts2 = None, ts1 = None, ts2 = None,
api_url_base = 'https://phabricator.wikimedia.org/api/maniphest.search', api_url_base = 'https://phabricator.wikimedia.org/api/maniphest.search',
api_token = "api-wurg254ciq5uvfxlr4rszn5ynpy4"', api_token = "api-wurg254ciq5uvfxlr4rszn5ynpy4",
sleep = 1, sleep = 10
): ):
''' '''
query all tasks tagged with specific tag query all tasks tagged with specific tag
@ -38,17 +30,18 @@ def query_task_tag(
RETURNS: RETURNS:
- list of dictionary. - list of dictionary.
''' '''
time.sleep(sleep)
to_query = 1 to_query = 1
after = None after = None
data = [] data = []
while to_query == 1: while to_query == 1:
time.sleep(sleep)
params = { params = {
'api.token' : api_token, 'api.token' : api_token,
'constraints[tags]':tag_term, ## term that task is tagged with 'constraints[query]':[tag_term], ## term that task is searched for with
#'constraints[projects]':["VisualEditor"], ## term that task is tagged with
'constraints[createdStart]':ts1, ## timestamp task creation (min) 'constraints[createdStart]':ts1, ## timestamp task creation (min)
'constraints[createdEnd]':ts2, ## timestamp task creation (max) 'constraints[createdEnd]':ts2, ## timestamp task creation (max)
'limit':limit, 'limit':limit,
@ -56,6 +49,58 @@ def query_task_tag(
"attachments[subscribers]":"true", "attachments[subscribers]":"true",
} }
response = requests.get( api_url_base, params=params)
print(response)
result = json.loads(response.text)['result']
print(result)
## the data
data_tmp = result['data']
data += data_tmp
## check if there are more results to query
cursor = result['cursor']
## if after == None, no more queries
if cursor['after'] == None:
to_query = 0
## if after != None, query next page by passing after-argument
else:
after = cursor['after']
return data
#also from MGerlach
def query_transactions_phid_task(
task_phid,
limit = 100,
api_url_base = 'https://phabricator.wikimedia.org/api/transaction.search',
api_token = 'api-grocgdq2767cx6v5ywckkjmetx2f',
sleep = 10,
):
'''
query all transactions for a task (task_phid).
OPTIONAL:
- limit (int, default=100), number of results per query, cannot be larger than 100
- sleep (int, default = 0), sleep between each query
- api_url_base (str,) is the url for the api
- api_token (str, default=martins token),
RETURNS:
- list of dictionary.
'''
time.sleep(sleep)
to_query = 1
after = None
data = []
while to_query == 1:
time.sleep(sleep)
params = {
'api.token' : api_token,
'objectIdentifier':task_phid, ## task-phid
'limit':limit,
'after':after,
}
response = requests.get( api_url_base, params=params) response = requests.get( api_url_base, params=params)
result = json.loads(response.text)['result'] result = json.loads(response.text)['result']
@ -72,18 +117,29 @@ def query_task_tag(
after = cursor['after'] after = cursor['after']
return data return data
if __name__ == "__main__":
# phab=Phabricator("https://phabricator.wikimedia.org/")
tags = [
"VisualEditor",
"Parsoid"
]
#set phabricator api token
token = "api-wurg254ciq5uvfxlr4rszn5ynpy4"
api_base = 'https://phabricator.wikimedia.org/api/'
# for the search criteria of ve_ts1 = int(datetime.datetime.timestamp(datetime.datetime(2012, 1, 1, 0, 0, 0)))
# the umbrella tag VisualEditor ve_ts2 = int(datetime.datetime.timestamp(datetime.datetime(2014, 12, 31, 0, 0, 0)))
# open tasks
# closed tasks
# the umbrella tag of Parsoid?
# query ve_data = query_task_tag("VisualEditor", ts1=ve_ts1, ts2=ve_ts2)
# query for umbrella tag
# in a given womdpw pf to,e
# if open or closed
for entry in ve_data:
# then, for each task, task_id = entry['phid']
# collect the comments with them print(task_id)
transactions = query_transactions_phid_task(task_id)
comments = {}
for item in transactions:
comments[item['id']] = item['comments']
entry['task_comments'] = comments
DATA_PREFIX = "/data/users/mgaughan/mw-repo-lifecycles/phab_data/"
with open(DATA_PREFIX + "visualeditor/" + "2012_1_1_to_2014_12_31.json", "w") as outfile1:
json.dump(ve_data, outfile1)