google calendarから日本の祝日のリストを取得する

前回の投稿でholidayというクラスを定義したコードをポストしたが、こちらはタプルのリストで書き直してみた。

# coding: utf-8
import datetime
import httplib2
import urllib
from xml.dom import minidom
from xml.dom.minidom import parseString
     
def get_japan_holiday(start,days,rg):
    """
    start :いつから dateオブジェクトで渡す
    days:調べたい期間を 日数で渡す
    rg:listで返ってくる祝日の要素数 
        大きくするとgoogleがエラーを返すのか? 未確認
    """
    end = start + datetime.timedelta(days)
    host = "http://www.google.com/calendar/feeds/"
    user = "ja.japanese%23holiday@group.v.calendar.google.com"
    param = "/public/full"
    val = {"start-min" : start.strftime("%Y-%m-%d"),
    "start-max" : end.strftime("%Y-%m-%d"),
    "max-results" : str(rg)}
    http = httplib2.Http()
    url = "%s%s%s?%s" % (host, user, param, urllib.urlencode(val))
    response,content = http.request(url) #返値には responseが必要
    xdoc = minidom.parseString(content)
    elements = xdoc.getElementsByTagName("entry")
    holidays = []
    for element in elements:
        day = holiday_name = ''
        for child in element.childNodes:
            if child.tagName == 'gd:when':
                day = child.getAttribute('startTime')
                d = day.split('-')
                date = datetime.date(int(d[0]),int(d[1]),int(d[2]))
            if child.tagName == "title":
                holiday_name = child.firstChild.data

        holidays.append((date,holiday_name))
        
    sorted_holidays = sorted(holidays,
            key=lambda holiday:(holiday[0].year,holiday[0].month,holiday[0].day))
 
    return sorted_holidays

if __name__=="__main__":
    now = datetime.datetime(2013,1,1)
    for holiday in get_japan_holiday(now,365*2,100):
        print holiday[0].isoformat() + ' ' + holiday[1]

google calendar から 祝日のリストを取得する

今作成中のwebアプリで、祝日のリストが必要。厳密にやると、春分の日と秋分の日が、年に依って変化してしまうダメダメな日本の法律。仕方がないので、google様にお世話になる。以下はgoogle calendarから祝日の日付と名前をlist形式にして返すpythonのコード。

# coding: utf-8
import datetime
import httplib2
import urllib
from xml.dom import minidom
#from xml.dom.minidom import parseString

class Holiday:
    def __init__(self,date_string,name):
        self.date_string = date_string
        self.name = name
        d = date_string.split('-')
        self.date = datetime.date(int(d[0]),int(d[1]),int(d[2]))
    def __repr__(self):
        return self.date_string + ' ' + self.name

def get_japan_holiday(start,days,range):
    """
    start :いつから datetimeオブジェクトで渡す
    days:調べたい期間を 日数で渡す
    range:listで返ってくる祝日の要素数 
   大きくするとgoogleがエラーを返すのか? 未確認
    """
    end = start + datetime.timedelta(days)
    host = "http://www.google.com/calendar/feeds/"
    user = "ja.japanese%23holiday@group.v.calendar.google.com"
    param = "/public/full"
    val = {"start-min" : start.strftime("%Y-%m-%d"),
    "start-max" : end.strftime("%Y-%m-%d"),
    "max-results" : str(range)}
    http = httplib2.Http()
    url = "%s%s%s?%s" % (host, user, param, urllib.urlencode(val))
    response,content = http.request(url)
    #print parseString(content).toprettyxml(encoding="utf-8")
    xdoc = minidom.parseString(content)
    elements = xdoc.getElementsByTagName("entry")
    holidays = []
    for element in elements:
        day = holiday_name = ''
        for child in element.childNodes:
            if child.tagName == 'gd:when':
                day = child.getAttribute('startTime')
            if child.tagName == "title":
                holiday_name = child.firstChild.data
        holidays.append(Holiday(day,holiday_name))
        
    sorted_holidays = sorted(holidays,key=lambda holiday:(holiday.date.year,holiday.date.month,holiday.date.day))

    return sorted_holidays

if __name__=="__main__":
    now = datetime.datetime(2013,1,1)
    print get_japan_holiday(now,365*2,100)

Python + Pyramid1.4 のチュートリアル

MacOS X 10.8.3上でテスト。python 2.7はインストールされているから、ターミナルで

$python
Python 2.7.2 (default, Oct 11 2012, 20:14:37)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

で確認。次にvirtualenv,vertualenvwrapperをインストール。
その後、pyramidという仮想環境を作り、

$ workon pyramid
$ easy_install pyramid

で仮想環境に入ってから、pyramid1.4がインストールされる。eclipseで編集予定なのでworkspaceディレクトリに入り、
Pyramidのframeworkを解説しているのOn Unixのコマンドをターミナルから実行する。
test.pyを実行するためには、easy_install nose WebTestもやっておく。
サーバーを起動させるにはreloadオプションをつけ、

$pserve development.ini --reload
$pcreate -s alchemy tutorial
$python setup.py test -q
$nosetests --cover-package=tutorial --cover-erase --with-coverage
$initialize_tutorial_db development.ini

eclipseのNew Project->PyDevProject Project名はTutorial
(projectのルートディレクトリ名と同じ名前にすれば階層構造維持して読み込まれる)

アプリケーションの実行はターミナルから

pserve development.ini --reload