Пример #1
0
 def test_findAll_matchValue_1(self):
     _expected_results = [3]
     expected_results = JSONSoup()
     expected_results.load_obj(_expected_results)
     partial_results = self.soup.findAll({"u": 1})
     results = partial_results.matchKey("x")
     self.assertEqual(results, expected_results)
Пример #2
0
 def test_matchValue_1(self):
     _expected_results = [{"e": 4, "g": 5}, {"e": 4, "d": 5}]
     _expected_results.sort()
     expected_results = JSONSoup()
     expected_results.load_obj(_expected_results)
     results = self.soup.matchValue(4)
     self.assertEqual(isinstance(results.children, list), True)
     results.children.sort()
     self.assertEqual(results, expected_results)
Пример #3
0
 def test_matchKey_3(self):
     alt_d = {"u": 1, "w": {"y": [5, 6], "x": 3, "z": 7}, "v": 2}
     alt_soup = JSONSoup()
     alt_soup.load_obj(alt_d)
     _expected_results = [3]
     expected_results = JSONSoup()
     expected_results.load_obj(_expected_results)
     self.assertEqual(alt_soup.matchKey("x"), expected_results)
Пример #4
0
 def setUp(self):
     self.d = {
         "a": 1,
         "k": {"b": {"e": 4, "d": 5}, "l": 1},
         "c": 3,
         "f": [0, 1, 2, 3, {"b": {"e": 4, "g": 5}}],
         "t": {"u": 1, "v": 2, "w": {"x": 3, "y": [5, 6], "z": 7}},
     }
     self.soup = JSONSoup()
     self.soup.load_obj(self.d)
Пример #5
0
 def loadProjectSoup(self, project_id):
   if self.project_id <> project_id or not hasattr(self, 'project_soup') or self.project_soup == None:
     self.project_id = project_id
     r = self.requestProjectDetails(project_id)
     self.project_soup = JSONSoup()
     self.project_soup.loads(r.text)
