You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@whimsical.apache.org by se...@apache.org on 2018/07/03 23:10:58 UTC
[whimsy] branch master updated: Initial checkin of progress file
updater
This is an automated email from the ASF dual-hosted git repository.
sebb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/whimsy.git
The following commit(s) were added to refs/heads/master by this push:
new 426cece Initial checkin of progress file updater
426cece is described below
commit 426cece0015d78a77479b10c37300685f6df5aa0
Author: Sebb <se...@apache.org>
AuthorDate: Wed Jul 4 00:10:56 2018 +0100
Initial checkin of progress file updater
---
www/project/icla/views/actions/update.json.rb | 116 ++++++++++++++++++++++++++
1 file changed, 116 insertions(+)
diff --git a/www/project/icla/views/actions/update.json.rb b/www/project/icla/views/actions/update.json.rb
new file mode 100644
index 0000000..1d21bc2
--- /dev/null
+++ b/www/project/icla/views/actions/update.json.rb
@@ -0,0 +1,116 @@
+#
+# Common methods to update the progress file
+# TODO also send emails?
+#
+
+$LOAD_PATH.unshift '/srv/whimsy/lib'
+
+require 'json'
+require 'whimsy/lockfile'
+
+# TODO add emails where necessary
+
+def update(data)
+ token = data['token']
+ file = "/srv/icla/#{token}.json"
+ action = data['action']
+ timestamp = Time.now.to_s[0..9]
+ member = data['member']
+ comment = data['comment'] # may be nil
+
+ if action == 'submitVote'
+ vote = data['vote']
+ raise 'vote must not be nil' unless vote
+ raise 'member must not be nil' unless member
+ if vote == '-1'
+ raise '-1 vote must have comment' unless comment
+ end
+ if comment # allow comment for other votes
+ voteinfo = {
+ 'vote' => vote,
+ 'comment' => comment,
+ 'member' => member,
+ 'timestamp' => timestamp,
+ }
+ else
+ voteinfo = {
+ 'vote' => vote,
+ 'member' => member,
+ 'timestamp' => timestamp,
+ }
+ end
+ end
+ contents = {} # define the var outside the block
+ LockFile.lockfile(file, 'r+', File::LOCK_EX) do |f|
+ contents = JSON::parse(f.read)
+ rewrite = false # should the file be updated?
+ case action
+ # These are the vote actions
+ when 'submitVote'
+ # keep the same phase
+ contents['votes'] << voteinfo
+ rewrite = true
+ when 'cancelVote'
+ contents['phase'] = 'cancelled'
+ rewrite = true
+ when 'tallyVote'
+ contents['phase'] = 'tallied' # is that necessary? Can we tally again?
+ rewrite = true # only needed if phase is updated
+
+ # these are the discuss actions
+ when 'submitComment', 'startVoting', 'invite' # discuss
+ contents['comments'] << {
+ comment: comment,
+ member: member,
+ timestamp: timestamp,
+ }
+ # Might be better for the caller to provide the new phase
+ if action == 'startVoting'
+ contents['phase'] = 'vote'
+ contents['votes'] ||= [] # make sure there is a votes array
+ end
+ contents['phase'] = 'invite' if action == 'invite'
+ rewrite = true
+
+ # unknown
+ else
+ raise "InvalidAction: #{action}"
+ end
+ if rewrite
+ f.rewind # back to start
+ f.truncate(0) # need to empty the file otherwise can result in leftover data
+ f.write(JSON.pretty_generate(contents))
+ end
+ end
+ contents
+end
+
+# error handler
+def process(data)
+ contents = {}
+ begin
+ contents = update(data)
+ rescue => e
+ _error e.inspect
+ end
+ _contents contents
+end
+
+def embed # called by Sinatra which sets params
+ process(params)
+end
+
+def main(params) # called by CLI which passes params
+ process(params)
+end
+
+if __FILE__ == $0 # Allow independent testing
+ $ret = {}
+ def method_missing(m, *args) # handles _error etc
+ $ret[m.to_s[1..-1]]=args[0] if m[0] == '_'
+ end
+ main(Hash[*ARGV])
+ puts JSON.pretty_generate($ret) # output the return data
+else
+ embed # Sinatra sets params
+end
\ No newline at end of file