X-Git-Url: https://nos-oignons.net/gitweb/gestion-adh.git/blobdiff_plain/3e57bb279787236b1349f6b1da2ecf61ed4211e0..4c730203fde2eb1d6fdcbe11542c6730d11124ae:/lib/nos_oignons/member.rb diff --git a/lib/nos_oignons/member.rb b/lib/nos_oignons/member.rb new file mode 100644 index 0000000..9787a63 --- /dev/null +++ b/lib/nos_oignons/member.rb @@ -0,0 +1,65 @@ +require 'safe_yaml' +SafeYAML::OPTIONS[:default_mode] = :safe + +module NosOignons + MEMBERS_ROOT = 'Membres' + MEMBER_FIELDS = [:name, :address, :email, :membership_fee_paid_on] + MEMBER_MANDATORY_FIELDS = [:name, :email] + + class Member < Struct.new(*MEMBER_FIELDS) + class << self + def all + Dir.glob("#{MEMBERS_ROOT}/*.mdwn").sort.collect do |file| + member_id = File.basename(file).gsub(/\.mdwn$/, '') + Member.new(member_id) + end + end + + def filename_for_id(member_id) + "Membres/%06d.mdwn" % member_id + end + + def read_from_git(ref, file) + IO.popen(['git', 'show', "#{ref}:#{file}"]) do |f| + member_id = File.basename(file).gsub(/\.mdwn$/, '') + Member.new(member_id, f.read) + end + end + end + + attr_reader :member_id + + def initialize(member_id, page_content=nil) + unless member_id =~ /\A\d{6}\z/ + raise ArgumentError.new('bad member id format') + end + @member_id = member_id + unless page_content + page_content = File.open(Member.filename_for_id(member_id)).read + end + unless page_content.start_with?("---\n") + raise ArgumentError.new('content is not a proper YAML document') + end + data = YAML.load(page_content) + MEMBER_FIELDS.each do |field| + self[field] = data[field.to_s] + end + # Immutability for the win + MEMBER_FIELDS.each do |field| + instance_eval{ undef :"#{field}=" } + end + MEMBER_MANDATORY_FIELDS.each do |sym| + raise ArgumentError.new('missing mandatory fields') unless self[sym] + end + if membership_fee_paid_on && !membership_fee_paid_on.is_a?(Date) + raise ArgumentError.new('membership_fee_paid_on is not a date') + end + end + + def up_to_date? + now = Time.now + last_year = Time.new(now.year - 1, now.month, now.day).to_date + membership_fee_paid_on && last_year < membership_fee_paid_on + end + end +end