Skip to content

Commit

Permalink
ENV variable
Browse files Browse the repository at this point in the history
  • Loading branch information
kostya committed Jun 22, 2013
1 parent 9a20c62 commit c043936
Show file tree
Hide file tree
Showing 41 changed files with 217 additions and 108 deletions.
1 change: 1 addition & 0 deletions lib-topaz/bootstrap.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
load_bootstrap.call("comparable.rb")
load_bootstrap.call("enumerable.rb")
load_bootstrap.call("enumerator.rb")
load_bootstrap.call("env.rb")
load_bootstrap.call("errno.rb")
load_bootstrap.call("file.rb")
load_bootstrap.call("fixnum.rb")
Expand Down
161 changes: 161 additions & 0 deletions lib-topaz/env.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
class << ENV
def to_hash
{}.tap{ |h| self.each { |k, v| h[k] = v } }
end

def empty?
self.size == 0
end

def replace(hash)
hash = Topaz.convert_type(hash, Hash, :to_hash)
self.clear
hash.each { |k, v| self[k] = v }
self
end

def update(hash, &block)
hash = Topaz.convert_type(hash, Hash, :to_hash)
hash.each do |k, v|
if block && self[k]
self[k] = yield(k, self[k], v)
else
self[k] = v
end
end
self
end

def clear
self.each_key { |k| self[k] = nil }
end

def values
self.map { |_, v| v }
end

def keys
self.map { |k, _| k }
end

def value?(value)
self.each_value { |v| return true if v == value }
false
end
alias has_value? value?

def key(value)
self.each { |k, v| return k if v == value }
nil
end
alias index key

def each_value(&block)
return enum_for(:each_value) unless block
self.each { |_, v| yield(v) }
end

def each_key(&block)
return enum_for(:each_key) unless block
self.each { |k, _| yield(k) }
end

def assoc(key)
key = Topaz.convert_type(key, String, :to_str)
self.each { |k, v| return [k, v] if key == k }
nil
end

def rassoc(value)
value = Topaz.convert_type(value, String, :to_str)
self.each { |k, v| return [k, v] if value == v }
nil
end

def select!(&block)
return enum_for(:select!) unless block
modified = false
self.each do |key, value|
unless yield(key, value)
delete(key)
modified = true
end
end
modified ? self : nil
end

def keep_if(&block)
return enum_for(:keep_if) unless block
select!(&block)
self
end

def reject!(&block)
return enum_for(:reject!) unless block
modified = false
self.each do |key, value|
if yield(key, value)
delete(key)
modified = true
end
end
modified ? self : nil
end

def delete_if(&block)
return enum_for(:delete_if) unless block
reject!(&block)
self
end

def fetch(key, *args, &block)
val = self[key]
return val if val
return yield(key) if block
return args[0] if args.size == 1
raise KeyError.new("key not found")
end

def to_s
'ENV'
end

def inspect
to_hash.inspect
end

def shift
self.each do |k, v|
delete(k)
return [k, v]
end
nil
end

def values_at(*keys)
keys.map { |k| self[k] }
end

def invert
{}.tap { |h| self.each { |k, v| h[v] = k } }
end

def select(&block)
return enum_for(:select) unless block
to_hash.keep_if(&block)
end

def reject(&block)
return enum_for(:reject) unless block
to_hash.delete_if(&block)
end

def delete(key, &block)
key = Topaz.convert_type(key, String, :to_str)
if val = self[key]
self[key] = nil
return val
end
block ? yield(key) : nil
end
end
3 changes: 3 additions & 0 deletions lib-topaz/errno.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,7 @@ class EISDIR < SystemCallError

class ENOTEMPTY < SystemCallError
end

class EINVAL < SystemCallError
end
end
3 changes: 0 additions & 3 deletions spec/tags/core/env/assoc_tags.txt

This file was deleted.

1 change: 0 additions & 1 deletion spec/tags/core/env/clear_tags.txt

This file was deleted.

