ajax-cat 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -10,6 +10,8 @@ gem 'sinatra', "~> 1.3.2"
10
10
  gem 'colorize', "~> 0.5.8"
11
11
  gem "thin", "~> 1.3.1"
12
12
  gem "thor", "~> 0.15.2"
13
+ gem "sqlite3-ruby", "~> 1.3.3"
14
+ gem "activerecord"
13
15
 
14
16
  group :development do
15
17
  gem "rdoc", "~> 3.12"
data/Gemfile.lock CHANGED
@@ -1,17 +1,32 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
+ activemodel (3.2.3)
5
+ activesupport (= 3.2.3)
6
+ builder (~> 3.0.0)
7
+ activerecord (3.2.3)
8
+ activemodel (= 3.2.3)
9
+ activesupport (= 3.2.3)
10
+ arel (~> 3.0.2)
11
+ tzinfo (~> 0.3.29)
12
+ activesupport (3.2.3)
13
+ i18n (~> 0.6)
14
+ multi_json (~> 1.0)
15
+ arel (3.0.2)
16
+ builder (3.0.0)
4
17
  colorize (0.5.8)
5
18
  curb (0.8.0)
6
19
  daemons (1.1.8)
7
20
  eventmachine (0.12.10)
8
21
  git (1.2.5)
22
+ i18n (0.6.0)
9
23
  jeweler (1.8.3)
10
24
  bundler (~> 1.0)
11
25
  git (>= 1.2.5)
12
26
  rake
13
27
  rdoc
14
28
  json (1.6.6)
29
+ multi_json (1.3.5)
15
30
  rack (1.4.1)
16
31
  rack-protection (1.2.0)
17
32
  rack
@@ -27,17 +42,22 @@ GEM
27
42
  rack (~> 1.3, >= 1.3.6)
28
43
  rack-protection (~> 1.2)
29
44
  tilt (~> 1.3, >= 1.3.3)
45
+ sqlite3 (1.3.6)
46
+ sqlite3-ruby (1.3.3)
47
+ sqlite3 (>= 1.3.3)
30
48
  thin (1.3.1)
31
49
  daemons (>= 1.0.9)
32
50
  eventmachine (>= 0.12.6)
33
51
  rack (>= 1.0.0)
34
52
  thor (0.15.2)
35
53
  tilt (1.3.3)
54
+ tzinfo (0.3.33)
36
55
 
37
56
  PLATFORMS
38
57
  ruby
39
58
 
40
59
  DEPENDENCIES
60
+ activerecord
41
61
  bundler (~> 1.0.0)
42
62
  colorize (~> 0.5.8)
43
63
  curb (~> 0.8.0)
@@ -45,5 +65,6 @@ DEPENDENCIES
45
65
  rdoc (~> 3.12)
46
66
  shoulda (~> 3.0.1)
47
67
  sinatra (~> 1.3.2)
68
+ sqlite3-ruby (~> 1.3.3)
48
69
  thin (~> 1.3.1)
49
70
  thor (~> 0.15.2)
data/Rakefile CHANGED
@@ -24,15 +24,21 @@ end
24
24
  Jeweler::RubygemsDotOrgTasks.new
25
25
 
26
26
  require 'rake/testtask'
27
+ Rake::TestTask.new(:test) do |test|
28
+ test.libs << 'lib' << 'test'
29
+ test.test_files = FileList['test/unit/test_*.rb','test/integration/test_*.rb']
30
+ test.verbose = false
31
+ end
32
+
27
33
  namespace :test do
28
34
  Rake::TestTask.new(:unit) do |test|
29
35
  test.libs << 'lib' << 'test'
30
- test.test_files = FileList['test/unit/test_*.rb','test/integration/*.rb']
36
+ test.test_files = FileList['test/unit/test_*.rb']
31
37
  test.verbose = false
32
38
  end
33
39
  Rake::TestTask.new(:integration) do |test|
