From 4a99ae87e0f7fdd07d8820a724fbed1d8b2b5f36 Mon Sep 17 00:00:00 2001 From: Lunar Date: Sat, 1 Jun 2013 18:36:10 +0200 Subject: [PATCH] Start implementing update-ag-subscribers --- bin/update-ag-subscribers | 9 +++++ features/step_definitions/commands.rb | 4 +++ features/step_definitions/mailman.rb | 35 ++++++++++++++++++++ features/support/mock_mailman/add_members | 15 +++++++++ features/support/mock_mailman/list_members | 10 ++++++ features/support/mock_mailman/remove_members | 15 +++++++++ features/update-ag-subscribers.feature | 1 + lib/nos_oignons/mailman.rb | 22 ++++++++++++ 8 files changed, 111 insertions(+) create mode 100755 bin/update-ag-subscribers create mode 100644 features/step_definitions/mailman.rb create mode 100755 features/support/mock_mailman/add_members create mode 100755 features/support/mock_mailman/list_members create mode 100755 features/support/mock_mailman/remove_members create mode 100644 lib/nos_oignons/mailman.rb diff --git a/bin/update-ag-subscribers b/bin/update-ag-subscribers new file mode 100755 index 0000000..e5580c2 --- /dev/null +++ b/bin/update-ag-subscribers @@ -0,0 +1,9 @@ +#!/usr/bin/ruby1.9.1 +#-*- coding: utf-8 -*- + +require 'rubygems' +require 'bundler' +Bundler.setup + +require 'nos_oignons/mailman' +require 'nos_oignons/subscriptions' diff --git a/features/step_definitions/commands.rb b/features/step_definitions/commands.rb index 0aec8b6..685aa15 100644 --- a/features/step_definitions/commands.rb +++ b/features/step_definitions/commands.rb @@ -4,6 +4,10 @@ When /^j'exécute list\-emails$/ do run_simple 'list-emails' end +When /^j'exécute update-ag-subscribers$/ do + run_simple 'update-ag-subscribers' +end + Then /^je ne dois pas avoir eu d'erreur$/ do assert_exit_status(0) end diff --git a/features/step_definitions/mailman.rb b/features/step_definitions/mailman.rb new file mode 100644 index 0000000..ab98b18 --- /dev/null +++ b/features/step_definitions/mailman.rb @@ -0,0 +1,35 @@ +#-*- coding: utf-8 -*- + +require 'json' + +Before('@mailman') do + @mock_mailman_db = "#{current_dir}/mock_mailman.json" + init_mailman_mock_db({}) + ENV['MOCK_MAILMAN_DB'] = @mock_mailman_db + @orig_path = ENV['PATH'] + ENV['PATH'] = "#{File.expand_path('../../support/mock_mailman', __FILE__)}:#{@orig_path}" +end + +After('@mailman') do + ENV['PATH'] = @orig_path + FileUtils.remove_entry_secure @mock_mailman_db +end + +def init_mailman_mock_db(dict) + File.open(@mock_mailman_db, 'w') { |f| f.write(JSON.dump(dict)) } +end + +def mailman_mock_db + JSON.load(File.open(@mock_mailman_db)) +end + +Given /^une liste ag@ avec comme emails inscrits:$/ do |subscriber_list| + emails = subscriber_list.strip.split + init_mailman_mock_db('ag' => emails) +end + +Then /^la liste ag@ doit avoir comme emails inscrits:$/ do |expected| + emails = expected.strip.split.sort + expect(mailman_mock_db['ag'].sort).to eql(emails) +end + diff --git a/features/support/mock_mailman/add_members b/features/support/mock_mailman/add_members new file mode 100755 index 0000000..59563d8 --- /dev/null +++ b/features/support/mock_mailman/add_members @@ -0,0 +1,15 @@ +#!/usr/bin/ruby1.9.1 + +require 'json' + +db = ENV['MOCK_MAILMAN_DB'] + +lists = JSON.load(File.read(db)) +if ARGV[0] != '-r' + $stderr.puts "Bad call" + exit 1 +else + emails = (ARGV[1] == '-' ? $stdin : File.open(ARGV[1])).read.split + lists[ARGV[2]] = (lists[ARGV[2]] || []) + emails +end +File.open(db, 'w') { |f| f.write(JSON.dump(lists)) } diff --git a/features/support/mock_mailman/list_members b/features/support/mock_mailman/list_members new file mode 100755 index 0000000..47fbdda --- /dev/null +++ b/features/support/mock_mailman/list_members @@ -0,0 +1,10 @@ +#!/usr/bin/ruby1.9.1 + +require 'json' + +db = ENV['MOCK_MAILMAN_DB'] + +lists = JSON.load(File.read(db)) +(lists[ARGV[0]] || []).each do |email| + puts email +end diff --git a/features/support/mock_mailman/remove_members b/features/support/mock_mailman/remove_members new file mode 100755 index 0000000..b3eaffa --- /dev/null +++ b/features/support/mock_mailman/remove_members @@ -0,0 +1,15 @@ +#!/usr/bin/ruby1.9.1 + +require 'json' + +db = ENV['MOCK_MAILMAN_DB'] + +lists = JSON.load(File.read(db)) +if ARGV[0] != '-f' + $stderr.puts "Bad call" + exit 1 +else + emails = (ARGV[1] == '-' ? $stdin : File.open(ARGV[1])).read.split + lists[ARGV[2]] = (lists[ARGV[2]] || []) - emails +end +File.open(db, 'w') { |f| f.write(JSON.dump(lists)) } diff --git a/features/update-ag-subscribers.feature b/features/update-ag-subscribers.feature index 7fe997d..0ca89aa 100644 --- a/features/update-ag-subscribers.feature +++ b/features/update-ag-subscribers.feature @@ -1,5 +1,6 @@ # language: fr +@mailman Fonctionnalité: mettre à jour les emails inscrites à la liste ag@ En tant que membre de Nos oignons, mon adresse email doit être inscrite à la liste ag@ qui correspond à l'assemblée générale. Elle doit diff --git a/lib/nos_oignons/mailman.rb b/lib/nos_oignons/mailman.rb new file mode 100644 index 0000000..501b542 --- /dev/null +++ b/lib/nos_oignons/mailman.rb @@ -0,0 +1,22 @@ +#-*- coding: utf-8 -*- + +require 'shellwords' + +module NosOignons + module Mailman + class << self + def list_members(list) + `list_members #{Shellwords.escape(list)}`.split + end + + def add_member(list, email) + add_members(list, [email]) + end + + def add_members(list, emails) + # XXX IO.popen + `add_members #{Shellwords.escape(list)}`.split + end + end + end +end -- 2.39.5