Пример #6
0
class PivotalScraper():
  def __init__(self):
    self.session = None
    self.project_id = None
  
  def reloadStories(self, project_id):
    self.stories = None
    self.loadStories(project_id)
  
  def loadStories(self, project_id):
    if not hasattr(self, 'stories') or self.stories == None:
      self.loadProjectSoup(project_id)
      stories = self.project_soup.matchKey('project').matchKey('stories')[0].get_raw()
      project_name = self.project_soup.matchKey('project').matchKey('name').get_raw()[0]
      self.loadAllEpics()
      self.loadAllLabels()  
      self.loadAllMembers()
      addProject = lambda x: self.addStatic('project_name', project_name, x)
      stories = map(addProject, stories)
      stories = map(self.epicsAndLabels_ID2String, stories)
      stories = map(self.requestedBy_ID2String, stories)
      stories = map(self.ownedBy_ID2String, stories)
      stories = map(self.tasks_format, stories)
      self.stories = {}
      self.stories.update([(story['id'], story) for story in stories])
  
  def login(self, username, password):
    authenticity_token = self.getAuthenticityToken()
    payload = {
      'authenticity_token': authenticity_token,
      'credentials[username]': username,
      'credentials[password]': password,
      'time_zone_offset': TIME_ZONE_OFFSET
    }
    
    r = requests.post("https://www.pivotaltracker.com/signin", verify=True, data=payload)
    self.session = {'t_session': r.cookies['t_session']}

  def getAuthenticityToken(self):
    r = requests.get("https://www.pivotaltracker.com/signin", verify=True)
    soup = BeautifulSoup(r.text)
    return soup.form.find(attrs={'name': 'authenticity_token'})['value']

  def get(self, url):
    if self.session <> None:
      r = requests.get(url, verify=True, cookies=self.session)
      return r
    else:
      return None
      
  def requestProjectDetails(self, project_id):
    return self.get('https://www.pivotaltracker.com/services/v5/projects/%s' % project_id)
  
  def reloadProjectSoup(self, project_id):
    self.project_soup = None
    self.loadProjectSoup(project_id)
  
  def loadProjectSoup(self, project_id):
    if self.project_id <> project_id or not hasattr(self, 'project_soup') or self.project_soup == None:
      self.project_id = project_id
      r = self.requestProjectDetails(project_id)
      self.project_soup = JSONSoup()
      self.project_soup.loads(r.text)
    
  def reloadAllEpics(self):
    self.all_epics = None
    self.loadAllEpics()
  
  def loadAllEpics(self):
    if not hasattr(self, 'all_epics') or self.all_epics == None:
      _epics = self.project_soup.matchKey('project').matchKey('epics')[0].get_raw()
      self.all_epics = {}
      for epic in _epics:
        self.all_epics.update({epic['label_id']: epic['name']})
    
  def reloadAllLabels(self):
    self.all_labels = None
    self.loadAllLables()
    
  def loadAllLabels(self):
    if not hasattr(self, 'all_labels') or self.all_labels == None:
      _labels = self.project_soup.matchKey('project').matchKey('labels')[0].get_raw()
      self.all_labels = {}
      for label in _labels:
        self.all_labels.update({label['id']: label['name']})

  def reloadAllMembers(self):
    self.all_members = None
    self.loadAllMembers()
    
  def loadAllMembers(self):
    if not hasattr(self, 'all_members') or self.all_members == None:
      _members = self.project_soup.matchKey('project').matchKey('members')[0].get_raw()
      self.all_members = {}
      for member in _members:
        self.all_members.update({member['id']: member})
  
  def addStatic(self, key, value, story):
    story[key] = value
    return story
      
  def epicsAndLabels_ID2String(self, story):
    story_labels = []
    story_epics = []
    for label_id in story['label_ids']:
      if label_id in self.all_epics.keys():
        story_epics.append(self.all_epics[label_id])
      else:
        story_labels.append(self.all_labels[label_id])
    story['epics'] = story_epics
    story['labels'] = story_labels
    return story
  
  def requestedBy_ID2String(self, story):
    if story['requested_by_id'] in self.all_members.keys():
      story['requested_by'] = self.all_members[story['requested_by_id']]['name']
    else:
      story['requested_by'] = "<Unknown: %s>" % story['requested_by_id']
    return story
  
  def ownedBy_ID2String(self, story):
    if story['owned_by_id'] == -1:
      story['owned_by'] = ""
    elif story['owned_by_id'] in self.all_members.keys():
      story['owned_by'] = self.all_members[story['owned_by_id']]['name']
    else:
      story['owned_by'] = "<Unknown: %s>" % story['owned_by_id']
    return story
    
  def tasks_format(self, story):
    class Task:
      def __init__(self):
        self.complete = False
        self.description = ""
    
    story_tasks = []
    for _task in story['tasks']:
      task = Task()
      task.description = _task['description']
      task.complete = _task['complete']
      story_tasks.append(task)
    story['tasks_list'] = story_tasks
    return story
Пример #7
0
 def test_matchValue_2(self):
     _expected_results = [{"x": 3, "y": [5, 6], "z": 7}]
     expected_results = JSONSoup()
     expected_results.load_obj(_expected_results)
     results = self.soup.matchValue(7)
     self.assertEqual(results, expected_results)