34
40
  test.libs << 'lib' << 'test'
35
- test.test_files = FileList['test/integration/*.rb']
41
+ test.test_files = FileList['test/integration/test_*.rb']
36
42
  test.verbose = false
37
43
  end
38
44
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.0
data/ajax-cat.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "ajax-cat"
8
- s.version = "0.3.0"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ondrej Odchazel"]
12
- s.date = "2012-05-16"
12
+ s.date = "2012-05-22"
13
13
  s.description = "computer-aided translation backed by machine translation"
14
14
  s.email = "odchazel@gmail.com"
15
15
  s.executables = ["ajax-cat"]
@@ -30,8 +30,10 @@ Gem::Specification.new do |s|
30
30
  "lib/.DS_Store",
31
31
  "lib/ajax-cat.rb",
32
32
  "lib/ajax-cat/ajax_cat_server.rb",
33
+ "lib/ajax-cat/log.rb",
33
34
  "lib/ajax-cat/logger.rb",
34
35
  "lib/ajax-cat/moses_pair.rb",
36
+ "lib/ajax-cat/pairs.rb",
35
37
  "lib/ajax-cat/public/AjaxCatList.coffee",
36
38
  "lib/ajax-cat/public/AjaxCatTranslation.coffee",
37
39
  "lib/ajax-cat/public/Suggestions.coffee",
@@ -49,8 +51,16 @@ Gem::Specification.new do |s|
49
51
  "lib/ajax-cat/public/translation.js",
50
52
  "lib/ajax-cat/request/raw.rb",
51
53
  "lib/ajax-cat/request/simple.rb",
54
+ "lib/ajax-cat/request/suggestion.rb",
55
+ "lib/ajax-cat/request/table.rb",
56
+ "lib/ajax-cat/task.rb",
57
+ "lib/ajax-cat/views/admin.erb",
58
+ "lib/ajax-cat/views/experiment.erb",
59
+ "logs.db",
60
+ "test/fixtures/ajax-cat.ini.json",
52
61
  "test/fixtures/europarl.srilm.gz",
53
62
  "test/fixtures/moses.ini",
63
+ "test/fixtures/nbest.txt",
54
64
  "test/fixtures/phrase-table",
55
65
  "test/fixtures/translation_table",
56
66
  "test/helper.rb",
@@ -58,8 +68,11 @@ Gem::Specification.new do |s|
58
68
  "test/unit/.DS_Store",
59
69
  "test/unit/test_logger.rb",
60
70
  "test/unit/test_moses_pair.rb",
71
+ "test/unit/test_pairs.rb",
61
72
  "test/unit/test_raw_request.rb",
62
- "test/unit/test_simple_request.rb"
73
+ "test/unit/test_simple_request.rb",
74
+ "test/unit/test_suggestion_request.rb",
75
+ "test/unit/test_table_request.rb"
63
76
  ]
64
77
  s.homepage = "http://github.com/hypertornado/ajax-cat"
65
78
  s.licenses = ["MIT"]
@@ -75,6 +88,8 @@ Gem::Specification.new do |s|
75
88
  s.add_runtime_dependency(%q<colorize>, ["~> 0.5.8"])
76
89
  s.add_runtime_dependency(%q<thin>, ["~> 1.3.1"])
77
90
  s.add_runtime_dependency(%q<thor>, ["~> 0.15.2"])
91
+ s.add_runtime_dependency(%q<sqlite3-ruby>, ["~> 1.3.3"])
92
+ s.add_runtime_dependency(%q<activerecord>, [">= 0"])
78
93
  s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
79
94
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
80
95
  s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
@@ -85,6 +100,8 @@ Gem::Specification.new do |s|
85
100
  s.add_dependency(%q<colorize>, ["~> 0.5.8"])
86
101
  s.add_dependency(%q<thin>, ["~> 1.3.1"])
