android-xml 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dd3cd589d856aab48d0ddb8b8377e62eddfdd5dd
4
- data.tar.gz: 587a46032f6b791410c10e41824fbe6c6bbb652d
3
+ metadata.gz: aa0f42ed58287d9bdc46a69123836185ae4f3970
4
+ data.tar.gz: 92c2daff63d6f3880fcd0ebd5b071d1854a676bd
5
5
  SHA512:
6
- metadata.gz: 94dcd48dd88f315ffa698a30b6c31a35ead68d43eaf4035844110730657d4e62f16a0df8da485320de64fb0b95c998fe287f21bba43b9817acfa4a2ce7025ee2
7
- data.tar.gz: b8775a3abfc1a6aa2bb7ae54b550eac331887c02d992024cfe794091a8b8a680101df183c31ed022b48a094936a189e5ec4e4bb4e27351f4ecb1337f3d587b3b
6
+ metadata.gz: b869769e94809366a4d5e677e91b256731cd2cf1b6f7a7aa7cc65a9b854670a897f963d0a5c5e773d3eabf18ca0c1ca3c13cfe3f417c6ca7bd5435ba4a60139b
7
+ data.tar.gz: 5635c3ee0a5229a582adc3c4f78dcd79cab3e4d1a9b3371b220dd706c4e5182d7a4b9009d94d1e4212defe401488d31c6d5269a757ccabe990f5753f75f6d4b6
data/README.md CHANGED
@@ -16,14 +16,14 @@ AndroidXml.file('res/values/strings.xml') do
16
16
  end
17
17
 
18
18
  AndroidXml.write_all
19
+ AndroidXml.clean_up 'res/'
19
20
  ```
20
21
 
21
22
  > ruby generate_xml.rb
22
23
  ✓ res/values/strings.xml
23
24
 
24
25
  > cat res/values/strings.xml
25
- <?xml version="1.0" encoding="utf-8"?>
26
- <!-- Do not edit this file. It was generated by AndroidXml -->
26
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
27
27
  <resources>
28
28
  <string name="app_name">AppAppApp</string>
29
29
  </resources>
@@ -76,7 +76,11 @@ AndroidXml.resource('res/values/strings.xml') do
76
76
  string(name: 'app_name') { 'AppAppApp' }
77
77
  end
78
78
 
79
+ # `clean_up` finds files that were generated by AndroidXml and removes them.
80
+ # Files created by `write_all` are not removed. Accepts a string or array of
81
+ # strings.
79
82
  AndroidXml.write_all
83
+ AndroidXml.clean_up 'res/'
80
84
  ```
81
85
 
82
86
  # Helpers
@@ -118,7 +122,44 @@ AndroidXml.setup do
118
122
  end
119
123
  ```
120
124
 
121
- # Rakefile
125
+ # Re-using tags
126
+
127
+ When building a layout with variations for landscape/portrait/size, you will
128
+ often have big chunks that are reusable. Let's say you have a button that is
129
+ in a FrameLayout, and centered at the bottom:
130
+
131
+ ```ruby
132
+ close_button = AndroidXml.Button(
133
+ layout_width: 'wrap_content',
134
+ layout_height: 'wrap_content',
135
+ id: '@+id/cheat_button',
136
+ layout_gravity: 'bottom|center',
137
+ text: '@string/cheat_button'
138
+ )
139
+
140
+ AndroidXml.file('res/layout/some_activity.xml') do
141
+ RelativeLayout(...) do
142
+ # ...
143
+ include close_button
144
+ end
145
+ end
146
+ ```
147
+
148
+ Note: so far, this could also be accomplished using a [Helper](#helpers):
149
+
150
+ You can `clone` a tag and make changes to it:
151
+
152
+ ```ruby
153
+ AndroidXml.file('res/layout-land/some_activity.xml') do
154
+ RelativeLayout(...) do
155
+ # ...
156
+
157
+ include close_button(padding: '')
158
+ end
159
+ end
160
+ ```
161
+
162
+ # Rakefile to build the XML files
122
163
 
123
164
  ```ruby
124
165
  require 'rake'
@@ -136,6 +177,7 @@ task :generate do
136
177
  end
137
178
 
138
179
  AndroidXml.write_all
180
+ AndroidXml.clean_up 'res/'
139
181
  end
