Beispiel #1
0
def sync_group_events(group_id, client=None):
    """ Use meetup group id to sync all events to this data base """
    if client is None:
        client = MeetupClient(MEETUP_KEY)
    # ======================= get the group
    params = {}
    params["group_id"] = group_id
    results = client.invoke("/2/groups", params=params)["results"]
    if not len(results):
        raise ValueError("No meetup group_id {}".format(params["group_id"]))

    # ======================= sync events for the group
    for group_data in results:
        # create group
        group = Group.objects.from_meetup_data(group_data)
        print(" -- for group {} --".format(group.name))
        # get all status options
        params["status"] = ",".join(STATUS_OPTIONS)
        events = client.invoke("/2/events", params)["results"]
        for event_data in events:
            event = Event.objects.from_meetup_data(event_data)
            print("   -- sync event {} --".format(event.name))
Beispiel #2
0
def sync_group_events(group_id, client=None):
    """ Use meetup group id to sync all events to this data base """
    if client is None:
        client = MeetupClient(MEETUP_KEY)
    # ======================= get the group
    params = {}
    params['group_id'] = group_id
    results = client.invoke("/2/groups", params=params)['results']
    if not len(results):
        raise ValueError("No meetup group_id {}".format(params['group_id']))

    # ======================= sync events for the group
    for group_data in results:
        # create group
        group = Group.objects.from_meetup_data(group_data)
        print(" -- for group {} --".format(group.name))
        # get all status options
        params['status'] = ",".join(STATUS_OPTIONS)
        events = client.invoke("/2/events", params)['results']
        for event_data in events:
            event = Event.objects.from_meetup_data(event_data)
            print("   -- sync event {} --".format(event.name))
Beispiel #3
0
class MeetupClientTests(unittest.TestCase):
    """Tests that ensure GET requests function correctly.
    """

    def setUp(self):
        self.client = MeetupClient(api_key=MEETUP_KEY)
        self.json_body = MagicMock()
        self.response_headers = {
            'X-RateLimit-Remaining': "14",
            'X-RateLimit-Reset': "2"
        }
        self.mock_json = Mock(return_value=self.json_body)
        self.mock_response = Mock(
            headers=self.response_headers,
            json=self.mock_json
        )

    @patch.object(requests, "get")
    def test_invoke_get_calls_requests(self, mock_get):
        mock_get.return_value = self.mock_response
        result = self.client.invoke(
            meetup_method="2/groups",
            params={
                "member_id": "12345"
            },
            method="GET"
        )
        mock_get.assert_called_once_with(
            "https://api.meetup.com/2/groups"
            "?page=1000"
            "&key=abc123"
            "&member_id=12345"
        )
        self.mock_json.assert_called_once_with()
        self.assertIs(self.json_body, result)

    @patch.object(requests, "post")
    def test_invoke_post_calls_requests(self, mock_post):
        mock_post.return_value = self.mock_response
        result = self.client.invoke(
            meetup_method="2/groups",
            params={
                "name": "Awesome Team"
            },
            method="POST"
        )
        mock_post.assert_called_once_with(
            "https://api.meetup.com/2/groups",
            data={
                "key": "abc123",
                "page": 1000,
                "name": "Awesome Team"
            }
        )
        self.mock_json.assert_called_once_with()
        self.assertIs(self.json_body, result)

    @patch.object(requests, "delete")
    def test_invoke_delete_calls_requests(self, mock_delete):
        mock_delete.return_value = self.mock_response
        result = self.client.invoke(
            meetup_method="2/groups/awesome-team",
            params={
                "id": 72
            },
            method="DELETE"
        )
        mock_delete.assert_called_once_with(
            "https://api.meetup.com/2/groups/awesome-team",
            params={
                "key": "abc123",
                "page": 1000,
                "id": 72
            }
        )
        self.mock_json.assert_called_once_with()
        self.assertIs(self.json_body, result)

    @patch.object(time, "sleep")
    @patch.object(requests, "get")
    def test_hit_rate_limit_waits(self, mock_get, mock_sleep):
        mock_get.return_value = self.mock_response
        self.response_headers['X-RateLimit-Remaining'] = "0"
        self.response_headers['X-RateLimit-Reset'] = "4"
        self.client.invoke("2/groups/foo")

        self.response_headers['X-RateLimit-Reset'] = "2"
        self.client.invoke("2/groups/bar")
        self.assertEqual(2, len(mock_get.call_args_list))
        mock_sleep.assert_called_once_with(4)

        mock_sleep.reset_mock()
        self.client.invoke("2/groups/chew")
        mock_sleep.assert_called_once_with(2)

    @patch.object(requests, "get")
    def test_get_next_page_uses_meta_to_fetch_next(self, mock_get):
        mock_get.return_value = self.mock_response
        result = self.client.get_next_page(
            {
                "meta": {
                    "next": "http://meetup.foo.co/page-2"
                }
            }
        )
        mock_get.assert_called_once_with("http://meetup.foo.co/page-2")
        self.mock_json.assert_called_once_with()
        self.assertIs(self.json_body, result)

    def test_get_next_page_no_next_is_none(self):
        result = self.client.get_next_page(
            {
                "meta": {
                    "prev": "http://fifo.com/1"
                }
            }
        )
        self.assertIsNone(result)

    def test_get_next_page_no_meta_is_none(self):
        result = self.client.get_next_page({})
        self.assertIsNone(result)