87
102
  s.add_dependency(%q<thor>, ["~> 0.15.2"])
103
+ s.add_dependency(%q<sqlite3-ruby>, ["~> 1.3.3"])
104
+ s.add_dependency(%q<activerecord>, [">= 0"])
88
105
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
89
106
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
90
107
  s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
@@ -96,6 +113,8 @@ Gem::Specification.new do |s|
96
113
  s.add_dependency(%q<colorize>, ["~> 0.5.8"])
97
114
  s.add_dependency(%q<thin>, ["~> 1.3.1"])
98
115
  s.add_dependency(%q<thor>, ["~> 0.15.2"])
116
+ s.add_dependency(%q<sqlite3-ruby>, ["~> 1.3.3"])
117
+ s.add_dependency(%q<activerecord>, [">= 0"])
99
118
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
100
119
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
101
120
  s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
data/bin/ajax-cat CHANGED
@@ -4,11 +4,26 @@ require_relative('../lib/ajax-cat.rb')
4
4
 
5
5
  case ARGV.first
6
6
  when "start"
7
- AjaxCat::Starter.start(8585, true)
8
- when "stop"
9
- puts "Stopping ajax-cat server."
10
- AjaxCat::Starter.stop
11
- puts "Server stopped."
7
+ AjaxCat::Runner.new(8585)
8
+ when "-v", "--version"
9
+ puts VERSION
10
+ exit 0
11
+ when "-h", "--help"
12
+ puts "no help yet, look at https://github.com/hypertornado/ajax-cat"
13
+ exit 0
14
+ when "example"
15
+ begin
16
+ example = AjaxCat::Runner.example
17
+ f = File.open("ajax-cat.ini.json", "w")
18
+ f.write(example)
19
+ f.close
20
+ rescue
21
+ puts "Can't create example ajax-cat configuration file in #{Dir.pwd}".red
22
+ exit 1
23
+ end
24
+ puts "example ajax-cat configuration file created at #{Dir.pwd+'/ajax-cat.ini.json'}".green
25
+ exit 0
12
26
  else
13
27
  puts "Unknown command."
28
+ exit 0
14
29
  end
data/lib/ajax-cat.rb CHANGED
@@ -5,34 +5,121 @@ require 'thin'
5
5
  require 'json'
6
6
  require 'thread'
7
7
  require 'colorize'
8
+ require 'sqlite3'
9
+ require 'active_record'
8
10
  require_relative 'ajax-cat/moses_pair.rb'
11
+ require_relative 'ajax-cat/pairs.rb'
9
12
  require_relative 'ajax-cat/request/raw.rb'
10
13
  require_relative 'ajax-cat/request/simple.rb'
14
+ require_relative 'ajax-cat/request/table.rb'
15
+ require_relative 'ajax-cat/request/suggestion.rb'
11
16
  require_relative 'ajax-cat/ajax_cat_server.rb'
12
17
  require_relative 'ajax-cat/logger.rb'
18
+ require_relative 'ajax-cat/log.rb'
19
+ require_relative 'ajax-cat/task.rb'
13
20
 
14
- module AjaxCat
21
+ VERSION = File.read(File.dirname(__FILE__) + "/../VERSION")
22
+ DEFAULT_PORT = 8585
15
23
 
16
- class Starter
24
+ module AjaxCat
17
25
 
18
- def self.pair
19
- @@pair
26
+ class Runner
27
+ def self.pairs
28
+ @@pairs
20
29
  end
21
30
 
22
- def self.start(port = 8585, silent = false)
31
+ def initialize(port = DEFAULT_PORT, silent = true)
23
32
  logger = Logger.new
24
33
  logger.log "starting ajax-cat"
25
34
  Thin::Logging.silent = silent
