ajax-cat 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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