sugar-high 0.4.0 → 0.4.3

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.
Files changed (34) hide show
  1. data/VERSION +1 -1
  2. data/lib/sugar-high/array.rb +58 -7
  3. data/lib/sugar-high/class_ext.rb +11 -0
  4. data/lib/sugar-high/enumerable.rb +67 -0
  5. data/lib/sugar-high/file.rb +24 -76
  6. data/lib/sugar-high/file_ext.rb +65 -0
  7. data/lib/sugar-high/file_mutate.rb +45 -192
  8. data/lib/sugar-high/file_mutate/append_content.rb +17 -0
  9. data/lib/sugar-high/file_mutate/delete.rb +29 -0
  10. data/lib/sugar-high/file_mutate/insert_content.rb +62 -0
  11. data/lib/sugar-high/file_mutate/mutate.rb +58 -0
  12. data/lib/sugar-high/file_mutate/overwrite_content.rb +17 -0
  13. data/lib/sugar-high/file_mutate/remove_content.rb +33 -0
  14. data/lib/sugar-high/file_mutate/replace_content.rb +45 -0
  15. data/lib/sugar-high/kind_of.rb +8 -43
  16. data/lib/sugar-high/string.rb +5 -0
  17. data/spec/fixtures/application_file.rb +1 -0
  18. data/spec/fixtures/class_file.rb +15 -0
  19. data/spec/fixtures/content_file.txt +1 -0
  20. data/spec/fixtures/file.txt +1 -0
  21. data/spec/fixtures/routes_file.rb +16 -0
  22. data/spec/sugar-high/array_spec.rb +44 -3
  23. data/spec/sugar-high/file/file_dsl_spec.rb +4 -0
  24. data/spec/sugar-high/file_mutate/append_content_spec.rb +60 -0
  25. data/spec/sugar-high/file_mutate/delete_spec.rb +47 -0
  26. data/spec/sugar-high/file_mutate/insert_before_last_spec.rb +56 -0
  27. data/spec/sugar-high/file_mutate/insert_content_spec.rb +111 -0
  28. data/spec/sugar-high/file_mutate/overwrite_content_spec.rb +80 -0
  29. data/spec/sugar-high/file_mutate/remove_content_spec.rb +109 -0
  30. data/spec/sugar-high/file_mutate/replace_content_spec.rb +33 -0
  31. data/spec/sugar-high/{file/file_spec.rb → file_spec.rb} +1 -0
  32. data/sugar-high.gemspec +26 -27
  33. metadata +27 -28
  34. data/spec/sugar-high/file/file_mutate_spec.rb +0 -325