26
- @@pair = MosesPair.new('cs-en',"moses","/Users/ondrejodchazel/projects/ajax-cat/ajax-cat-new/test/fixtures/moses.ini")
35
+ @settings = JSON.parse(File.read("ajax-cat.ini.json"))
36
+ port = @settings["port"] if port == DEFAULT_PORT
37
+ @@pairs = Pairs.new(@settings)
27
38
  Dir.chdir(Dir.home)
28
39
  Dir.mkdir('.ajax-cat') unless Dir.exist?('.ajax-cat')
29
40
  builder = Rack::Builder.new do
30
41
  map('/'){ run AjaxCatServer }
31
42
  end
32
43
  logger.log "starting server on port #{port}"
44
+ @server = builder
33
45
  Rack::Handler::Thin.run builder, :Port => port
34
- logger.log "shutting down ajax-cat server"
46
+ logger.log "ajax-cat server shutted down"
47
+ end
48
+
49
+ def self.example
50
+ ret = <<-END.gsub(/^ {8}/, '')
51
+ {
52
+ "port": #{DEFAULT_PORT},
53
+ "pairs": [
54
+ {
55
+ "name": "de-en",
56
+ "moses_path": "moses",
57
+ "moses_ini_path": "#{File.dirname(__FILE__) + "/../test/fixtures/moses.ini"}"
58
+ }
59
+ ]
60
+ }
61
+ END
62
+ ret
35
63
  end
64
+
65
+ def self.create_sample_moses_ini
66
+ path = File.dirname(__FILE__) + "/../test/fixtures/"
67
+ @moses_ini = <<-END.gsub(/^ {6}/, '')
68
+ #########################
69
+ ### MOSES CONFIG FILE ###
70
+ #########################
71
+
72
+ # input factors
73
+ [input-factors]
74
+ 0
75
+
76
+ # mapping steps, either (T) translation or (G) generation
77
+ [mapping]
78
+ T 0
79
+
80
+ # translation tables: source-factors, target-factors, number of scores, file
81
+ [ttable-file]
82
+ 0 0 0 1 #{path}phrase-table
83
+
84
+ # language models: type(srilm/irstlm/kenlm), factors, order, file
85
+ [lmodel-file]
86
+ 8 0 3 #{path}europarl.srilm.gz
87
+
88
+ # limit on how many phrase translations e for each phrase f are loaded
89
+ [ttable-limit]
90
+ 10
91
+
92
+ # distortion (reordering) weight
93
+ [weight-d]
94
+ 1
95
+
96
+ # language model weights
97
+ [weight-l]
98
+ 1
99
+
100
+ # translation model weights
101
+ [weight-t]
102
+ 1
103
+
104
+ # word penalty
105
+ [weight-w]
106
+ 0
107
+
108
+ [n-best-list]
109
+ nbest.txt
110
+ 100
111
+
112
+
113
+
114
+ END
115
+ f = File.new(File.dirname(__FILE__) + "/../test/fixtures/moses.ini", "w")
116
+ f.write(@moses_ini)
117
+ f.close
118
+
119
+
120
+ end
121
+
36
122
  end
37
123
 
38
- end
124
+ end
125
+
@@ -3,17 +3,85 @@ module AjaxCat
3
3
 
4
4
  class AjaxCatServer < Sinatra::Base
5
5
 
6
- configure :production, :development do
7
- disable :logging
8
- end
9
-
10
6
  get '/' do
11
- "hello world"
7
+ redirect "/index.html"
12
8
  end
13
9
 
14
10
  get '/api/raw' do
15
11
  req = Request::Raw.new(params[:q])