Пример #8
0
class JSONSoupTest(unittest.TestCase):
    def setUp(self):
        self.d = {
            "a": 1,
            "k": {"b": {"e": 4, "d": 5}, "l": 1},
            "c": 3,
            "f": [0, 1, 2, 3, {"b": {"e": 4, "g": 5}}],
            "t": {"u": 1, "v": 2, "w": {"x": 3, "y": [5, 6], "z": 7}},
        }
        self.soup = JSONSoup()
        self.soup.load_obj(self.d)

    def test_findAll_1(self):
        _expected_results = [self.d["k"]]
        expected_results = JSONSoup()
        expected_results.load_obj(_expected_results)
        self.assertEqual(self.soup.findAll({"b": {"e": 4, "d": 5}}), expected_results)

    def test_findAll_2(self):
        _expected_results = [{"u": 1, "w": {"y": [5, 6], "x": 3, "z": 7}, "v": 2}]
        expected_results = JSONSoup()
        expected_results.load_obj(_expected_results)
        self.assertEqual(self.soup.findAll({"u": 1}), expected_results)

    def test_findAll_parent(self):
        _expected_results = {"u": 1, "v": 2, "w": {"x": 3, "y": [5, 6], "z": 7}}
        expected_results = JSONSoup()
        expected_results.load_obj(_expected_results)
        self.assertEqual(self.soup.findAll({"x": 3})[0].parent, expected_results)

    def test_matchKey_1(self):
        _expected_results = [self.d["f"][4]["b"]]
        expected_results = JSONSoup()
        expected_results.load_obj(_expected_results)
        self.assertEqual(self.soup.matchKey("f").matchKey("b"), expected_results)

    def test_matchKey_2(self):
        _expected_results = [self.d["k"]["b"], self.d["f"][4]["b"]]
        expected_results = JSONSoup()
        expected_results.load_obj(_expected_results)
        self.assertEqual(self.soup.matchKey("b"), expected_results)

    def test_matchKey_3(self):
        alt_d = {"u": 1, "w": {"y": [5, 6], "x": 3, "z": 7}, "v": 2}
        alt_soup = JSONSoup()
        alt_soup.load_obj(alt_d)
        _expected_results = [3]
        expected_results = JSONSoup()
        expected_results.load_obj(_expected_results)
        self.assertEqual(alt_soup.matchKey("x"), expected_results)

    def test_matchKey_4(self):
        alt_d = {"u": 1, "w": {"y": [5, 6], "x": 3, "z": 7}, "v": 2}
        alt_soup = JSONSoup()
        alt_soup.children = [JSONSoup()]
        alt_soup.children[0].children = JSONSoup()
        alt_soup.children[0].children.load_obj(alt_d)
        _expected_results = [3]
        expected_results = JSONSoup()
        expected_results.load_obj(_expected_results)
        self.assertEqual(alt_soup.matchKey("x"), expected_results)

    def test_marchKey_noMatch(self):
        self.assertEqual(isinstance(self.soup.matchKey("Not present"), JSONSoup), True)
        self.assertEqual(isinstance(self.soup.matchKey("Not present").children, list), True)
        self.assertEqual(isinstance(self.soup.matchKey("t").matchKey("Not present"), JSONSoup), True)
        self.assertEqual(isinstance(self.soup.matchKey("t").matchKey("Not present").children, list), True)

    def test_matchValue_returns_soup(self):
        results = self.soup.matchValue(4)
        for soup in results:
            self.assertEqual(isinstance(soup, JSONSoup), True)

    def test_matchValue_1(self):
        _expected_results = [{"e": 4, "g": 5}, {"e": 4, "d": 5}]
        _expected_results.sort()
        expected_results = JSONSoup()
        expected_results.load_obj(_expected_results)
        results = self.soup.matchValue(4)
        self.assertEqual(isinstance(results.children, list), True)
        results.children.sort()
        self.assertEqual(results, expected_results)

    def test_matchValue_2(self):
        _expected_results = [{"x": 3, "y": [5, 6], "z": 7}]
        expected_results = JSONSoup()
        expected_results.load_obj(_expected_results)
        results = self.soup.matchValue(7)
        self.assertEqual(results, expected_results)

    # TODO add test where matchValue returns no results

    def test_findAll_matchValue_1(self):
        _expected_results = [3]
        expected_results = JSONSoup()
        expected_results.load_obj(_expected_results)
        partial_results = self.soup.findAll({"u": 1})
        results = partial_results.matchKey("x")
        self.assertEqual(results, expected_results)
Пример #9
0
 def test_matchKey_2(self):
     _expected_results = [self.d["k"]["b"], self.d["f"][4]["b"]]
     expected_results = JSONSoup()
     expected_results.load_obj(_expected_results)
     self.assertEqual(self.soup.matchKey("b"), expected_results)
Пример #10
0
 def test_findAll_parent(self):
     _expected_results = {"u": 1, "v": 2, "w": {"x": 3, "y": [5, 6], "z": 7}}
     expected_results = JSONSoup()
     expected_results.load_obj(_expected_results)
     self.assertEqual(self.soup.findAll({"x": 3})[0].parent, expected_results)
Пример #11
0
 def test_findAll_2(self):
     _expected_results = [{"u": 1, "w": {"y": [5, 6], "x": 3, "z": 7}, "v": 2}]
     expected_results = JSONSoup()
     expected_results.load_obj(_expected_results)
     self.assertEqual(self.soup.findAll({"u": 1}), expected_results)
Пример #12
0
 def test_findAll_1(self):
     _expected_results = [self.d["k"]]
     expected_results = JSONSoup()
     expected_results.load_obj(_expected_results)
     self.assertEqual(self.soup.findAll({"b": {"e": 4, "d": 5}}), expected_results)