| 1 | #!/usr/bin/env python |
|---|
| 2 | # encoding: utf-8 |
|---|
| 3 | """PythonEggs support for local (installed) eggs. |
|---|
| 4 | """ |
|---|
| 5 | |
|---|
| 6 | import email |
|---|
| 7 | import pkg_resources |
|---|
| 8 | from cache import Egg |
|---|
| 9 | |
|---|
| 10 | |
|---|
| 11 | def get_installed_eggs(): |
|---|
| 12 | env = pkg_resources.Environment() |
|---|
| 13 | working_set = pkg_resources.WorkingSet() |
|---|
| 14 | for package_name in env: |
|---|
| 15 | # There may be multiple versions of same packages |
|---|
| 16 | for egg in env[package_name]: |
|---|
| 17 | md = {} |
|---|
| 18 | if egg.has_metadata('PKG-INFO'): |
|---|
| 19 | my_metadata = egg.get_metadata('PKG-INFO') |
|---|
| 20 | msg = email.message_from_string(my_metadata) |
|---|
| 21 | for header in [l for l in msg._headers]: |
|---|
| 22 | md[header[0].lower()] = header[1] |
|---|
| 23 | # Better make sure my assumptions about names |
|---|
| 24 | # and versions being consistent is right... |
|---|
| 25 | assert egg.version == md.get("version") |
|---|
| 26 | if package_name.lower() != egg.project_name.lower(): |
|---|
| 27 | print "warning: %s is not %s" % (package_name, egg.project_name) |
|---|
| 28 | yield Egg( |
|---|
| 29 | installed = True, |
|---|
| 30 | active = egg in working_set, |
|---|
| 31 | name = unicode(egg.project_name), |
|---|
| 32 | fullname = unicode(egg.egg_name()), |
|---|
| 33 | location = unicode(egg.location), |
|---|
| 34 | license = unicode(md.get("license", "")), |
|---|
| 35 | author = unicode(md.get("author", "")), |
|---|
| 36 | home_page = unicode(md.get("home-page", "")), |
|---|
| 37 | summary = unicode(md.get("summary", "")), |
|---|
| 38 | platform = unicode(md.get("platform", "")), |
|---|
| 39 | description = unicode(md.get("description", "")), |
|---|
| 40 | # extras = egg.extras, |
|---|
| 41 | # slug = egg.key, |
|---|
| 42 | # platform = egg.platform, |
|---|
| 43 | # precedence = egg.precedence, |
|---|
| 44 | # py_version = egg.py_version, |
|---|
| 45 | # requires = egg.requires(), |
|---|
| 46 | version = unicode(egg.version), |
|---|
| 47 | source = u"local" |
|---|
| 48 | ) |
|---|
| 49 | |
|---|
| 50 | |
|---|
| 51 | def sync(store): |
|---|
| 52 | new_eggs = list(get_installed_eggs()) |
|---|
| 53 | # delete old |
|---|
| 54 | for e in store.find(Egg, source=u"local"): |
|---|
| 55 | store.remove(e) |
|---|
| 56 | store.commit() |
|---|
| 57 | # add new |
|---|
| 58 | for egg in new_eggs: |
|---|
| 59 | store.add(egg) |
|---|
| 60 | store.commit() |
|---|