android-xml 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 86309a38baac267caea7eea59fde2d5b2212b118
4
+ data.tar.gz: ac749e5475b16b96a535fa907dbe15b133bda2ea
5
+ SHA512:
6
+ metadata.gz: a8753e1c48772ebdc4f521c42e4d482a6027e9c51303029d5c5e091a6ce75e6f3417e5f3a84046e8303ce43d6bac2c9e1e8bbb86ae048456e57bbae4354800a4
7
+ data.tar.gz: 291e6376163cce849152830086d4e975630c2dc1b600f7e64288c3818a476f39a14add0663dfcde58f684da07fcb9711644ba3d4a9f2bc02295ecd642aa5640a
data/README.md ADDED
@@ -0,0 +1,127 @@
1
+ AndroidXml
2
+ ---------
3
+
4
+ gem install android-xml
5
+
6
+ # Quick start
7
+
8
+ ###### generate_xml.rb
9
+ ```ruby
10
+ require 'android-xml'
11
+
12
+ AndroidXml.file('res/values/strings.xml') do
13
+ resource do
14
+ string(name: 'app_name') { 'AppityApp' }
15
+ end
16
+ end
17
+
18
+ AndroidXml.write_all
19
+ ```
20
+
21
+ > ruby generate_xml.rb
22
+ ✓ res/values/strings.xml
23
+
24
+ > cat res/values/strings.xml
25
+ <?xml version="1.0" encoding="utf-8"?>
26
+ <!-- Do not edit this file. It was generated by AndroidXml -->
27
+ <resources>
28
+ <string name="app_name">AppityApp</string>
29
+ </resources>
30
+
31
+ # About
32
+
33
+ With **AndroidXml** you can generate an XML file with much less fuss. It will
34
+ take care of prefixing attributes with `android:` when required, it includes the
35
+ `<?xml ?>` tag, includes the `xmlns:` attribute on your root node (but only when
36
+ required)... all that good stuff!
37
+
38
+ You still need to understand the format that the various Android XML files
39
+ expect, but hopefully you get a good productivity boost.
40
+
41
+ # More examples
42
+
43
+ ```ruby
44
+ # The dreaded AndroidManifest file!
45
+ AndroidXml.file('AndroidManifest.xml') do
46
+ manifest package: 'com.your_name_here.AppityApp', versionCode: 1, versionName: 1.0 do
47
+ uses_sdk minSdkVersion: 11
48
+
49
+ application label: '@string/app_name', icon: '@drawable/ic_launcher' do
50
+ activity name: 'MainActivity', label: '@string/app_name' do
51
+ intent_filter do
52
+ # these helpers are defined in `android-xml/defaults.rb`,
53
+ # and you can easily add your own with an AndroidXml.setup block (see
54
+ # below)
55
+ main_action
56
+ launcher_category
57
+ end
58
+ end
59
+
60
+ activity name: 'DisplayMessageActivity',
61
+ label: '@string/app_name',
62
+ parentActivityName: 'com.your_name_here.AppityApp.MainActivity'
63
+ end
64
+ end
65
+ end
66
+
67
+ # You can generate multiple files from one .rb file
68
+ AndroidXml.file('res/values-jp/strings.xml') do
69
+ resource do
70
+ string(name: 'app_name') { 'アッピティアップ' }
71
+ end
72
+ end
73
+
74
+ AndroidXml.write_all
75
+ ```
76
+
77
+ # Helpers
78
+
79
+ Here's how we create the main_action helper, or if you need to specify that some
80
+ attributes don't need the `android:` prefix.
81
+
82
+ ```ruby
83
+ AndroidXml.setup do
84
+ # the hash syntax specifies the `shortcut => actual-tag-name`
85
+ tag :main_action => 'action' do
86
+ # then we can assign default attributes
87
+ defaults name: 'android.intent.action.MAIN'
88
+ end
89
+ tag :style do
90
+ # <style name="..."> is correct - NOT <style android:name="...">
91
+ rename :name
92
+ end
93
+
94
+ # if you want to add your own shorthands, go nuts:
95
+ tag :activity do
96
+ rename :parent => :parentActivityName
97
+ end
98
+
99
+ # global changes
100
+ all do
101
+ rename :style # always style="", never android:style=""
102
+ end
103
+
104
+ # adds the xmlns attribute to the root node, no matter WHAT the root node is
105
+ root do
106
+ defaults 'xmlns:android' => 'http://schemas.android.com/apk/res/android'
107
+ end
108
+
109
+ # disable the xmlns attribute on the resource node
110
+ tag :resources do
111
+ defaults 'xmlns:android' => nil
112
+ end
113
+ end
114
+ ```
115
+
116
+ # Errata
117
+
118
+ ```ruby
119
+ # If you want to check the output before committing to `write_all`
120
+ AndroidXml.output_all
121
+
122
+ # If you want to wipe out all the defaults and settings
123
+ AndroidXml.reset
124
+
125
+ # If you want the defaults back
126
+ AndroidXml.setup_defaults
127
+ ```
@@ -0,0 +1,6 @@
1
+ require_relative './android-xml/main'
2
+ require_relative './android-xml/tag'
3
+ require_relative './android-xml/file'
4
+ require_relative './android-xml/defaults'
5
+
6
+ AndroidXml.setup_defaults
@@ -0,0 +1,44 @@
1
+ require 'android-xml'
2
+
3
+
4
+ module AndroidXml
5
+ module_function
6
+
7
+ def setup_defaults
8
+ setup do
9
+ # assign the xmlns to all root nodes
10
+ root do
11
+ defaults 'xmlns:android' => 'http://schemas.android.com/apk/res/android'
12
+ end
13
+
14
+ all do
15
+ # suppress 'android:' prefix to all style attributes
16
+ rename :style
17
+ end
18
+
19
+ # disable the xmlns attribute on the resource node
20
+ tag :resources do
21
+ defaults 'xmlns:android' => nil
22
+ end
23
+
24
+ # remove the 'android:' prefix
25
+ tag :string, :style, :item do
26
+ rename :name
27
+ end
28
+ tag :style do
29
+ rename :parent
30
+ end
31
+ tag :manifest do
32
+ rename :package
33
+ end
34
+
35
+ # creates a couple "tag shortcuts"
36
+ tag :main_action => 'action' do
37
+ defaults name: 'android.intent.action.MAIN'
38
+ end
39
+ tag :launcher_category => 'category' do
40
+ defaults name: 'android.intent.category.LAUNCHER'
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,42 @@
1
+ module AndroidXml
2
+
3
+ class XmlFile < Tag
4
+
5
+ attr :filename
6
+
7
+ def initialize(filename, &block)
8
+ @filename = filename
9
+ super(nil, &block)
10
+ AndroidXml.files << self
11
+ end
12
+
13
+ def method_missing(method_name, *args, &block)
14
+ raise "There can be only one (new: #{method_name}, old: #{@root})" if @root
15
+
16
+ @root = super
17
+ @root.is_root = true
18
+ @root
19
+ end
20
+
21
+ 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"
24
+ output << generate_block
25
+ end
26
+
27
+ def out
28
+ puts "---- filename: #{@filename} ----"
29
+ super
30
+ puts "---------------#{'-' * @filename.to_s.length}-----"
31
+ end
32
+
33
+ def write
34
+ File.open(self.filename, 'w') do |f|
35
+ f.write(self.to_s)
36
+ end
37
+ puts "✓ #{self.filename}"
38
+ end
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,115 @@
1
+ module AndroidXml
2
+ ROOT = '__root_node_with_a_long_special_name__'
3
+ ALL = '__all_node_with_a_long_special_name__'
4
+
5
+ module_function
6
+
7
+ def tab=(value)
8
+ @tab = value
9
+ end
10
+
11
+ def file(filename, &block)
12
+ XmlFile.new(filename, &block)
13
+ end
14
+
15
+ def files
16
+ @files ||= []
17
+ end
18
+
19
+ def write_all
20
+ files.each do |xml_file|
21
+ xml_file.write
22
+ end
23
+
24
+ @files = nil
25
+ end
26
+
27
+ def output_all
28
+ files.each do |xml_file|
29
+ xml_file.out
30
+ puts
31
+ end
32
+ end
33
+
34
+ def diff_all
35
+ files.each do |xml_file|
36
+ end
37
+ end
38
+
39
+ def tags
40
+ @tags ||= Hash.new do |hash, key|
41
+ hash[key] = {
42
+ attrs: {},
43
+ defaults: {},
44
+ rename: nil,
45
+ }
46
+ end
47
+ end
48
+
49
+ def tab
50
+ @tab ||= ' '
51
+ end
52
+
53
+ def reset
54
+ @tab = nil
55
+ @tags = nil
56
+ @files = nil
57
+ end
58
+
59
+ def setup(&block)
60
+ instance_exec(&block)
61
+ end
62
+
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
105
+ end
106
+ 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
+ end
@@ -0,0 +1,132 @@
1
+ module AndroidXml
2
+
3
+ class Tag
4
+ attr_accessor :is_root
5
+
6
+ def initialize(tag, *args, &block)
7
+ @buffer = []
8
+ @attrs = {}
9
+ @raw_tag = tag.to_s
10
+ @text = nil
11
+
12
+ if rename = AndroidXml.tags[tag.to_s][:rename]
13
+ @tag = rename
14
+ else
15
+ @tag = tag.to_s.gsub('_', '-')
16
+ end
17
+
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
+ @generate = block
29
+ end
30
+
31
+ def method_missing(method_name, *args, &block)
32
+ tag = Tag.new(method_name, *args, &block)
33
+ @buffer << tag
34
+ tag
35
+ end
36
+
37
+ def attrs(whitespace)
38
+ attrs = {}
39
+
40
+ attrs.merge!(AndroidXml.all_tag[:defaults])
41
+ if is_root
42
+ attrs.merge!(AndroidXml.root_tag[:defaults])
43
+ end
44
+
45
+ attrs.merge!(AndroidXml.tags[@raw_tag][:defaults])
46
+ attrs.merge!(@attrs)
47
+
48
+ output = ''
49
+ is_first = true
50
+ attrs.each do |key, value|
51
+ next if value.nil?
52
+
53
+ key = key.to_s
54
+
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]
59
+ elsif key.to_s.include?(':')
60
+ xml_key = key.to_s
61
+ else
62
+ xml_key = "android:#{key}"
63
+ end
64
+
65
+ if is_first
66
+ output << " #{xml_key}=\"#{value}\""
67
+ is_first = false
68
+ else
69
+ output << "\n#{whitespace}#{xml_key}=\"#{value}\""
70
+ end
71
+ end
72
+ output
73
+ end
74
+
75
+ def generate(tab='')
76
+ whitespace = "#{tab} #{' ' * @tag.length}"
77
+ output = "#{tab}<#{@tag}#{attrs(whitespace)}"
78
+ if @generate
79
+ inside = generate_block(tab + AndroidXml.tab)
80
+ if !inside || inside.strip.empty?
81
+ output << " />\n"
82
+ else
83
+ output << ">"
84
+ if inside.lstrip.start_with?('<')
85
+ output << "\n" << inside << "#{tab}</#{@tag}>\n"
86
+ else
87
+ output << inside << "</#{@tag}>\n"
88
+ end
89
+ end
90
+ else
91
+ output << " />\n"
92
+ end
93
+
94
+ output
95
+ end
96
+
97
+ def generate_block(tab='')
98
+ return @block_output if @block_output
99
+
100
+ output = ''
101
+ if @generate
102
+ text = instance_exec(&@generate)
103
+ @buffer.each do |tag|
104
+ output << tag.generate(tab)
105
+ end
106
+ if text.is_a?(String)
107
+ if output.empty?
108
+ output << text
109
+ else
110
+ output << tab << text << "\n"
111
+ end
112
+ end
113
+ end
114
+
115
+ @block_output = output
116
+ end
117
+
118
+ def to_s
119
+ generate
120
+ end
121
+
122
+ def to_ary
123
+ [to_s]
124
+ end
125
+
126
+ def out
127
+ puts to_s
128
+ end
129
+
130
+ end
131
+
132
+ end
@@ -0,0 +1,3 @@
1
+ module AndroidXml
2
+ Version = '1.0.0'
3
+ end
@@ -0,0 +1,55 @@
1
+ require 'android-xml'
2
+
3
+
4
+ describe 'AndroidManifest.xml' do
5
+
6
+ before do
7
+ AndroidXml.reset
8
+ AndroidXml.setup_defaults
9
+ end
10
+
11
+ it 'should generate a sensible AndroidManifest file' do
12
+ xml = AndroidXml.file('AndroidManifest.xml') do
13
+ manifest package: 'com.your_name_here.AnyAndroidApp', versionCode: 1, versionName: 1.0 do
14
+ uses_sdk minSdkVersion: 11
15
+
16
+ application label: '@string/app_name', icon: '@drawable/ic_launcher' do
17
+ activity name: 'MainActivity', label: '@string/app_name' do
18
+ intent_filter do
19
+ main_action
20
+ launcher_category
21
+ end
22
+ end
23
+
24
+ activity name: 'AnotherActivity', label: '@string/app_name', parentActivityName: 'com.your_name_here.AnyAndroidApp.MainActivity'
25
+ end
26
+ end
27
+ end
28
+
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 -->
32
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
+ package="com.your_name_here.AnyAndroidApp"
34
+ android:versionCode="1"
35
+ android:versionName="1.0">
36
+ <uses-sdk android:minSdkVersion="11" />
37
+ <application android:label="@string/app_name"
38
+ android:icon="@drawable/ic_launcher">
39
+ <activity android:name="MainActivity"
40
+ android:label="@string/app_name">
41
+ <intent-filter>
42
+ <action android:name="android.intent.action.MAIN" />
43
+ <category android:name="android.intent.category.LAUNCHER" />
44
+ </intent-filter>
45
+ </activity>
46
+ <activity android:name="AnotherActivity"
47
+ android:label="@string/app_name"
48
+ android:parentActivityName="com.your_name_here.AnyAndroidApp.MainActivity" />
49
+ </application>
50
+ </manifest>
51
+ XML
52
+
53
+ end
54
+
55
+ end
@@ -0,0 +1,70 @@
1
+ require 'android-xml'
2
+
3
+
4
+ describe 'Android menu files' do
5
+
6
+ before do
7
+ AndroidXml.reset
8
+ AndroidXml.setup_defaults
9
+ end
10
+
11
+ it 'should generate a sensible menu.xml file' do
12
+ xml = AndroidXml.file('res/menu/menu.xml') do
13
+ menu do
14
+ item id: '@+id/action_search',
15
+ icon: '@drawable/ic_action_search',
16
+ title: '@string/action_search',
17
+ showAsAction: 'ifRoom'
18
+
19
+ item id: '@+id/action_settings',
20
+ title: '@string/action_settings',
21
+ showAsAction: 'never'
22
+ end
23
+ end
24
+
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 -->
28
+ <menu xmlns:android="http://schemas.android.com/apk/res/android">
29
+ <item android:id="@+id/action_search"
30
+ android:icon="@drawable/ic_action_search"
31
+ android:title="@string/action_search"
32
+ android:showAsAction="ifRoom" />
33
+ <item android:id="@+id/action_settings"
34
+ android:title="@string/action_settings"
35
+ android:showAsAction="never" />
36
+ </menu>
37
+ XML
38
+ end
39
+
40
+ it 'should generate a sensible strings.xml file' do
41
+ xml = AndroidXml.file('res/values/strings.xml') do
42
+ resources do
43
+ string(name: 'app_name') { 'Harroo' }
44
+ string(name: 'hello') { 'Well, Harroo!' }
45
+ string(name: 'portrait') { 'portrait' }
46
+ string(name: 'landscape') { 'landscape' }
47
+ string(name: 'button_send') { 'Send' }
48
+ string(name: 'action_search') { 'Search' }
49
+ string(name: 'action_settings') { 'Settings' }
50
+ string(name: 'title_activity_main') { 'MainActivity' }
51
+ end
52
+ end
53
+
54
+ 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 -->
57
+ <resources>
58
+ <string name="app_name">Harroo</string>
59
+ <string name="hello">Well, Harroo!</string>
60
+ <string name="portrait">portrait</string>
61
+ <string name="landscape">landscape</string>
62
+ <string name="button_send">Send</string>
63
+ <string name="action_search">Search</string>
64
+ <string name="action_settings">Settings</string>
65
+ <string name="title_activity_main">MainActivity</string>
66
+ </resources>
67
+ XML
68
+ end
69
+
70
+ end
@@ -0,0 +1,68 @@
1
+ require 'android-xml'
2
+
3
+
4
+ describe 'Android resource files' do
5
+
6
+ before do
7
+ AndroidXml.reset
8
+ AndroidXml.setup_defaults
9
+ end
10
+
11
+ it 'should generate a sensible style.xml file' do
12
+ xml = AndroidXml.file('res/values/style.xml') do
13
+ resources do
14
+ style(name: 'CodeFont', parent: '@android:style/TextAppearance.Medium') do
15
+ item(name: "android:layout_width") { 'fill_parent' }
16
+ item(name: "android:layout_height") { 'wrap_content' }
17
+ item(name: "android:textColor") { '#00FF00' }
18
+ item(name: "android:typeface") { 'monospace' }
19
+ end
20
+ end
21
+ end
22
+
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 -->
26
+ <resources>
27
+ <style name="CodeFont"
28
+ parent="@android:style/TextAppearance.Medium">
29
+ <item name="android:layout_width">fill_parent</item>
30
+ <item name="android:layout_height">wrap_content</item>
31
+ <item name="android:textColor">#00FF00</item>
32
+ <item name="android:typeface">monospace</item>
33
+ </style>
34
+ </resources>
35
+ XML
36
+ end
37
+
38
+ it 'should generate a sensible strings.xml file' do
39
+ xml = AndroidXml.file('res/values/strings.xml') do
40
+ resources do
41
+ string(name: 'app_name') { 'Harroo' }
42
+ string(name: 'hello') { 'Well, Harroo!' }
43
+ string(name: 'portrait') { 'portrait' }
44
+ string(name: 'landscape') { 'landscape' }
45
+ string(name: 'button_send') { 'Send' }
46
+ string(name: 'action_search') { 'Search' }
47
+ string(name: 'action_settings') { 'Settings' }
48
+ string(name: 'title_activity_main') { 'MainActivity' }
49
+ end
50
+ end
51
+
52
+ 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 -->
55
+ <resources>
56
+ <string name="app_name">Harroo</string>
57
+ <string name="hello">Well, Harroo!</string>
58
+ <string name="portrait">portrait</string>
59
+ <string name="landscape">landscape</string>
60
+ <string name="button_send">Send</string>
61
+ <string name="action_search">Search</string>
62
+ <string name="action_settings">Settings</string>
63
+ <string name="title_activity_main">MainActivity</string>
64
+ </resources>
65
+ XML
66
+ end
67
+
68
+ end
@@ -0,0 +1,124 @@
1
+ require 'android-xml'
2
+
3
+ describe AndroidXml do
4
+
5
+ before do
6
+ AndroidXml.reset
7
+ end
8
+
9
+ it 'should generate <any-tag />' do
10
+ xml = AndroidXml.file('tmp/test.xml') do
11
+ any_tag
12
+ end
13
+
14
+ 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 -->
17
+ <any-tag />
18
+ XML
19
+ end
20
+
21
+ it 'should generate <any-tag with="properties" />' do
22
+ xml = AndroidXml.file('tmp/test.xml') do
23
+ any_tag with: 'properties'
24
+ end
25
+
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 -->
29
+ <any-tag android:with="properties" />
30
+ XML
31
+ end
32
+
33
+ it 'should generate <any-tag>with text</any-tag>' do
34
+ xml = AndroidXml.file('tmp/test.xml') do
35
+ any_tag { 'with text' }
36
+ end
37
+
38
+ 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 -->
41
+ <any-tag>with text</any-tag>
42
+ XML
43
+ end
44
+
45
+ it 'should generate <nested><tags /></nested>' do
46
+ xml = AndroidXml.file('tmp/test.xml') do
47
+ nested do
48
+ tags
49
+ tags
50
+ tags
51
+ end
52
+ end
53
+
54
+ 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 -->
57
+ <nested>
58
+ <tags />
59
+ <tags />
60
+ <tags />
61
+ </nested>
62
+ XML
63
+ end
64
+
65
+ it 'should generate <nested><tags /></nested> with custom whitespace' do
66
+ xml = AndroidXml.file('tmp/test.xml') do
67
+ nested do
68
+ tags
69
+ tags
70
+ tags
71
+ end
72
+ end
73
+ AndroidXml.tab = ' '
74
+
75
+ 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 -->
78
+ <nested>
79
+ <tags />
80
+ <tags />
81
+ <tags />
82
+ </nested>
83
+ XML
84
+ end
85
+
86
+ it 'should generate <nested><tags />with text</nested>' do
87
+ xml = AndroidXml.file('tmp/test.xml') do
88
+ nested do
89
+ tags
90
+ tags
91
+ 'with text'
92
+ end
93
+ end
94
+
95
+ 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 -->
98
+ <nested>
99
+ <tags />
100
+ <tags />
101
+ with text
102
+ </nested>
103
+ XML
104
+ end
105
+
106
+ it 'should generate <nested with="" many="properties"><tags with="" many="properties" /></nested>' do
107
+ xml = AndroidXml.file('tmp/test.xml') do
108
+ nested with: '', many: 'properties' do
109
+ tags with: '', many: 'properties'
110
+ end
111
+ end
112
+
113
+ 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 -->
116
+ <nested android:with=""
117
+ android:many="properties">
118
+ <tags android:with=""
119
+ android:many="properties" />
120
+ </nested>
121
+ XML
122
+ end
123
+
124
+ end
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: android-xml
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Colin T.A. Gray
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: |
28
+ Add this to your build process, and never write XML again!
29
+
30
+ Plus, you can have multiple files generated from one file.
31
+ email:
32
+ - colinta@gmail.com
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - lib/android-xml/defaults.rb
38
+ - lib/android-xml/file.rb
39
+ - lib/android-xml/main.rb
40
+ - lib/android-xml/tag.rb
41
+ - lib/android-xml/version.rb
42
+ - lib/android-xml.rb
43
+ - README.md
44
+ - spec/android_manifest_spec.rb
45
+ - spec/android_menu_spec.rb
46
+ - spec/android_resources_spec.rb
47
+ - spec/generate_spec.rb
48
+ homepage: https://github.com/colinta/android-xml
49
+ licenses:
50
+ - BSD
51
+ metadata: {}
52
+ post_install_message:
53
+ rdoc_options: []
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ requirements: []
67
+ rubyforge_project:
68
+ rubygems_version: 2.0.3
69
+ signing_key:
70
+ specification_version: 4
71
+ summary: Generates Android XML files.
72
+ test_files:
73
+ - spec/android_manifest_spec.rb
74
+ - spec/android_menu_spec.rb
75
+ - spec/android_resources_spec.rb
76
+ - spec/generate_spec.rb