4 changes: 0 additions & 4 deletions spec/tags/core/env/delete_if_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/tags/core/env/each_key_tags.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
fails:ENV.each_key returns each key
fails:ENV.each_key returns an Enumerator if called without a block
fails:ENV.each_key returns keys in the locale encoding
3 changes: 0 additions & 3 deletions spec/tags/core/env/each_pair_tags.txt

This file was deleted.

3 changes: 0 additions & 3 deletions spec/tags/core/env/each_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/tags/core/env/each_value_tags.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
fails:ENV.each_value returns each value
fails:ENV.each_value returns an Enumerator if called without a block
fails:ENV.each_value uses the locale encoding
3 changes: 0 additions & 3 deletions spec/tags/core/env/element_reference_tags.txt

This file was deleted.

5 changes: 0 additions & 5 deletions spec/tags/core/env/element_set_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/tags/core/env/empty_tags.txt

This file was deleted.

4 changes: 0 additions & 4 deletions spec/tags/core/env/fetch_tags.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,2 @@
fails:ENV.fetch returns a value
fails:ENV.fetch raises IndexError for an invalid key
fails:ENV.fetch provides the given default parameter
fails:ENV.fetch provides a default value from a block
fails:ENV.fetch warns on block and default parameter given
fails:ENV.fetch uses the locale encoding
2 changes: 0 additions & 2 deletions spec/tags/core/env/has_key_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/tags/core/env/has_value_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/tags/core/env/include_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/tags/core/env/index_tags.txt

This file was deleted.

1 change: 0 additions & 1 deletion spec/tags/core/env/inspect_tags.txt

This file was deleted.

1 change: 0 additions & 1 deletion spec/tags/core/env/invert_tags.txt

This file was deleted.

4 changes: 0 additions & 4 deletions spec/tags/core/env/keep_if_tags.txt

This file was deleted.

4 changes: 0 additions & 4 deletions spec/tags/core/env/key_tags.txt

This file was deleted.

1 change: 0 additions & 1 deletion spec/tags/core/env/keys_tags.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
fails:ENV.keys returns all the keys
fails:ENV.keys returns the keys in the locale encoding
1 change: 0 additions & 1 deletion spec/tags/core/env/length_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/tags/core/env/member_tags.txt

This file was deleted.

3 changes: 0 additions & 3 deletions spec/tags/core/env/rassoc_tags.txt

This file was deleted.

10 changes: 0 additions & 10 deletions spec/tags/core/env/reject_tags.txt

This file was deleted.

1 change: 0 additions & 1 deletion spec/tags/core/env/replace_tags.txt

This file was deleted.

6 changes: 0 additions & 6 deletions spec/tags/core/env/select_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/tags/core/env/shift_tags.txt

This file was deleted.

1 change: 0 additions & 1 deletion spec/tags/core/env/size_tags.txt

This file was deleted.

10 changes: 0 additions & 10 deletions spec/tags/core/env/store_tags.txt

This file was deleted.

1 change: 0 additions & 1 deletion spec/tags/core/env/to_a_tags.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
fails:ENV.to_a returns the ENV as an array
fails:ENV.to_a returns the entries in the locale encoding
1 change: 0 additions & 1 deletion spec/tags/core/env/to_hash_tags.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
fails:ENV.to_hash returns the ENV as a hash
fails:ENV.to_hash uses the locale encoding for keys
fails:ENV.to_hash uses the locale encoding for values
1 change: 0 additions & 1 deletion spec/tags/core/env/to_s_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/tags/core/env/update_tags.txt

This file was deleted.

2 changes: 0 additions & 2 deletions spec/tags/core/env/value_tags.txt

This file was deleted.

1 change: 0 additions & 1 deletion spec/tags/core/env/values_at_tags.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
fails:ENV.values_at returns an array of the values referenced by the parameters as keys
fails:ENV.values_at uses the locale encoding
1 change: 0 additions & 1 deletion spec/tags/core/env/values_tags.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
fails:ENV.values returns an array of the values
fails:ENV.values uses the locale encoding
Loading

0 comments on commit c043936

Please sign in to comment.