phrase_assembler 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,110 @@
1
+ require './lib/PAProxies/PALinkProxy'
2
+ class PAAssembleProxy < PALinkProxy
3
+ attr_accessor :max_tokens_level
4
+
5
+ def new_instance(p_data)
6
+ return self.class.new(p_data, self.logger, self.grammar, false, false, self.max_tokens_level)
7
+ end
8
+
9
+ def method_missing(sym, *args, &block)
10
+ if args[0].is_a? Integer
11
+ proxy = super(sym, *args, &block)
12
+ proxy = proxy[args[0]]
13
+ args.delete_at(0)
14
+ elsif args[0]== :r
15
+ proxy = super(sym, *args, &block)
16
+ proxy = proxy[rand(proxy.data_length)]
17
+ args.delete_at(0)
18
+ else
19
+ proxy = super(sym, *args, &block)
20
+ end
21
+
22
+ if ((args[0].is_a? String) and (!args[0].empty?))
23
+ tokens = args[0].split(':', 2)
24
+ if tokens.length >= 1
25
+ args[0] = tokens[1]
26
+ else
27
+ args.delete_at(0)
28
+ end
29
+
30
+ if tokens[0].index(/\[(\d+|r)\]/).nil?
31
+ proxy = proxy.send(tokens[0].to_sym, *args, &block)
32
+ else
33
+ token_name = tokens[0][/[^\[]+/]
34
+ token_index = tokens[0][/\[(\d+|r)\]/][1...-1]
35
+ if token_index == "r"
36
+ token_index = :r
37
+ else
38
+ token_index = token_index.to_i
39
+ end
40
+ args.insert(0, token_index)
41
+ proxy = proxy.send(token_name.to_sym, *args, &block)
42
+ end
43
+ end
44
+ proxy
45
+ end
46
+
47
+ def data=(p_data)
48
+ @data = p_data
49
+ change_data(@data)
50
+ end
51
+
52
+ def change_data(p_data)
53
+ @data_changed = true
54
+ data_changing_iteration = 0
55
+ while(@data_changed)
56
+ @data_changed = false
57
+ change_sequence_tokens(p_data, p_data)
58
+ data_changing_iteration = data_changing_iteration + 1
59
+ raise "Tokens stack level too deep, max is: #{max_tokens_level}" if data_changing_iteration > max_tokens_level
60
+ end
61
+ end
62
+
63
+ def initialize(p_data = {}, logger = nil, grammar = {}, init_grammar = true, init_data = true, p_max_tokens_level = 5)
64
+ self.max_tokens_level = p_max_tokens_level
65
+ if init_data
66
+ change_data(p_data)
67
+ end
68
+ super(p_data, logger, grammar, init_grammar)
69
+ end
70
+
71
+ def change_sequence_tokens(p_data, root_data)
72
+ if p_data.is_a? Hash
73
+ p_data.each_key{|k| change_sequence_tokens(p_data[k], root_data)}
74
+ elsif p_data.is_a? Array
75
+ p_data.each_index{|index| change_sequence_tokens(p_data[index], root_data)}
76
+ elsif p_data.is_a? String
77
+ return change_sequence_token(p_data, root_data)
78
+ end
79
+ end
80
+
81
+ def change_sequence_token(p_data, root_data)
82
+ #TODO srediti da je regex takav da ne mora imati * u [^\{\}\*] dijelu
83
+ #p_data.gsub!(/\{\*[^(\{\*)(\*\})](:[^(\{\*)(\*\})])+\*\}/){|token|
84
+ p_data.gsub!(/\{\*@[^\{\}\*\?]+(:[^\{\}\*]+)*\*\}/){|tokens_seq|
85
+ tokens = tokens_seq[3...-2].split(':')
86
+ temp_proxy = PAProxy.new(root_data, self.logger)
87
+ for i in 0..tokens.length-1
88
+ if tokens[i].index(/\[(\d+|r)\]/).nil?
89
+ temp_proxy = temp_proxy.create_new_proxy(tokens[i].to_sym)
90
+ @data_changed = true
91
+ else
92
+ token_name = tokens[i][/[^\[]+/]
93
+ token_index = tokens[i][/\[(\d+|r)\]/][1...-1]
94
+ temp_proxy = temp_proxy.create_new_proxy(token_name.to_sym)
95
+ if token_index != "r"
96
+ token_index = token_index.to_i
97
+ else
98
+ token_index = rand(temp_proxy.data.length)
99
+ end
100
+ temp_proxy = temp_proxy[token_index]
101
+ @data_changed = true
102
+ end
103
+ end
104
+ unless temp_proxy.data.is_a? String
105
+ raise 'Not assembled to end'
106
+ end
107
+ temp_proxy.data.to_s
108
+ }
109
+ end
110
+ end
@@ -0,0 +1,27 @@
1
+ module PACacheProxy
2
+ def self.included(base)
3
+ base.send(:extend, ClassMethods)
4
+ end
5
+
6
+ module ClassMethods
7
+ def self.extended(base)
8
+ class << base
9
+ alias_method :new_without_cache, :new unless method_defined?(:new_without_cache)
10
+ alias_method :new, :new_with_cache
11
+ end
12
+ end
13
+
14
+ def new_with_cache(*args)
15
+ t_cache_id = self.cache_id(*args)
16
+ unless (t_cache_id.nil?) or (self.proxy_cache[t_cache_id].nil?)
17
+ self.proxy_cache[t_cache_id].set_uncacheable_args(*args)
18
+ object = self.proxy_cache[t_cache_id]
19
+ else
20
+ object = self.new_without_cache(*args)
21
+ self.proxy_cache[t_cache_id] = object unless t_cache_id.nil?
22
+ end
23
+ object
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,32 @@
1
+ require './lib/PAProxies/PAAssembleProxy'
2
+ require './lib/PAProxies/PAStringProxy'
3
+ require './lib/PAProxies/PACacheProxy'
4
+ class PACompositeProxy < PAAssembleProxy
5
+ include PAStringProxy
6
+ include PACacheProxy
7
+
8
+ def new_instance(p_data)
9
+ return self.class.new(p_data, self.logger, self.grammar, false, false, self.max_tokens_level)
10
+ end
11
+
12
+ @@proxy_cache = {}
13
+ def self.proxy_cache
14
+ @@proxy_cache
15
+ end
16
+
17
+ def set_uncacheable_args(p_data = {}, p_logger = nil, p_grammar = {}, init_grammar = true, init_data = true, max_tokens_level = 5)
18
+ end
19
+
20
+ def get_default_options
21
+
22
+ end
23
+
24
+ def self.cache_id(p_data = {}, logger = nil, options = {}, grammar = {}, init_grammar = true, init_data = true, max_tokens_level = 5)
25
+ if p_data.nil?
26
+ return nil
27
+ else
28
+ return "PAID_#{p_data.object_id.to_s}"
29
+ end
30
+ end
31
+
32
+ end
@@ -0,0 +1,86 @@
1
+ require './lib/PAProxies/PATokenProxy'
2
+ class PALangProxy < PATokenProxy
3
+ attr_accessor :grammar
4
+
5
+ def new_instance(p_data)
6
+ return self.class.new(p_data, self.logger, self.grammar, false)
7
+ end
8
+
9
+ def initialize(data = {}, logger = nil, grammar = {}, init_grammar = true)
10
+ if init_grammar
11
+ set_grammar(grammar)
12
+ else
13
+ @grammar = grammar
14
+ end
15
+ super(data, logger)
16
+ end
17
+
18
+ def set_grammar(grammar)
19
+ @grammar = HashAddOn.symbolize_keys_recursive_for_hash(grammar, true)
20
+ @grammar.each{|k, v|
21
+ if (v.is_a? Hash and (!v.has_key? :default))
22
+ @grammar[k][:default] = v.values.sort{|a, b| a <=> b}.join('/')
23
+ end
24
+ }
25
+ end
26
+
27
+ def load_grammar(file_name)
28
+ set_grammar(YAML::load(File.read(file_name)))
29
+ self
30
+ end
31
+
32
+ def get_grammar_token(key, g_value, values)
33
+ if @grammar[key].nil?
34
+ raise 'Grammar key not existing'
35
+ elsif !@grammar[key][g_value].nil?
36
+ return values[@grammar[key][g_value].to_i]
37
+ else
38
+ return @grammar[key][:default].gsub(/\d+/){|index|
39
+ values[index.to_i]
40
+ }
41
+ end
42
+ end
43
+
44
+ def substitute_token(p_data, add_options = {}, p_options = {})
45
+ #TODO srediti da je regex takav da ne mora imati * u [^\{\}\*] dijelu
46
+ #p_data.gsub(/\{\*[^(\{\*)(\*\})\?]+\?[^(\{\*)(\*\}):]+(:[^(\{\*)(\*\}):]+)+\*\}/){|token|
47
+ p_data.gsub!(/\{\*[^\{\}\*\?]+\?[^\{\}\*:]+(:[^\{\}\*:]+)+\*\}/){|token|
48
+ clear_token = token[2...-2]
49
+ key = clear_token[/[^\?]+/]
50
+ opt_params = key[/\(.+\)/]
51
+ unless opt_params.nil?
52
+ opt_params = opt_params[1...-1].split(',').collect{|v|
53
+ raise 'No param' if p_options.options_hash[v.strip.to_sym].nil?
54
+ p_options.options_hash[v.strip.to_sym]
55
+ }
56
+ end
57
+ key = key[/[^(\(.+\))]+/]
58
+ keys = key.split('_')
59
+ if keys.length <= 1
60
+ options_key = "default"
61
+ grammar_key = keys[0]
62
+ else
63
+ options_key = keys[0]
64
+ grammar_key = keys[1]
65
+ end
66
+
67
+ values = clear_token[/\?.+/][1..-1].split(':')
68
+ if p_options.options_hash.has_key?(options_key.to_sym)
69
+ if opt_params.nil?
70
+ grammar_value = p_options.options_hash[options_key.to_sym].send(:"get_#{grammar_key}")
71
+ else
72
+ grammar_value = p_options.options_hash[options_key.to_sym].send(:"get_#{grammar_key}", opt_params)
73
+ end
74
+ elsif p_options.options_hash.has_key?("#{options_key}_#{grammar_key}".to_sym)
75
+ grammar_value = p_options.options_hash["#{options_key}_#{grammar_key}".to_sym]
76
+ end
77
+ if grammar_value.nil?
78
+ raise 'No token for lang'
79
+ end
80
+ add_options["!#{clear_token}"] = get_grammar_token(grammar_key.to_sym, grammar_value.to_sym, values)
81
+ "{*!#{clear_token}*}"
82
+ }
83
+ return super(p_data, add_options, p_options)
84
+ end
85
+ end
86
+
@@ -0,0 +1,37 @@
1
+ require './lib/PAProxies/PALangProxy'
2
+ class PALinkProxy < PALangProxy
3
+ def new_instance(p_data)
4
+ return self.class.new(p_data, self.logger, self.grammar, false)
5
+ end
6
+
7
+ def substitute_token(p_data, add_options = {}, p_options = {})
8
+ #TODO srediti da je regex takav da ne mora imati * u [^\{\}\*] dijelu
9
+ #@data.gsub!(/\{\*[^(\{\*)(\*\})]+->[^(\{\*)(\*\})]+\*\}/){|link_token|
10
+ p_data.gsub!(/\{\*[^\{\*\})]+->[^\{\*\})]+\*\}/){|link_token|
11
+ link_data = link_token.split("->")
12
+ link_text = link_data[0][2..-1]
13
+ link_url = link_data[1][0...-2]
14
+
15
+ unless(link_text.index(/'[^'"]+'/).nil? and link_text.index(/"[^'"]+"/).nil?)
16
+ link_text = "#{link_text[1...-1]}"
17
+ else
18
+ link_text = "{*#{link_text}*}"
19
+ end
20
+
21
+ if p_options.options_hash[link_url.to_sym].is_a? Hash
22
+ identifier = "!link_url_#{link_url.object_id}"
23
+ add_options[identifier] = p_options.options_hash[link_url.to_sym][:href]
24
+ add_attributes = ""
25
+ p_options.options_hash[link_url.to_sym].keys.sort{|a,b| a.to_s <=> b.to_s}.collect{|k|
26
+ add_attributes += " #{k} = '#{p_options.options_hash[link_url.to_sym][k]}'" if k != :href
27
+ }
28
+ result = "<a href = '{*#{identifier}*}'#{add_attributes}>#{link_text}</a>"
29
+ else
30
+ result = "<a href = '{*#{link_url}*}'>#{link_text}</a>"
31
+ end
32
+
33
+ result
34
+ }
35
+ return super(p_data, add_options, p_options)
36
+ end
37
+ end
@@ -0,0 +1,20 @@
1
+ require './lib/PAProxies/PAProxyData'
2
+ class PAProxy < PAProxyData
3
+ def new_instance(p_data)
4
+ return self.class.new(p_data, self.logger)
5
+ end
6
+
7
+ def method_missing(sym, *args, &block)
8
+ create_new_proxy(sym)
9
+ end
10
+
11
+ def create_new_proxy(sym)
12
+ if @data.has_key?(sym)
13
+ return new_instance(@data[sym])
14
+ elsif @data.has_key?(sym.to_s)
15
+ return new_instance(@data[sym.to_s])
16
+ else
17
+ raise "Could not assemble: "
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,39 @@
1
+ require 'yaml'
2
+ class PAProxyData
3
+ attr_accessor :data
4
+ attr_accessor :logger
5
+
6
+ def initialize(p_data = {}, p_logger = nil)
7
+ self.data = p_data
8
+ self.logger = p_logger
9
+ self
10
+ end
11
+
12
+ def data_length
13
+ @data.length
14
+ end
15
+
16
+ def load(file_name)
17
+ self.data = HashAddOn.symbolize_keys_recursive_for_hash(YAML::load(File.read(file_name)), true)
18
+ self
19
+ end
20
+
21
+ def new_instance(p_data)
22
+ return self.class.new(p_data, self.logger)
23
+ end
24
+
25
+ def [](index)
26
+ if @data.is_a? Array
27
+ if index == :r
28
+ return new_instance(@data[rand(@data.length)])
29
+ elsif index < @data.length
30
+ return new_instance(@data[index])
31
+ else
32
+ raise 'out of bonds'
33
+ end
34
+ else
35
+ raise 'Non array'
36
+ end
37
+ end
38
+
39
+ end
@@ -0,0 +1,12 @@
1
+ module PAStringProxy
2
+ def to_s(p_options = nil)
3
+ temp_data = get_data(p_options)
4
+ if temp_data.is_a? Array
5
+ raise "Can not put Array to String"
6
+ elsif temp_data.is_a? Hash
7
+ raise "Can not put Hash to String"
8
+ else
9
+ return temp_data.to_s
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,97 @@
1
+ require './lib/PAProxies/PAProxy'
2
+ class PATokenProxyOptions
3
+ attr_accessor :options_hash
4
+ attr_accessor :indices_hash
5
+
6
+ def self.new_if_needed(p_options)
7
+ if (p_options.is_a? PATokenProxyOptions)
8
+ return p_options
9
+ else
10
+ return self.new(p_options)
11
+ end
12
+ end
13
+
14
+ def reset
15
+ calculate_indices(options_hash) if !@added_indices
16
+ @added_indices = true
17
+ end
18
+
19
+ def initialize(p_options)
20
+ self.options_hash = p_options
21
+ self.indices_hash = {}
22
+ reset
23
+ end
24
+
25
+ def get_current_index(array)
26
+ return indices_hash[array.object_id.to_s]
27
+ end
28
+
29
+ def inc_index(array)
30
+ indices_hash[array.object_id.to_s] = indices_hash[array.object_id.to_s] + 1
31
+ if indices_hash[array.object_id.to_s] >= array.length
32
+ indices_hash[array.object_id.to_s]= 0
33
+ end
34
+ end
35
+
36
+ private
37
+ def calculate_indices(hash)
38
+ if hash.is_a? Array
39
+ indices_hash[hash.object_id.to_s] = 0
40
+ hash.each{|hash_element| calculate_indices(hash_element)}
41
+ elsif hash.is_a? Hash
42
+ hash.each_value{|val| calculate_indices(val)}
43
+ end
44
+ end
45
+ end
46
+
47
+ class PATokenProxy < PAProxy
48
+ def new_instance(p_data)
49
+ return self.class.new(p_data, self.logger)
50
+ end
51
+
52
+ def get_data(p_options = {})
53
+ substitute_tokens(self.data, PATokenProxyOptions.new_if_needed(p_options))
54
+ end
55
+
56
+ def substitute_tokens(p_data, p_options)
57
+ if p_data.is_a? Hash
58
+ return substitute_hash(p_data, p_options)
59
+ elsif p_data.is_a? Array
60
+ return p_data.collect{|v| substitute_tokens(v, p_options)}
61
+ elsif p_data.is_a? String
62
+ return substitute_token(String.new(p_data), {}, p_options)
63
+ end
64
+ end
65
+
66
+ def substitute_hash(p_data, p_options)
67
+ t_hash = {}
68
+ p_data.keys.sort{|a, b| a.to_s <=> b.to_s}.each{|k| t_hash[k] = substitute_tokens(p_data[k], p_options)}
69
+ return t_hash
70
+ end
71
+
72
+ def substitute_token(p_data, add_options = {}, p_options = {})
73
+ #TODO srediti da je regex takav da ne mora imati * u [^\{\}\*] dijelu
74
+ #return_p_data = p_data.gsub(/\{\*[^(\{\*)(\*\})]+\*\}/){|token|
75
+ return_p_data = p_data.gsub(/\{\*[^\{\}\*]+\*\}/){|token|
76
+ sym_token = token[2...-2]
77
+ if sym_token[0...1]!="!"
78
+ sym_token = sym_token.to_sym
79
+ end
80
+
81
+ add_options.merge!(p_options.options_hash)
82
+
83
+ if add_options[sym_token].nil?
84
+ raise 'No token value'
85
+ elsif add_options[sym_token].is_a? Array
86
+ result = add_options[sym_token][p_options.get_current_index(add_options[sym_token])]
87
+ p_options.inc_index(add_options[sym_token])
88
+ else
89
+ result = add_options[sym_token]
90
+ end
91
+
92
+ result
93
+ }
94
+ return_p_data
95
+ end
96
+
97
+ end
@@ -0,0 +1,33 @@
1
+ module HashAddOn
2
+ def self.symbolize_keys_recursive_for_hash(hash, downcase)
3
+ if hash.is_a? Hash
4
+ sym_hash = {}
5
+
6
+ hash.each{|key, value|
7
+ if (downcase)
8
+ if (key.is_a? String)
9
+ down_key = key.downcase
10
+ else
11
+ down_key = key.to_s.downcase
12
+ end
13
+ else
14
+ down_key = key
15
+ end
16
+ sym_hash[down_key.to_sym] = value
17
+ }
18
+
19
+ sym_hash.keys.each{|key|
20
+ if (sym_hash[key].is_a? Hash or sym_hash[key].is_a? Array)
21
+ sym_hash[key] = self.symbolize_keys_recursive_for_hash(sym_hash[key], downcase)
22
+ end
23
+ }
24
+ return sym_hash
25
+ elsif hash.is_a? Array
26
+ hash = hash.collect{|val| self.symbolize_keys_recursive_for_hash(val, downcase)}
27
+ return hash
28
+ else
29
+ return hash
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,97 @@
1
+ require './lib/PAProxies/PACompositeProxy'
2
+ module PhraseAssembler
3
+ def supress_errors
4
+ @@supress_errors
5
+ end
6
+
7
+ def supress_errors=(value)
8
+ @@supress_errors = value
9
+ end
10
+
11
+ def self.included(base)
12
+ base.send :extend, InitMethods
13
+ base.instance_eval do
14
+ def self._fields
15
+ self.send(:class_variable_get, :@@_fields)
16
+ end
17
+
18
+ def self._fields=(value)
19
+ self.send(:class_variable_set, :@@_fields, value)
20
+ end
21
+
22
+ def self._default_pref_language
23
+ self.send(:class_variable_get, :@@_default_pref_language)
24
+ end
25
+
26
+ def self._default_pref_language=(value)
27
+ self.send(:class_variable_set, :@@_default_pref_language, value)
28
+ end
29
+
30
+ def self._languages
31
+ self.send(:class_variable_get, :@@_languages)
32
+ end
33
+
34
+ def self._languages=(value)
35
+ self.send(:class_variable_set, :@@_languages, value)
36
+ end
37
+
38
+ def self._grammars
39
+ self.send(:class_variable_get, :@@_grammars)
40
+ end
41
+
42
+ def self._grammars=(value)
43
+ self.send(:class_variable_set, :@@_grammars, value)
44
+ end
45
+
46
+ def self._languages_files_path
47
+ self.send(:class_variable_get, :@@_languages_files_path)
48
+ end
49
+
50
+ def self._languages_files_path=(value)
51
+ self.send(:class_variable_set, :@@_languages_files_path, value)
52
+ end
53
+
54
+ def self._logger
55
+ self.send(:class_variable_get, :@@_logger)
56
+ end
57
+
58
+ def self._logger=(value)
59
+ self.send(:class_variable_set, :@@_logger, value)
60
+ end
61
+ end
62
+ end
63
+
64
+ module InitMethods
65
+
66
+ def acts_as_phrase_assembler(options = {})
67
+ self._fields = (options[:fields] || {:sex => :sex, :pref_language => :pref_language} )
68
+ self._default_pref_language = (options[:default_pref_language] || 'hr')
69
+ self._languages = (options[:languages] || {'hr' => 'croatian.yml', 'rs' => 'serbian.yml', 'si' => 'slovenian.yml'})
70
+ self._grammars = (options[:grammars] || {'hr' => 'croatian_grammar.yml', 'rs' => 'serbian_grammar.yml', 'si' => 'slovenian_grammar.yml'})
71
+ self._languages_files_path = (options[:languages_files_path] || File.join(RAILS_ROOT, 'app', 'yaml', 'languages'))
72
+ self._logger = (options[:logger] || RAILS_DEFAULT_LOGGER)
73
+
74
+ send :include, InstanceMethods
75
+ end
76
+ end
77
+
78
+ module InstanceMethods
79
+ attr_reader :phrase
80
+
81
+ @@proxies = {}
82
+ def phrase
83
+ t_pref_language = self.send(self.class._fields[:pref_language])
84
+ t_pref_language = self.class._default_pref_language if (t_pref_language.nil? or t_pref_language.empty?)
85
+ if @@proxies[t_pref_language].nil?
86
+ @@proxies[t_pref_language] = PACompositeProxy.new(nil, self.class._logger)
87
+ @@proxies[t_pref_language].load(File.join(self.class._languages_files_path, self.class._languages[t_pref_language]) )
88
+ @@proxies[t_pref_language].load_grammar(File.join(self.class._languages_files_path, self.class._grammars[t_pref_language]))
89
+ end
90
+ @@proxies[t_pref_language]
91
+ end
92
+
93
+ def get_sex
94
+ self.send(self.class._fields[:sex])
95
+ end
96
+ end
97
+ end
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: phrase_assembler
3
+ version: !ruby/object:Gem::Version
4
+ hash: 13
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 9
10
+ version: 0.0.9
11
+ platform: ruby
12
+ authors:
13
+ - "Lovro \xC5\xBDmak, Radan Skori\xC4\x87, Drap"
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-02-09 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rspec
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ description: Gem for building phrases from yml
36
+ email: lovro.zmak@drap.hr
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - lib/hash_add_on.rb
45
+ - lib/PAProxies/PAAssembleProxy.rb
46
+ - lib/PAProxies/PACacheProxy.rb
47
+ - lib/PAProxies/PACompositeProxy.rb
48
+ - lib/PAProxies/PALangProxy.rb
49
+ - lib/PAProxies/PALinkProxy.rb
50
+ - lib/PAProxies/PAProxy.rb
51
+ - lib/PAProxies/PAProxyData.rb
52
+ - lib/PAProxies/PAStringProxy.rb
53
+ - lib/PAProxies/PATokenProxy.rb
54
+ - lib/phrase_assembler.rb
55
+ has_rdoc: true
56
+ homepage: http://www.drap.hr
57
+ licenses: []
58
+
59
+ post_install_message:
60
+ rdoc_options: []
61
+
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ hash: 3
70
+ segments:
71
+ - 0
72
+ version: "0"
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ hash: 3
79
+ segments:
80
+ - 0
81
+ version: "0"
82
+ requirements: []
83
+
84
+ rubyforge_project: nowarning
85
+ rubygems_version: 1.4.2
86
+ signing_key:
87
+ specification_version: 3
88
+ summary: Gem for building phrases
89
+ test_files: []
90
+