Advertisement
Guest User

Untitled

a guest
Jan 19th, 2016
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.26 KB | None | 0 0
  1. """
  2. GitHub User Repository Language Analyzer
  3. Created By: Ben Reeves
  4. Date: January 8, 2015
  5. Description:
  6. This script uses the PyGithub library to access the Github API in order to perform some data analysis on a user's
  7. repositories. Specifically, it will analyze all of the user's code and calculate the percentage of code written in
  8. different programming languages.
  9. """
  10.  
  11. import operator
  12. from getpass import getpass
  13. from github import Github
  14. from github import GithubException
  15. from PyChart import PyChart
  16.  
  17. def sort_by_value(dictionary):
  18. """
  19. Sorts a dictionary by its values (not its keys)
  20. :param dictionary: The dictionary we want to sort
  21. :return: A list of 2-tuples sorted by their second values
  22. """
  23. return sorted(dictionary.items(), key=operator.itemgetter(1))
  24.  
  25. def sum_values(dictionary):
  26. """
  27. Sums up all the values in a dictionary (not the keys)
  28. :param dictionary: The dictionary we want to sum up
  29. :return: The sum of all the values from the dictionary
  30. """
  31. return sum(dictionary.values())
  32.  
  33.  
  34. print "Please login to your GitHub account."
  35. login = raw_input("Username: ")
  36. password = getpass("Password: ")
  37.  
  38. # Check to make sure they entered valid credentials
  39. gh = Github(login, password)
  40. try:
  41. gh.get_user().name
  42. except GithubException:
  43. print "Error: Authentication failed. Exiting..."
  44. exit(1)
  45.  
  46. # User can enter a valid GitHub username or enter nothing (if they enter nothing, we will use their account)
  47. username = raw_input("Enter a GitHub username you would like to invesigate: ")
  48. if username == '':
  49. username = login
  50.  
  51. # Check if they entered a valid username
  52. try:
  53. gh.get_user(username).name
  54. except GithubException:
  55. print "Error: No such user exists. Exiting..."
  56. exit(1)
  57.  
  58. print
  59. print "Cruncing data for user %s..." % username
  60. print
  61.  
  62. #----------------------------------
  63. # Perform the analysis
  64. #----------------------------------
  65.  
  66. # The GitHub API returns how many bytes of code are written in each language.
  67. percentages_per_repo = []
  68. total_bytes_per_repo = []
  69. primary_language_per_repo = []
  70.  
  71. # Go through all the user's public repositories
  72. for repo in gh.get_user(username).get_repos():
  73. if not repo.private:
  74. # If the repository has "None" as its primary language, don't include it
  75. if repo.language:
  76. print "Found repo: %s - %s" % (repo.name, repo.language)
  77. # Get the primary language for that repo
  78. primary_language_per_repo.append(repo.language)
  79. # Get the number of bytes used in each language
  80. languages = repo.get_languages()
  81. # Figure out what percent of the repo is each language
  82. percentages_in_this_repo = {}
  83. total_num_bytes = sum_values(languages)
  84. for language in languages:
  85. num_bytes = languages[language]
  86. percentage = float(num_bytes) / total_num_bytes
  87. percentages_in_this_repo[language] = percentage
  88. percentages_per_repo.append(percentages_in_this_repo)
  89.  
  90. ### print percentages_per_repo
  91.  
  92. # Add up all the percentages from each repo
  93. percentages_per_language = {}
  94. for repo_percentages in percentages_per_repo:
  95. for language in repo_percentages:
  96. language_percentage = repo_percentages[language]
  97. if language in percentages_per_language:
  98. percentages_per_language[language] += language_percentage
  99. else:
  100. percentages_per_language[language] = language_percentage
  101.  
  102. ### print percentages_per_language
  103.  
  104. # Normalize the percentages so they sum to 100
  105. pie_chart_data = {}
  106. total_of_percentages = sum_values(percentages_per_language)
  107. ### print total_of_percentages
  108. for language in percentages_per_language:
  109. percentage = percentages_per_language[language]
  110. normalized_percentage = float(percentage) / total_of_percentages * 100
  111. # Remove data less than 1.0%
  112. if normalized_percentage >= 1.0:
  113. pie_chart_data[language] = normalized_percentage
  114.  
  115. pie_chart_data = sort_by_value(pie_chart_data)
  116. pie_chart_data.reverse()
  117.  
  118. # Print out the results
  119. print
  120. print "Data has been crunched. Here's what's up with %s's repositories:" % username
  121. print
  122. for language, percentage in pie_chart_data:
  123. print "%s: %.2f%%" % (language, percentage)
  124.  
  125. # Draw a pie chart for the data
  126. username.capitalize()
  127. pie_chart = PyChart(pie_chart_data)
  128. pie_chart.draw()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement