pyprind icon indicating copy to clipboard operation
pyprind copied to clipboard

email notifications

Open dzaytsev91 opened this issue 9 years ago • 7 comments

Implementation of task complete email notifications. It seems like the setup.py install doesn't install packages from requirements.txt, I had to fix it because travis shows errors.

You can test it by calling: pyprind.setup_email(smtp_server, smtp_port, username, password)

dzaytsev91 avatar Sep 02 '16 10:09 dzaytsev91

Thanks a lot, looks great so far. Will give it a more thorough look over the weekend and let you know if I have any suggestions! Btw. do you know if it also works on Windows or is it posix only? (Oh, and btw don't worry about squashing commits, GitHub has this handy squash button now so that I can take care of it upon merging)

screen shot 2016-09-03 at 10 08 42 am

rasbt avatar Sep 03 '16 14:09 rasbt

Hm, not sure why, but it's not sending messages in my case. However, when I just ran a simple test

server_ssl = smtplib.SMTP_SSL("smtp.gmail.com", 465)
server_ssl.login('[email protected]', passw)  
msg = "\r\n".join([
  "From: [email protected]",
  "To: [email protected]",
  "Subject: Some test message",
  "",
  "Test"
  ])
server_ssl.sendmail('[email protected]', ['[email protected]'], msg)
server_ssl.close()

it seems to work fine. I am not getting any error messages via pyprind with email=True after running the email setup, but for some reason, nothing gets send. There are a few other things I found, and it would be great if you could take a look at it

  • [ ] add email parameter also to ProgPercent (currently only in ProgBar)
  • [ ] add the email param (mentioned above) to the Class' docstrings
  • [ ] add a docstring to the new setup_email function
  • [ ] I wouldn't make the pycrypto package a required dependency in the setup.py but add it to the requirements as previously. The reason is that this email feature is optional, and for a barebones-pyprind, some people maybe don't want to install it. Can you please change the requirements section back to how it was set up previously but add pycrypto to requirements.txt?
      package_data={'': ['LICENSE',
                         'README.md',
                         'requirements.txt'
                         'CHANGELOG.md',
                         'CONTRIBUTING.md'],
                    'tests': ['tests/test_percentage_indicator.py',
                              'tests/test_progress_bar.py']},
  • [ ] not sure what's better, but I'd prefer having the config files in the users home directory, e.g., ~/.pyprind/pyprind.key rather than adding it to the package folder. The reason is that a user's home directory may be a saver place to store such information, despite it being encrypted. Also, it is a common convention (e.g., .vim, .gitconfig etc.) Something like the following should work on Windows and Posix:
def get_pyprind_config_dir():
    home = os.path.expanduser("~")
    config_path = os.path.join(home, '.pyprind')
    return config_path
  • [ ] would be nice if you could also change the version tag to __version__ = '2.9.9dev0'
  • [ ] also, I am getting an error in Python 3 (works fine in Python 2.7), would be nice to fix that
    106     config.set('Email', 'password', password)
    107     with open(file_path, 'wb') as f:
--> 108         config.write(f)
    109     with open(file_path, 'rb') as af:
    110         cipher.encrypt(af.read())

/Users/Sebastian/miniconda3/lib/python3.5/configparser.py in write(self, fp, space_around_delimiters)
    914         for section in self._sections:
    915             self._write_section(fp, section,
--> 916                                 self._sections[section].items(), d)
    917 
    918     def _write_section(self, fp, section_name, section_items, delimiter):

/Users/Sebastian/miniconda3/lib/python3.5/configparser.py in _write_section(self, fp, section_name, section_items, delimiter)
    918     def _write_section(self, fp, section_name, section_items, delimiter):
    919         """Write a single section to the specified `fp'."""
--> 920         fp.write("[{}]\n".format(section_name))
    921         for key, value in section_items:
    922             value = self._interpolation.before_write(self, section_name, key,

TypeError: a bytes-like object is required, not 'str'

Despite these little points mentioned above, it looks great so far! I really appreciate the contribution!

rasbt avatar Sep 03 '16 16:09 rasbt

Thanks a lot for your feedback! I will try to fix all the notes as soon as possible

dzaytsev91 avatar Sep 03 '16 18:09 dzaytsev91

Thanks a lot for your feedback! I will try to fix all the notes as soon as possible

Thanks! And no need to rush :)

rasbt avatar Sep 03 '16 19:09 rasbt

Hello @dzaytsev91! Thanks for updating the PR.

pep8speaks avatar Mar 10 '17 20:03 pep8speaks

Thanks! And no need to rush :)

Hey, sorry for such a delay I've been busy a bit :) I've made all the changes that you manchioned and it would be nice if you could take a look at it.

About setup_email function, maybe I should write a simple example in README? According to a test with sending an email message I run your simple test and in my case it worked good and sends the email. How do you think what could be the reason why it doesn't work for you?

I would really appreciate any comments!

dzaytsev91 avatar Mar 10 '17 21:03 dzaytsev91

No need to apologize! And thanks for the updated PR :). A short example in the Readme (and in the example Jupyter notebook) would be nice! I will give it another try then and take a closer look at the code., Thanks!

rasbt avatar Mar 12 '17 06:03 rasbt