140
182
  ```
141
183
 
@@ -1,6 +1,8 @@
1
1
  require_relative './android-xml/main'
2
+ require_relative './android-xml/setup'
2
3
  require_relative './android-xml/tag'
3
4
  require_relative './android-xml/file'
4
5
  require_relative './android-xml/defaults'
6
+ require_relative './android-xml/exts'
5
7
 
6
8
  AndroidXml.setup_defaults
@@ -14,6 +14,7 @@ module AndroidXml
14
14
  all do
15
15
  # suppress 'android:' prefix to all style attributes
16
16
  rename :style
17
+ rename context: 'tools:context'
17
18
  end
18
19
 
19
20
  # disable the xmlns attribute on the resource node
@@ -22,7 +23,7 @@ module AndroidXml
22
23
  end
23
24
 
24
25
  # remove the 'android:' prefix
25
- tag :string, :style, :item, :color do
26
+ tag :string, :style, :item, :color, :array do
26
27
  rename :name
27
28
  end
28
29
  tag :style do
@@ -0,0 +1,15 @@
1
+ class Numeric
2
+
3
+ def pt
4
+ "#{self}pt"
5
+ end
6
+
7
+ def px
8
+ "#{self}px"
9
+ end
10
+
11
+ def dp
12
+ "#{self}dp"
13
+ end
14
+
15
+ end
@@ -1,3 +1,6 @@
1
+ require 'fileutils'
2
+
3
+
1
4
  module AndroidXml
2
5
 
3
6
  class XmlFile < Tag
@@ -10,8 +13,10 @@ module AndroidXml
10
13
  AndroidXml.files << self
11
14
  end
12
15
 
13
- def method_missing(method_name, *args, &block)
14
- raise "There can be only one (new: #{method_name}, old: #{@root})" if @root
16
+ def method_missing(method_name, attrs={}, &block)
17
+ if @root
18
+ raise "There can be only one (new: #{method_name}, old: #{@root})"
19
+ end
15
20
 
16
21
  @root = super
17
22
  @root.is_root = true
@@ -19,8 +24,7 @@ module AndroidXml
19
24
  end
20
25
 
21
26
  def generate
22
- output = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
23
- output << "<!-- Do not edit this file. It was generated by AndroidXml -->\n"
27
+ output = "<!-- Do not edit this file. It was generated by AndroidXml. -->\n"
24
28
  output << generate_block
25
29
  end
26
30
 
@@ -31,10 +35,17 @@ module AndroidXml
31
35
  end
32
36
 
33
37
  def write
38
+ dirname = File.dirname(self.filename)
39
+
40
+ unless File.exists?(dirname)
41
+ warn "\033[33m⚑\033[0m mkdir -p #{dirname}"
42
+ FileUtils.mkdir_p(dirname)
43
+ end
44
+
34
45
  File.open(self.filename, 'w') do |f|
35
46
  f.write(self.to_s)
36
47
  end
37
- puts "\033[32m✓\033[0m #{self.filename}"
48
+ warn "\033[32m✓\033[0m created #{self.filename}"
38
49
  end
39
50
 
40
51
  end
@@ -1,13 +1,6 @@
1
1
  module AndroidXml
2
- ROOT = '__root_node_with_a_long_special_name__'
3
- ALL = '__all_node_with_a_long_special_name__'
4
-
5
2
  module_function
6
3
 
7
- def tab=(value)
8
- @tab = value
9
- end
10
-
11
4
  def file(filename, &block)
12
5
  XmlFile.new(filename, &block)
13
6
  end
@@ -16,8 +9,15 @@ module AndroidXml
16
9
  @files ||= []
17
10
  end
18
11
 
19
- def write_all
20
- files.each do |xml_file|
12
+ def generated
13
+ @generated ||= []
14
+ end
15
+
16
+ def write_all(opts={})
17
+ clean_up = opts.fetch(:clean_up, false)
18
+
19
+ AndroidXml.files.each do |xml_file|
20
+ generated << File.absolute_path(xml_file.filename)
21
21
  xml_file.write
22
22
  end
23
23
 
@@ -25,98 +25,54 @@ module AndroidXml
25
25
  end
26
26
 
27
27
  def output_all
28
- files.each do |xml_file|
28
+ AndroidXml.files.each do |xml_file|
29
29
  xml_file.out
30
30
  puts
31
31
  end
32
32
  end
33
33
 
34
- def diff_all
35
- files.each do |xml_file|
36
- end
37
- end
34
+ def clean_up(locations)
35
+ locations = [locations] unless locations.is_a?(Array)
36
+
37
+ locations.each do |location|
38
38
 
39
- def tags
40
- @tags ||= Hash.new do |hash, key|
41
- hash[key] = {
42
- attrs: {},
43
- defaults: {},
44
- rename: nil,
45
- }
39
+ Dir.glob(File.join(location, '**/*.xml')).each do |filename|
40
+ filename = File.absolute_path(filename)
41
+ unless generated.include?(filename)
42
+ if File.new(filename).read =~ /generated by AndroidXml/
43
+ warn "\033[31m␡\033[0m #{filename}"
44
+ File.delete(filename)
45
+ end
46
+ end
47
+ end
46
48
  end
47
49
  end
48
50
 
49
- def tab
50
- @tab ||= ' '
51
+ def setup(&block)
52
+ Setup.setup(&block)
51
53
  end
52
54
 
53
55
  def reset
54
- @tab = nil
55
- @tags = nil
56
+ Setup.reset
56
57
  @files = nil
58
+ @generated = nil
57
59
  end
58
60
 
59
- def setup(&block)
60
- instance_exec(&block)
61
+ def tag(tag_name, attrs=nil, &block)
62
+ attrs ||= {}
63
+ Tag.new(tag_name, attrs, &block)
61
64
  end
62
65
 
63
- def root_tag
64
- tags[ROOT]
65
- end
66
-
67
- def root(&block)
68
- tag(ROOT, &block)
69
- end
70
-
71
- def all_tag
72
- tags[ALL]
73
- end
74
-
75
- def all(&block)
76
- tag(ALL, &block)
77
- end
78
-
79
- def tag(*names, &block)
80
- context_was = @context
81
-
82
- names.each do |name|
83
- if name.is_a?(Hash)
84
- @context = nil
85
- name.each do |shortcut, tag_name|
86
- raise "There can be only one key-value pair" if @context
87
-
88
- @context = shortcut.to_s
89
- tags[@context][:rename] = tag_name.to_s
90
- end
91
- else
92
- @context = name.to_s
93
- end
94
-
95
- instance_exec(&block)
96
- end
97
-
98
- @context = context_was
99
- end
100
-
101
- def rename(attrs)
102
- if attrs.is_a?(Hash)
103
- attrs.each do |attr_name, attr_rename|
104
- tags[@context][:attrs][attr_name.to_s] = attr_rename.to_s
66
+ # create a file or a new tag.
67
+ def method_missing(method_name, filename_or_attrs=nil, &block)
68
+ if filename_or_attrs.is_a?(String) || filename_or_attrs.is_a?(Symbol)
69
+ xml_file = file(filename) do
70
+ send(method_name, &block)
105
71
  end
72
+ xml_file
106
73
  else
107
- tags[@context][:attrs][attrs.to_s] = attrs.to_s
108
- end
109
- end
110
-
111
- def defaults(attrs)
112
- tags[@context][:defaults].merge!(attrs)
113
- end
114
-
115
- def method_missing(method_name, filename, &block)
116
- xml_file = file(filename) do
117
- send(method_name, &block)
74
+ tag(method_name, filename_or_attrs, &block)
118
75
  end
119
- xml_file
120
76
  end
121
77
 
122
78
  end
@@ -0,0 +1,90 @@
1
+ module AndroidXml
2
+
3
+ class Setup
4
+ class << self
5
+ ROOT = '__root_node_with_a_long_special_name__'
6
+ ALL = '__all_node_with_a_long_special_name__'
7
+
8
+ def setup(&block)
9
+ instance_exec(&block)
10
+ end
11
+
12
+ def tabs(value)
13
+ @tab = value
14
+ end
15
+
16
+ def tags
17
+ @tags ||= Hash.new do |hash, key|
18
+ hash[key] = {
19
+ attrs: {},
20
+ defaults: {},
21
+ rename: nil,
22
+ }
23
+ end
24
+ end
25
+
26
+ def tab
27
+ @tab ||= ' '
28
+ end
29
+
30
+ def reset
31
+ @tab = nil
32
+ @tags = nil
33
+ end
34
+
35
+ def root_tag
36
+ tags[ROOT]
37
+ end
38
+
39
+ def root(&block)
40
+ tag(ROOT, &block)
41
+ end
42
+
43
+ def all_tag
44
+ tags[ALL]
45
+ end
46
+
47
+ def all(&block)
48
+ tag(ALL, &block)
49
+ end
50
+
51
+ def tag(*names, &block)
52
+ context_was = @context
53
+
54
+ names.each do |name|
55
+ if name.is_a?(Hash)
56
+ @context = nil
57
+ name.each do |shortcut, tag_name|
58
+ raise "There can be only one key-value pair" if @context
59
+
60
+ @context = shortcut.to_s
61
+ tags[@context][:rename] = tag_name.to_s
62
+ end
63
+ else
64
+ @context = name.to_s
65
+ end
66
+
67
+ instance_exec(&block)
68
+ end
69
+
70
+ @context = context_was
71
+ end
72
+
73
+ def rename(attrs)
74
+ if attrs.is_a?(Hash)
75
+ attrs.each do |attr_name, attr_rename|
76
+ tags[@context][:attrs][attr_name.to_s] = attr_rename.to_s
77
+ end
78
+ else
79
+ tags[@context][:attrs][attrs.to_s] = attrs.to_s
80
+ end
81
+ end
82
+
83
+ def defaults(attrs)
84
+ tags[@context][:defaults].merge!(attrs)
85
+ end
86
+
87
+ end
88
+ end
89
+
90
+ end
@@ -0,0 +1,13 @@
1
+ module AndroidXml
2
+
3
+ class Tag
4
+
5
+ def string(attrs={}, &block)
6
+ tag = Tag.new('string', attrs, &block)
7
+ include tag
8
+ tag
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -3,46 +3,51 @@ module AndroidXml
3
3
  class Tag
4
4
  attr_accessor :is_root
5
5
 
6
- def initialize(tag, *args, &block)
6
+ def initialize(tag, attrs={}, &block)
7
7
  @buffer = []
8
- @attrs = {}
8
+ @attrs = {}.merge(attrs)
9
9
  @raw_tag = tag.to_s
10
- @text = nil
11
10
 
12
- if rename = AndroidXml.tags[tag.to_s][:rename]
11
+ if rename = Setup.tags[tag.to_s][:rename]
13
12
  @tag = rename
14
13
  else
15
14
  @tag = tag.to_s.gsub('_', '-')
16
15
  end
17
16
 
18
- args.each do |arg|
19
- if arg.is_a?(Hash)
20
- @attrs.merge!(arg)
21
- elsif arg.is_a?(String)
22
- @text = arg
23
- else
24
- raise ArgumentError.new("Unknown argument #{arg.inspect} in #{self.class}#new")
25
- end
26
- end
27
-
28
17
  @generate = block
29
18
  end
30
19
 
31
- def method_missing(method_name, *args, &block)
32
- tag = Tag.new(method_name, *args, &block)
33
- @buffer << tag
20
+ def method_missing(method_name, attrs={}, &block)
21
+ tag = Tag.new(method_name, attrs, &block)
22
+ include tag
34
23
  tag
35
24
  end
36
25
 
26
+ def clone(attrs={}, &block)
27
+ block ||= @generate
28
+ Tag.new(@tag, @attrs.merge(attrs), &block)
29
+ end
30
+
31
+ def include(tag, &block)
32
+ if tag.is_a?(Tag)
33
+ if block_given?
34
+ tag = tag.clone(&block)
35
+ end
36
+ @buffer << tag
37
+ else
38
+ super
39
+ end
40
+ end
41
+
37
42
  def attrs(whitespace)
38
43
  attrs = {}
39
44
 
40
- attrs.merge!(AndroidXml.all_tag[:defaults])
45
+ attrs.merge!(Setup.all_tag[:defaults])
41
46
  if is_root
42
- attrs.merge!(AndroidXml.root_tag[:defaults])
47
+ attrs.merge!(Setup.root_tag[:defaults])
43
48
  end
44
49
 
45
- attrs.merge!(AndroidXml.tags[@raw_tag][:defaults])
50
+ attrs.merge!(Setup.tags[@raw_tag][:defaults])
46
51
  attrs.merge!(@attrs)
47
52
 
48
53
  output = ''
@@ -52,10 +57,10 @@ module AndroidXml
52
57
 
53
58
  key = key.to_s
54
59
 
55
- if AndroidXml.tags[@tag][:attrs].key?(key)
56
- xml_key = AndroidXml.tags[@tag][:attrs][key]
57
- elsif AndroidXml.all_tag[:attrs].key?(key)
58
- xml_key = AndroidXml.all_tag[:attrs][key]
60
+ if Setup.tags[@tag][:attrs].key?(key)
61
+ xml_key = Setup.tags[@tag][:attrs][key]
62
+ elsif Setup.all_tag[:attrs].key?(key)
63
+ xml_key = Setup.all_tag[:attrs][key]
59
64
  elsif key.to_s.include?(':')
60
65
  xml_key = key.to_s
61
66
  else
@@ -76,7 +81,7 @@ module AndroidXml
76
81
  whitespace = "#{tab} #{' ' * @tag.length}"
77
82
  output = "#{tab}<#{@tag}#{attrs(whitespace)}"
78
83
  if @generate
79
- inside = generate_block(tab + AndroidXml.tab)
84
+ inside = generate_block(tab + Setup.tab)
80
85
  if !inside || inside.strip.empty?
81
86
  output << " />\n"
82
87
  else
@@ -1,3 +1,3 @@
1
1
  module AndroidXml
2
- Version = '1.1.1'
2
+ Version = '1.2.0'
3
3
  end
@@ -27,8 +27,7 @@ describe 'AndroidManifest.xml' do
27
27
  end
28
28
 
29
29
  expect(xml.to_s).to eql <<-XML
30
- <?xml version="1.0" encoding="utf-8"?>
31
- <!-- Do not edit this file. It was generated by AndroidXml -->
30
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
32
31
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
32
  package="com.your_name_here.AnyAndroidApp"
34
33
  android:versionCode="1"
@@ -49,7 +48,6 @@ describe 'AndroidManifest.xml' do
49
48
  </application>
50
49
  </manifest>
51
50
  XML
52
-
53
51
  end
54
52
 
55
53
  end
@@ -23,8 +23,7 @@ describe 'Android menu files' do
23
23
  end
24
24
 
25
25
  expect(xml.to_s).to eql <<-XML
26
- <?xml version="1.0" encoding="utf-8"?>
27
- <!-- Do not edit this file. It was generated by AndroidXml -->
26
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
28
27
  <menu xmlns:android="http://schemas.android.com/apk/res/android">
29
28
  <item android:id="@+id/action_search"
30
29
  android:icon="@drawable/ic_action_search"
@@ -52,8 +51,7 @@ XML
52
51
  end
53
52
 
54
53
  expect(xml.to_s).to eql <<-XML
55
- <?xml version="1.0" encoding="utf-8"?>
56
- <!-- Do not edit this file. It was generated by AndroidXml -->
54
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
57
55
  <resources>
58
56
  <string name="app_name">Harroo</string>
59
57
  <string name="hello">Well, Harroo!</string>
@@ -21,8 +21,7 @@ describe 'Android resource files' do
21
21
  end
22
22
 
23
23
  expect(xml.to_s).to eql <<-XML
24
- <?xml version="1.0" encoding="utf-8"?>
25
- <!-- Do not edit this file. It was generated by AndroidXml -->
24
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
26
25
  <resources>
27
26
  <style name="CodeFont"
28
27
  parent="@android:style/TextAppearance.Medium">
@@ -50,8 +49,7 @@ XML
50
49
  end
51
50
 
52
51
  expect(xml.to_s).to eql <<-XML
53
- <?xml version="1.0" encoding="utf-8"?>
54
- <!-- Do not edit this file. It was generated by AndroidXml -->
52
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
55
53
  <resources>
56
54
  <string name="app_name">Harroo</string>
57
55
  <string name="hello">Well, Harroo!</string>
@@ -73,8 +71,7 @@ XML
73
71
  end
74
72
 
75
73
  expect(xml.to_s).to eql <<-XML
76
- <?xml version="1.0" encoding="utf-8"?>
77
- <!-- Do not edit this file. It was generated by AndroidXml -->
74
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
78
75
  <resources>
79
76
  <color name="foo">#f00</color>
80
77
  </resources>
@@ -0,0 +1,75 @@
1
+ require 'android-xml'
2
+
3
+
4
+ describe 'Cloning a tag' do
5
+
6
+ before do
7
+ AndroidXml.reset
8
+ end
9
+
10
+ it 'should be able to clone a tag' do
11
+ tag = AndroidXml.any_tag(id: '@+id/any_id', text: 'tag-text') do
12
+ nested tag: 'also works'
13
+ nested tags: 'also work' do
14
+ yup they: 'work'
15
+ end
16
+ end
17
+
18
+ clone = tag.clone
19
+
20
+ expect(clone.to_s).to eql(<<-XML
21
+ <any-tag android:id="@+id/any_id"
22
+ android:text="tag-text">
23
+ <nested android:tag="also works" />
24
+ <nested android:tags="also work">
25
+ <yup android:they="work" />
26
+ </nested>
27
+ </any-tag>
28
+ XML
29
+ )
30
+ end
31
+
32
+ it 'should be able to clone a tag and replace attrs' do
33
+ tag = AndroidXml.any_tag(id: '@+id/any_id', text: 'tag-text') do
34
+ nested tag: 'also works'
35
+ nested tags: 'also work' do
36
+ yup they: 'work'
37
+ end
38
+ end
39
+
40
+ clone = tag.clone(text: 'clone-text')
41
+
42
+ expect(clone.to_s).to eql(<<-XML
43
+ <any-tag android:id="@+id/any_id"
44
+ android:text="clone-text">
45
+ <nested android:tag="also works" />
46
+ <nested android:tags="also work">
47
+ <yup android:they="work" />
48
+ </nested>
49
+ </any-tag>
50
+ XML
51
+ )
52
+ end
53
+
54
+ it 'should be able to clone a tag and replace content' do
55
+ tag = AndroidXml.any_tag(id: '@+id/any_id', text: 'tag-text') do
56
+ nested tag: 'also works'
57
+ nested tags: 'also work' do
58
+ yup they: 'work'
59
+ end
60
+ end
61
+
62
+ clone = tag.clone(text: 'clone-text') do
63
+ cloned tag: 'also works'
64
+ end
65
+
66
+ expect(clone.to_s).to eql(<<-XML
67
+ <any-tag android:id="@+id/any_id"
68
+ android:text="clone-text">
69
+ <cloned android:tag="also works" />
70
+ </any-tag>
71
+ XML
72
+ )
73
+ end
74
+
75
+ end
@@ -0,0 +1,29 @@
1
+ require 'android-xml'
2
+
3
+
4
+ describe 'Creating a tag with AndroidXml.any_tag' do
5
+
6
+ before do
7
+ AndroidXml.reset
8
+ end
9
+
10
+ it 'should create a tag if no filename is given' do
11
+ tag = AndroidXml.any_tag(id: '@+id/any_id') do
12
+ nested tag: 'also works'
13
+ nested tags: 'also work' do
14
+ yup they: 'work'
15
+ end
16
+ end
17
+
18
+ expect(tag.to_s).to eql(<<-XML
19
+ <any-tag android:id="@+id/any_id">
20
+ <nested android:tag="also works" />
21
+ <nested android:tags="also work">
22
+ <yup android:they="work" />
23
+ </nested>
24
+ </any-tag>
25
+ XML
26
+ )
27
+ end
28
+
29
+ end
@@ -1,5 +1,6 @@
1
1
  require 'android-xml'
2
2
 
3
+
3
4
  describe AndroidXml do
4
5
 
5
6
  before do
@@ -16,8 +17,7 @@ describe AndroidXml do
16
17
  end
17
18
 
18
19
  expect(xml.to_s).to eql <<-XML
19
- <?xml version="1.0" encoding="utf-8"?>
20
- <!-- Do not edit this file. It was generated by AndroidXml -->
20
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
21
21
  <menu xmlns:android="http://schemas.android.com/apk/res/android">
22
22
  <item android:id="@+id/action_search"
23
23
  android:icon="@drawable/ic_action_search"
@@ -1,5 +1,6 @@
1
1
  require 'android-xml'
2
2
 
3
+
3
4
  describe AndroidXml do
4
5
 
5
6
  before do
@@ -12,8 +13,7 @@ describe AndroidXml do
12
13
  end
13
14
 
14
15
  expect(xml.to_s).to eql <<-XML
15
- <?xml version="1.0" encoding="utf-8"?>
16
- <!-- Do not edit this file. It was generated by AndroidXml -->
16
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
17
17
  <any-tag />
18
18
  XML
19
19
  end
@@ -24,8 +24,7 @@ XML
24
24
  end
25
25
 
26
26
  expect(xml.to_s).to eql <<-XML
27
- <?xml version="1.0" encoding="utf-8"?>
28
- <!-- Do not edit this file. It was generated by AndroidXml -->
27
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
29
28
  <any-tag android:with="properties" />
30
29
  XML
31
30
  end
@@ -36,8 +35,7 @@ XML
36
35
  end
37
36
 
38
37
  expect(xml.to_s).to eql <<-XML
39
- <?xml version="1.0" encoding="utf-8"?>
40
- <!-- Do not edit this file. It was generated by AndroidXml -->
38
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
41
39
  <any-tag>with text</any-tag>
42
40
  XML
43
41
  end
@@ -52,8 +50,7 @@ XML
52
50
  end
53
51
 
54
52
  expect(xml.to_s).to eql <<-XML
55
- <?xml version="1.0" encoding="utf-8"?>
56
- <!-- Do not edit this file. It was generated by AndroidXml -->
53
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
57
54
  <nested>
58
55
  <tags />
59
56
  <tags />
@@ -70,11 +67,12 @@ XML
70
67
  tags
71
68
  end
72
69
  end
73
- AndroidXml.tab = ' '
70
+ AndroidXml.setup do
71
+ tabs ' '
72
+ end
74
73
 
75
74
  expect(xml.to_s).to eql <<-XML
76
- <?xml version="1.0" encoding="utf-8"?>
77
- <!-- Do not edit this file. It was generated by AndroidXml -->
75
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
78
76
  <nested>
79
77
  <tags />
80
78
  <tags />
@@ -93,8 +91,7 @@ XML
93
91
  end
94
92
 
95
93
  expect(xml.to_s).to eql <<-XML
96
- <?xml version="1.0" encoding="utf-8"?>
97
- <!-- Do not edit this file. It was generated by AndroidXml -->
94
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
98
95
  <nested>
99
96
  <tags />
100
97
  <tags />
@@ -111,8 +108,7 @@ XML
111
108
  end
112
109
 
113
110
  expect(xml.to_s).to eql <<-XML
114
- <?xml version="1.0" encoding="utf-8"?>
115
- <!-- Do not edit this file. It was generated by AndroidXml -->
111
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
116
112
  <nested android:with=""
117
113
  android:many="properties">
118
114
  <tags android:with=""
@@ -0,0 +1,49 @@
1
+ require 'android-xml'
2
+
3
+
4
+ describe 'Including a tag' do
5
+
6
+ before do
7
+ AndroidXml.reset
8
+ end
9
+
10
+ it 'should be able to include a tag' do
11
+ tag = AndroidXml.any_tag(id: '@+id/any_id')
12
+ file = AndroidXml.file('tmp/test.xml') do
13
+ resources do
14
+ include tag
15
+ end
16
+ end
17
+
18
+ expect(file.generate).to eql(<<-XML
19
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
20
+ <resources>
21
+ <any-tag android:id="@+id/any_id" />
22
+ </resources>
23
+ XML
24
+ )
25
+ end
26
+
27
+ it 'should be able to include a cloned tag' do
28
+ tag = AndroidXml.any_tag(id: '@+id/any_id')
29
+ file = AndroidXml.file('tmp/test.xml') do
30
+ resources do
31
+ include tag.clone(text: 'cloned text') do
32
+ another_tag works: 'fine'
33
+ end
34
+ end
35
+ end
36
+
37
+ expect(file.generate).to eql(<<-XML
38
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
39
+ <resources>
40
+ <any-tag android:id="@+id/any_id"
41
+ android:text="cloned text">
42
+ <another-tag android:works="fine" />
43
+ </any-tag>
44
+ </resources>
45
+ XML
46
+ )
47
+ end
48
+
49
+ end
@@ -0,0 +1,73 @@
1
+ require 'android-xml'
2
+ require 'fileutils'
3
+
4
+
5
+ describe 'Writing to a file' do
6
+
7
+ before do
8
+ AndroidXml.reset
9
+ $stderr.reopen('/dev/null', 'w')
10
+ end
11
+
12
+ after do
13
+ warn "\033[31m␡\033[0m tmp/"
14
+ FileUtils.remove_dir('tmp/')
15
+ $stderr = STDERR
16
+ end
17
+
18
+ it 'should write an xml file' do
19
+ filename = 'tmp/file1.xml'
20
+ xml = AndroidXml.file(filename) do
21
+ any_tag
22
+ end
23
+ xml.write
24
+
25
+ expect(File.exists?(filename)).to be true
26
+
27
+ expect(File.new(filename).read).to eql <<-XML
28
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
29
+ <any-tag />
30
+ XML
31
+ end
32
+
33
+ it 'should create a folder if necessary' do
34
+ filename = 'tmp/a/b/c/file2.xml'
35
+ xml = AndroidXml.file(filename) do
36
+ another_tag
37
+ end
38
+ xml.write
39
+
40
+ expect(File.exists?(filename)).to be true
41
+
42
+ expect(File.new(filename).read).to eql <<-XML
43
+ <!-- Do not edit this file. It was generated by AndroidXml. -->
44
+ <another-tag />
45
+ XML
46
+ end
47
+
48
+ it 'should remove stale files' do
49
+ stale_file = 'tmp/files/stale.xml'
50
+ FileUtils.mkdir_p(File.dirname(stale_file))
51
+ File.open(stale_file, 'w') do |f|
52
+ f.write("<!-- Do not edit this file. It was generated by AndroidXml. -->\n")
53
+ end
54
+
55
+ not_my_file = 'tmp/files/keep.xml'
56
+ FileUtils.mkdir_p(File.dirname(not_my_file))
57
+ File.open(not_my_file, 'w') do |f|
58
+ f.write("This file is fine!")
59
+ end
60
+
61
+ filename = 'tmp/file3.xml'
62
+ xml = AndroidXml.file(filename) do
63
+ another_tag
64
+ end
65
+ AndroidXml.write_all
66
+ AndroidXml.clean_up 'tmp/'
67
+
68
+ expect(File.exists?(filename)).to be true
69
+ expect(File.exists?(stale_file)).to be false
70
+ expect(File.exists?(not_my_file)).to be true
71
+ end
72
+
73
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: android-xml
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Colin T.A. Gray
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-18 00:00:00.000000000 Z
11
+ date: 2014-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -35,8 +35,11 @@ extensions: []
35
35
  extra_rdoc_files: []
36
36
  files:
37
37
  - lib/android-xml/defaults.rb
38
+ - lib/android-xml/exts.rb
38
39
  - lib/android-xml/file.rb
39
40
  - lib/android-xml/main.rb
41
+ - lib/android-xml/setup.rb
42
+ - lib/android-xml/string.rb
40
43
  - lib/android-xml/tag.rb
41
44
  - lib/android-xml/version.rb
42
45
  - lib/android-xml.rb
@@ -44,8 +47,12 @@ files:
44
47
  - spec/android_manifest_spec.rb
45
48
  - spec/android_menu_spec.rb
46
49
  - spec/android_resources_spec.rb
47
- - spec/generate_factory_spec.rb
50
+ - spec/clone_tag_spec.rb
51
+ - spec/create_tag_spec.rb
52
+ - spec/factory_spec.rb
48
53
  - spec/generate_spec.rb
54
+ - spec/inc_tag_spec.rb
55
+ - spec/write_to_file_spec.rb
49
56
  homepage: https://github.com/colinta/android-xml
50
57
  licenses:
51
58
  - BSD
@@ -74,5 +81,9 @@ test_files:
74
81
  - spec/android_manifest_spec.rb
75
82
  - spec/android_menu_spec.rb
76
83
  - spec/android_resources_spec.rb
77
- - spec/generate_factory_spec.rb
84
+ - spec/clone_tag_spec.rb
85
+ - spec/create_tag_spec.rb
86
+ - spec/factory_spec.rb
78
87
  - spec/generate_spec.rb
88
+ - spec/inc_tag_spec.rb
89
+ - spec/write_to_file_spec.rb