android-xml 1.1.1 → 1.2.0

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