Esempio n. 1
0
    def test_value_error_raised_if_output_not_json_or_filename(self):

        valid = ['json', 'filename']
        invalid = ['foobar', 'invalid', 123, True]

        for i in valid:
            self.assertIsNotNone(dt_formatter(self.dt, i))

        for i in invalid:
            with self.assertRaises(ValueError):
                _ = dt_formatter(self.dt, i)
Esempio n. 2
0
    def test_input_not_datetime_raises_attribute_error(self):

        invalid = [123, 'foobar', True]

        for i in invalid:
            with self.assertRaises(AttributeError):
                _ = dt_formatter(i, 'filename')
Esempio n. 3
0
def get_stats(sg, mode, now, articles=None):

    extras = get_extra_attrs(sg, mode)

    now_json = dt_formatter(now, 'json')

    if mode in ['events', 'articles']:
        period_start, period_stop = map(partial(dt_formatter, output='json'),
                                        [sg.start, sg.stop])
    # TODO - add if-statement to make sure that modes that need articles have articles passed in as arg
    # if mode in ['articles', 'referrals'] and not articles: raise someError

    print(f'\nGetting {extras["title"]}...', end='\n\n')

    if mode == 'summary':
        agg_stats = sg.get_summary_stats()
        articles = sg.get_article_ids(agg_stats)

        data = {'data': {'post': agg_stats}}
    elif mode == 'events':

        if isinstance(sg, StatGrabberUser):
            non_attrib_events = sg.get_summary_stats(events=True)
            data = {'data': {'events': non_attrib_events}}
        elif isinstance(sg, StatGrabberPublication):
            views = sg.get_events(type_='views')
            visitors = sg.get_events(type_='visitors')
            data = {'data': {'views': views, 'visitors': visitors}}

    elif mode == 'story_overview':

        stories = sg.get_all_story_overview()
        data = {'data': {'story': stories}}

    elif mode == 'articles':

        data = sg.get_all_story_stats(articles)

    elif mode == 'referrers':

        data = sg.get_all_story_stats(articles, type_='referrer')

    else:
        # TODO remove hardcoding from this message - make choice list dynamic from keys
        raise ValueError(
            '"mode" param must be of choice {summary, events, story_overview, articles, referrers}'
        )

    if extras['is_aggregated']:
        extras = {'timestamp': now_json, 'type': extras['type']}
    else:
        extras = {
            'periodBegin': period_start,
            'periodEnd': period_stop,
            'type': extras['type']
        }

    return {**data, **extras}
Esempio n. 4
0
def write_stats(sg, data, mode, now, sub_dir):

    extras = get_extra_attrs(sg, mode)
    now_prefix = dt_formatter(now, 'filename')
    period_start_f, period_stop_f = map(
        partial(dt_formatter, output='filename'), [sg.start, sg.stop])

    filename = '{}/{}/{}_{}_{}'.format(sub_dir, extras['folder'], now_prefix,
                                       sg.slug, extras['filename_suffix'])
    if mode in ['events', 'articles']:
        filename = '{}/{}/{}_{}_{}_{}'.format(sub_dir, extras['folder'],
                                              period_stop_f, period_start_f,
                                              sg.slug,
                                              extras['filename_suffix'])
    path = sg.write_json(data, filename)
    print(f'{extras["title"]} written to:')
    print(path, section_break, sep='\n')
    return path
Esempio n. 5
0
    def test_returns_string(self):

        self.assertIsInstance(dt_formatter(self.dt, "json"), str)
Esempio n. 6
0
    def test_filename_output_of_form_YYYYMMDDTHHMMSS(self):

        actual = dt_formatter(self.dt, "filename")
        self.assertRegex(actual, r'\d{8}T\d{6}')