@@ -0,0 +1,17 @@
1
+ module SugarHigh
2
+ module FileMutate
3
+ module AppendContent
4
+ def append content=nil, &block
5
+ File.append self.path, content, &block
6
+ end
7
+
8
+ module ClassMethods
9
+ def append path, content=nil, &block
10
+ File.open(path, 'a') do |f|
11
+ f.puts content ||= yield
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,29 @@
1
+ require 'sugar-high/blank'
2
+ require 'sugar-high/arguments'
3
+ require 'sugar-high/path'
4
+ require 'sugar-high/regexp'
5
+ require 'sugar-high/string'
6
+ require 'sugar-high/file'
7
+
8
+ module SugarHigh
9
+ module FileMutate
10
+ module Delete
11
+ module ClassMethods
12
+ def delete! name
13
+ return nil if !File.exist?(name)
14
+ File.delete name
15
+ end
16
+ alias_method :delete_file!, :delete!
17
+ end
18
+
19
+ def delete!
20
+ File.delete(self.path)
21
+ end
22
+ alias_method :delete_file!, :delete!
23
+
24
+ def mutate marker, place, &block
25
+ File.mutate_file self.path, marker, place, &block
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,62 @@
1
+ module SugarHigh
2
+ module FileMutate
3
+ module InsertContent
4
+ def insert *args, &block
5
+ File.insert_into self.path, *args, &block
6
+ end
7
+
8
+ module ClassMethods
9
+ # insert_into 'my_file.txt', :after => 'Blip', :content => 'Hello
10
+ # insert_into 'my_file.txt', 'Hello', :after => 'Blip'
11
+ # insert_into 'my_file.txt', :after => 'Blip' do
12
+ # 'Hello'
13
+ # end
14
+ def insert_into file_name, *args, &block
15
+ options = last_option args
16
+ content = insertion_content options, *args, &block
17
+
18
+ # no content to insert?
19
+ return nil if content.blank?
20
+
21
+ file = begin
22
+ get_file(file_name)
23
+ rescue
24
+ return nil
25
+ end
26
+
27
+ # already inserted?
28
+ return nil if !options[:repeat] && file.has_content?(content)
29
+
30
+ # find where to insert
31
+ place, marker = if options[:before]
32
+ [ :before, options[:before] ]
33
+ elsif options[:before_last]
34
+ [ :before_last, options[:before_last] ]
35
+ else
36
+ [ :after, options[:after] ]
37
+ end
38
+
39
+ return nil if !file.has_content?(marker)
40
+
41
+ # do mutation
42
+ res = file.mutate marker, place do
43
+ content
44
+ end
45
+ res
46
+ end
47
+
48
+ def insertion_content options = {}, *args, &block
49
+ case args.first
50
+ when String
51
+ args.first
52
+ when Hash
53
+ options[:content] || (yield if block)
54
+ else
55
+ return yield if block
56
+ raise ArgumentError, "You must supply content to insert, either as a String before the options hash, a :content option or a block"
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,58 @@
1
+ module SugarHigh
2
+ module FileMutate
3
+ module Mutate
4
+ module ClassMethods
5
+ def mutate_file file, marker, place, &block
6
+ raise ArgumentError, "You must define a replacement marker for a :before, :before_last or :after key" if !marker
7
+
8
+ file = File.get_file(file)
9
+
10
+ if place == :before_last
11
+ content = file.read
12
+ content = content.insert_before_last yield, marker
13
+ file.overwrite content
14
+ return
15
+ end
16
+
17
+ marker_found = file.has_content? marker
18
+ return nil if !marker_found
19
+
20
+ replace_in_file file, /(#{marker})/mi do |match|
21
+ place == :after ? "#{match}\n #{yield}" : "#{yield}\n #{match}"
22
+ end
23
+ true
24
+ end
25
+
26
+ def replace_in_file(file, regexp, *args, &block)
27
+ file = File.get_file(file)
28
+ content = file.read.gsub(regexp, *args, &block)
29
+ file.overwrite content
30
+ end
31
+ end
32
+
33
+ protected
34
+
35
+ def get_file file_name
36
+ case file_name
37
+ when PathString, String
38
+ File.new file_name
39
+ when File
40
+ file_name
41
+ else
42
+ raise ArgumentError, "Could not be converted to a File object: #{file_name}"
43
+ end
44
+ end
45
+
46
+ def get_filepath file
47
+ case file
48
+ when PathString, String
49
+ file
50
+ when File
51
+ file.path
52
+ else
53
+ raise ArgumentError, "Could not be converted to a file path: #{file_name}"
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,17 @@
1
+ module SugarHigh
2
+ module FileMutate
3
+ module OverwriteContent
4
+ def overwrite content=nil, &block
5
+ File.overwrite self.path, content, &block
6
+ end
7
+
8
+ module ClassMethods
9
+ def overwrite file, content=nil, &block
10
+ File.open(get_filepath(file).path, 'w') do |f|
11
+ f.puts content ||= yield
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,33 @@
1
+ module SugarHigh
2
+ module FileMutate
3
+ module RemoveContent
4
+ def remove_content options=nil, &block
5
+ opt_str = case options
6
+ when String
7
+ options
8
+ when Hash
9
+ content = options[:content] || options[:where]
10
+ raise ArgumentError, "Bad :content value in Hash" if !content || content.strip.empty?
11
+ content.strip
12
+ else
13
+ raise ArgumentError, "non-block argument must be either String or Hash with a :content option" if !block
14
+ end
15
+ content = block ? yield : opt_str
16
+
17
+ File.remove_content_from self.path, :content => content, :with => '', &block
18
+ end
19
+ alias_method :remove, :remove_content
20
+
21
+ module ClassMethods
22
+ def remove_from file_name, content=nil, &block
23
+ content ||= yield
24
+ replace_content_from file_name, :content => content, :with => '', &block
25
+ end
26
+
27
+ def remove_content_from file_name, options = {}, &block
28
+ replace_content_from file_name, options.merge(:with => ''), &block
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,45 @@
1
+ module SugarHigh
2
+ module FileMutate
3
+ module ReplaceContent
4
+ def replace_content options = {}, &block
5
+ File.replace_content_from self.path, options, &block
6
+ end
7
+
8
+ module ClassMethods
9
+ # replaces content found at replacement_expr with content resulting from yielding block
10
+ # File.replace_content_from 'myfile.txt', where => /HelloWorld/, with => 'GoodBye'
11
+ def replace_content_from file_name, options = {}, &block
12
+ replacement_expr = options[:where] || options[:content]
13
+ new_content = options[:with]
14
+
15
+ begin
16
+ replacement_expr = replacement_expr.to_regexp
17
+ rescue
18
+ raise ArgumentError, "Content to be replaced must be specified as either a String or Regexp in a :where or :content option"
19
+ end
20
+
21
+ file = get_file file_name
22
+
23
+ # get existing file content
24
+ content = file.read
25
+
26
+ # return nil if no mathing replacement found
27
+ return nil if !(content =~ replacement_expr)
28
+
29
+ new_content ||= yield if block
30
+
31
+ raise ArgumentError, "Content to be replaced with must be specified as a :with option or as a block" if !new_content
32
+
33
+ # remove content that matches expr, by replacing with empty
34
+ mutated_content = content.gsub replacement_expr, new_content
35
+
36
+ # write mutated content as new file
37
+ file.overwrite mutated_content
38
+
39
+ true # signal success!
40
+ end
41
+ alias_method :replace_content_in, :replace_content_from
42
+ end
43
+ end
44
+ end
45
+ end
@@ -12,6 +12,13 @@ class Object
12
12
  false
13
13
  end
14
14
 
15
+ def not_any_kind_of? *kinds
16
+ kinds.all_kinds.each do |kind|
17
+ return false if self.kind_of? kind
18
+ end
19
+ true
20
+ end
21
+
15
22
  def kind_of_label?
16
23
  self.any_kind_of? String, Symbol
17
24
  end
@@ -20,49 +27,7 @@ class Object
20
27
  self.any_kind_of? Symbols, Symbol
21
28
  end
22
29
  end
23
-
24
- module Enumerable
25
- def only_kinds_of? *kinds
26
- all?{|a| a.any_kind_of? *kinds }
27
- end
28
-
29
- def only_labels?
30
- all?{|a| a.kind_of_label? }
31
- end
32
-
33
- def select_kinds_of *kinds
34
- select{|a| a.any_kind_of? *kinds }
35
- end
36
-
37
- def select_labels
38
- select{|a| a.kind_of_label? }
39
- end
40
-
41
- def select_symbols
42
- select{|a| a.kind_of_symbol? }
43
- end
44
-
45
- def select_strings
46
- select_only :string
47
- end
48
-
49
- def select_only type
50
- const = type.kind_of_label? ? "#{type.to_s.camelize}".constantize : type
51
- select{|a| a.kind_of? const}
52
- end
53
-
54
- def all_kinds
55
- map do |a|
56
- case a
57
- when Kinds
58
- a.kinds
59
- else
60
- a if a.kind_of?(Module)
61
- end
62
- end.compact.uniq.flatten
63
- end
64
- end
65
-
30
+
66
31
  class Kinds
67
32
  attr_accessor :kinds
68
33
 
@@ -1,4 +1,9 @@
1
1
  class String
2
+ # remove prefixed '-' signs, then allow any letter, number, underscore '_' or dash '-'
3
+ def alpha_numeric
4
+ self.gsub(/^\-+/, '').gsub(/[^0-9a-zA-Z_\-]+/i, '')
5
+ end
6
+
2
7
  def insert_before_last str, marker = 'end'
3
8
  res = []
4
9
  found = false
@@ -3,3 +3,4 @@ require File.expand_path('../application', __FILE__)
3
3
 
4
4
  # Initialize the rails application
5
5
  Fixtures::Application.initialize!
6
+ hello
@@ -1,4 +1,19 @@
1
1
  class Abc
2
2
  def begin
3
3
  end
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
4
19
  end
@@ -0,0 +1 @@
1
+ {:with=>"New content"}
@@ -0,0 +1 @@
1
+ Hello Me
@@ -1,6 +1,22 @@
1
1
  Fixtures::Application.routes.draw do
2
2
 
3
3
 
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
4
20
 
5
21
 
6
22
 
@@ -3,19 +3,27 @@ require 'sugar-high/array'
3
3
 
4
4
  describe "SugarHigh" do
5
5
  describe "Array ext" do
6
+
6
7
  describe '#to_symbols' do
7
8
  it "should translate nested array of numbers and strings into symbols only array, excluding numbers" do
8
9
  [1, 'blip', [3, "hello"]].to_symbols.should == [:blip, :hello]
9
10
  end
10
11
 
11
12
  it "should translate nested array of numbers and strings into symbols only array, including numbers" do
12
- [[1, 'blip', [3, "hello"]]].to_symbols(:num).should == [:_1, :blip, :_3, :hello]
13
+ [[1, 'blip', [3, "hello"]]].to_symbols_num.should == [:_1, :blip, :_3, :hello]
13
14
  end
14
15
 
15
- it "should translate nested array of numbers and strings into strings only array" do
16
- [['blip', [3, :hello]]].to_strings.should == ['blip', 'hello']
16
+ it "should translate nested array of numbers and strings into symbols only array, including numbers" do
17
+ [[1, 'blip', [1, "hello"]]].to_symbols_uniq.should include :blip, :hello
17
18
  end
18
19
  end
20
+
21
+ describe '#to_symbols!' do
22
+ it "should translate nested array of numbers and strings into symbols only array, excluding numbers" do
23
+ x = [1, 'hello', 'blip', [3, "hello"]].to_symbols!
24
+ x.should include :hello, :blip
25
+ end
26
+ end
19
27
 
20
28
  describe '#to_strings' do
21
29
  it "should translate nested array of numbers and strings into symbols only array, excluding numbers" do
@@ -23,6 +31,13 @@ describe "SugarHigh" do
23
31
  end
24
32
  end
25
33
 
34
+ describe '#to_strings!' do
35
+ it "should translate nested array of numbers and strings into symbols only array, excluding numbers" do
36
+ x = [1, 'blip', [3, "hello"]].to_strings!
37
+ x.should == ['blip', 'hello']
38
+ end
39
+ end
40
+
26
41
  describe '#flat_uniq' do
27
42
  it "should flatten array, remove nils and make unique" do
28
43
  [1, 'blip', ['blip', nil, 'c'], nil].flat_uniq.should == [1, 'blip', 'c']
@@ -33,6 +48,32 @@ describe "SugarHigh" do
33
48
  end
34
49
  end
35
50
 
51
+ describe '#flat_uniq!' do
52
+ it "should flatten array, remove nils and make unique" do
53
+ x = [1, 'blip', ['blip', nil, 'c'], nil]
54
+ x.flat_uniq!
55
+ x.should == [1, 'blip', 'c']
56
+ end
57
+ end
58
+
59
+ describe '#sum' do
60
+ it "should add elements in array" do
61
+ [1, 2, 3].sum.should == 6
62
+ end
63
+ end
64
+
65
+ describe '#mean' do
66
+ it "should find mean of elements in array" do
67
+ [1, 2, 3].mean.should == 2
68
+ end
69
+ end
70
+
71
+ describe '#extract' do
72
+ it "should call method on each element in array" do
73
+ ["a", "ab", "abc"].extract(:size).mean.should == 2
74
+ end
75
+ end
76
+
36
77
  describe '#none?' do
37
78
  it "should be none if no real values in array" do
38
79
  [nil, nil].none?.should be_true