phrase_assembler 0.0.9

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.
@@ -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
+