Beispiel #4
0
class MeetupClientTests(unittest.TestCase):
    """Tests that ensure GET requests function correctly.
    """
    def setUp(self):
        self.client = MeetupClient(api_key=MEETUP_KEY)
        self.json_body = MagicMock()
        self.response_headers = {
            'X-RateLimit-Remaining': "14",
            'X-RateLimit-Reset': "2"
        }
        self.mock_json = Mock(return_value=self.json_body)
        self.mock_response = Mock(headers=self.response_headers,
                                  json=self.mock_json)

    def assertGetCallMatches(self, called_url, expected_path, params_dict):
        parsed_url = urlparse(called_url)
        query_dict = parse_qs(parsed_url.query)

        self.assertEqual(parsed_url.scheme, 'https')
        self.assertEqual(parsed_url.netloc, 'api.meetup.com')
        self.assertEqual(parsed_url.path, expected_path)

        self.assertDictEqual(params_dict, query_dict)

    @patch.object(requests, "get")
    @patch.object(requests, "post")
    @patch.object(requests, "delete")
    def test_oauth_requests(self, mock_delete, mock_post, mock_get):
        mock_get.return_value = self.mock_response
        self.client = MeetupClient(oauth_token=MEETUP_KEY)
        self.client.invoke(meetup_method="2/groups",
                           params={"member_id": "12345"},
                           method="GET")

        mock_get.assert_called_once()
        called_url = mock_get.call_args[0][0]
        headers = mock_get.call_args[1]['headers']
        self.assertEqual({'Authorization': 'Bearer abc123'}, headers)

        self.assertGetCallMatches(called_url, '/2/groups', {
            'page': ['1000'],
            'member_id': ['12345']
        })

        mock_post.return_value = self.mock_response
        self.client.invoke(meetup_method="2/groups",
                           params={"name": "Awesome Team"},
                           method="POST")
        mock_post.assert_called_once_with(
            "https://api.meetup.com/2/groups",
            data={"name": "Awesome Team"},
            headers={'Authorization': 'Bearer abc123'})

        mock_delete.return_value = self.mock_response
        self.client.invoke(meetup_method="2/groups/awesome-team",
                           params={"id": 72},
                           method="DELETE")
        mock_delete.assert_called_once_with(
            "https://api.meetup.com/2/groups/awesome-team",
            params={"id": 72},
            headers={'Authorization': 'Bearer abc123'})

    @patch.object(requests, "get")
    def test_invoke_get_calls_requests(self, mock_get):
        mock_get.return_value = self.mock_response
        result = self.client.invoke(meetup_method="2/groups",
                                    params={"member_id": "12345"},
                                    method="GET")
        mock_get.assert_called_once()
        called_url = mock_get.call_args[0][0]

        self.assertGetCallMatches(
            called_url,
            '/2/groups',
            {
                'page': ['1000'],
                'key': ['abc123'],
                'member_id': ['12345'],
            },
        )

        self.mock_json.assert_called_once_with()
        self.assertIs(self.json_body, result)

    @patch.object(requests, "patch")
    def test_invoke_patch_calls_requests(self, mock_patch):
        mock_patch.return_value = self.mock_response
        result = self.client.invoke(meetup_method="foo/events/1734824",
                                    params={"name": "Awesome Team Event"},
                                    method="PATCH")
        mock_patch.assert_called_once_with(
            "https://api.meetup.com/foo/events/1734824",
            data={
                "key": "abc123",
                "name": "Awesome Team Event"
            })
        self.mock_json.assert_called_once_with()
        self.assertIs(self.json_body, result)

    @patch.object(requests, "post")
    def test_invoke_post_calls_requests(self, mock_post):
        mock_post.return_value = self.mock_response
        result = self.client.invoke(meetup_method="2/groups",
                                    params={"name": "Awesome Team"},
                                    method="POST")
        mock_post.assert_called_once_with("https://api.meetup.com/2/groups",
                                          data={
                                              "key": "abc123",
                                              "name": "Awesome Team"
                                          })
        self.mock_json.assert_called_once_with()
        self.assertIs(self.json_body, result)

    @patch.object(requests, "delete")
    def test_invoke_delete_calls_requests(self, mock_delete):
        mock_delete.return_value = self.mock_response
        result = self.client.invoke(meetup_method="2/groups/awesome-team",
                                    params={"id": 72},
                                    method="DELETE")
        mock_delete.assert_called_once_with(
            "https://api.meetup.com/2/groups/awesome-team",
            params={
                "key": "abc123",
                "id": 72
            })
        self.mock_json.assert_called_once_with()
        self.assertIs(self.json_body, result)

    @patch.object(time, "sleep")
    @patch.object(requests, "get")
    def test_hit_rate_limit_waits(self, mock_get, mock_sleep):
        mock_get.return_value = self.mock_response
        self.response_headers['X-RateLimit-Remaining'] = "0"
        self.response_headers['X-RateLimit-Reset'] = "4"
        self.client.invoke("2/groups/foo")

        self.response_headers['X-RateLimit-Reset'] = "2"
        self.client.invoke("2/groups/bar")
        self.assertEqual(2, len(mock_get.call_args_list))
        mock_sleep.assert_called_once_with(4)

        mock_sleep.reset_mock()
        self.client.invoke("2/groups/chew")
        mock_sleep.assert_called_once_with(2)

    @patch.object(requests, "get")
    def test_get_next_page_uses_meta_to_fetch_next(self, mock_get):
        mock_get.return_value = self.mock_response
        result = self.client.get_next_page(
            {"meta": {
                "next": "http://meetup.foo.co/page-2"
            }})
        mock_get.assert_called_once_with("http://meetup.foo.co/page-2")
        self.mock_json.assert_called_once_with()
        self.assertIs(self.json_body, result)

    def test_get_next_page_no_next_is_none(self):
        result = self.client.get_next_page(
            {"meta": {
                "prev": "http://fifo.com/1"
            }})
        self.assertIsNone(result)

    def test_get_next_page_no_meta_is_none(self):
        result = self.client.get_next_page({})
        self.assertIsNone(result)