16
- Starter.pair.process_request(req)
12
+ halt 404 unless Runner.pairs.list.member?(params[:pair])
13
+ Runner.pairs.process_request(req, params[:pair])
14
+ end
15
+
16
+ get '/api/table' do
17
+ req = Request::Table.new(params[:q])
18
+ halt 404 unless Runner.pairs.list.member?(params[:pair])
19
+ Runner.pairs.process_request(req, params[:pair]).to_json
20
+ end
21
+
22
+ get '/api/suggestion' do
23
+ req = Request::Suggestion.new(params[:q], params[:covered], params[:translated])
24
+ halt 404 unless Runner.pairs.list.member?(params[:pair])
25
+ Runner.pairs.process_request(req, params[:pair]).to_json
26
+ end
27
+
28
+ get '/api/info' do
29
+ {
30
+ "pairs" => Runner.pairs.list
31
+ }.to_json
32
+ end
33
+
34
+ get '/admin' do
35
+ @pairs = Runner.pairs.list
36
+ erb :admin, locals: {pairs: @pairs}
37
+ end
38
+
39
+ post '/admin/add_task' do
40
+ Task.new(pair: params[:pair], sentence: params[:sentence]).save
41
+ redirect '/admin'
42
+ end
43
+
44
+ post '/admin/remove_task' do
45
+ Task.find(params[:id]).destroy
46
+ redirect '/admin'
47
+ end
48
+
49
+ get '/admin/get_experiment' do
50
+ email = params["email"]
51
+ pair = params["pair"]
52
+
53
+ tasks = Task.where(pair: pair)
54
+ tasks = tasks.map {|el| el.id}
55
+ completed = Log.where(email: email)
56
+ completed = completed.map {|el| el.task_id}
57
+
58
+ pool = tasks - completed
59
+
60
+ #puts "tasks: #{tasks.inspect}, completed: #{completed.inspect}, pool: #{pool.inspect}"
61
+
62
+ @task = Task.find(pool.first)
63
+ {
64
+ task_id: @task.id,
65
+ pair: @task.pair,
66
+ sentence: @task.sentence,
67
+ email: email
68
+ }.to_json
69
+ end
70
+
71
+ post '/admin/save_experiment' do
72
+ data = JSON.parse(params[:log])
73
+ @task = Task.find(data["task_id"])
74
+ @log = Log.new()
75
+ @log.task_id = @task.id
76
+ @log.email = data["email"]
77
+ @log.time = Time.now
78
+ @log.log = data.to_json
79
+ @log.save
80
+ end
81
+
82
+ get '/experiment/:id' do
83
+ @task = Task.find(params[:id])
84
+ erb :experiment, locals: {task: @task}
17
85
  end
18
86
 
19
87
  end
@@ -0,0 +1,6 @@
1
+
2
+
3
+ class Log < ActiveRecord::Base
4
+ belongs_to :task
5
+
6
+ end
@@ -7,11 +7,10 @@ module AjaxCat
7
7
  @request_queue = []
8
8
  @name = name
9
9
  @queue_lock = Mutex.new
10
- Dir.chdir(Dir.home + "/.ajax-cat")
11
10
  @fifo_path = "#{Dir.home}/.ajax-cat/#{name}_fifo.fifo"
12
- system("rm #{@fifo_path}; mkfifo #{@fifo_path}")
11
+ system("rm -f #{@fifo_path}; mkfifo #{@fifo_path}")
13
12
  t1 = Thread.new{reader()}
14
- @pipe = IO.popen("#{moses_path} -f #{moses_ini_path} -n-best-list - 300 distinct > #{@fifo_path} 2>/dev/null", "w")
13
+ @pipe = IO.popen("#{moses_path} -f #{moses_ini_path} -n-best-list - 300 distinct -include-alignment-in-n-best true -continue-partial-translation true > #{@fifo_path} 2>/dev/null", "w")
15
14
  process_request(Request::Raw.new("start_test"))
16
15
  @logger.log "pair started".green
17
16
  end
@@ -26,7 +25,7 @@ module AjaxCat
26
25
  @queue_lock.synchronize do
27
26
  request.lock.lock
28
27
  @request_queue.push(request)
29
- process_string(request.sentence)
28
+ process_string(request.prepare_moses_request)
30
29
  end
31
30
  #TODO: avoid active waiting somehow
32
31
  until request.processed