RUIC 0.4.1 → 0.4.2

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: b8faba5ee217a4ec85f9986a016652df690681d9
4
- data.tar.gz: 5759ccdd5bf4f3366d106156c860ea4a8c583a48
3
+ metadata.gz: ccbb528e1e792f4cc500c0ecf6ddac842a4d3c16
4
+ data.tar.gz: 7e927291cb3f9bde68232edc852821623ecdf70d
5
5
  SHA512:
6
- metadata.gz: c33fb1178fe11f5e862368348ed61523bc2fbfb3273c42062a641e91051a4a43ab8b90503728c0ac3f361982ec5891db405ea17c9dc8c8facfde8b590835ebf8
7
- data.tar.gz: 892b9bac7372753daddec28e41560afbcc75733b7ecdc0ae759605fe6f7795808eec4b048baa1d642f8f7ba7115208a68497f39399a893b963fb0dd471d180cd
6
+ metadata.gz: a6e00c98a50f7a19125a3f85bd75e6042e546a760e2c07b7237df16021ecb44d06b4f5568039d5a89b5b7716aa251ba5d72e36ac68a69b144b14900a73f488a6
7
+ data.tar.gz: e1d5e90aa7fca7fed4a02eae14f461b1d0b02d6913e0206d2051adb25f4558d5cd414097a32b7602f9877bfecf3a2fb771efecc2f6eb46c8cf762787402f4816
@@ -0,0 +1,5 @@
1
+ --no-private
2
+ --markup markdown
3
+ -M kramdown
4
+ lib/**/*.rb -
5
+ README.md LICENSE
data/README.md CHANGED
@@ -1,270 +1,279 @@
1
- # What is RUIC?
2
- RUIC is a Ruby API for reading, analyzing, and manipulating application assets created by NVIDIA's [UI Composer][1]. Among other things, it allows you to:
3
-
4
- * See if an application is missing any assets (e.g. images or meshes) and what parts of the application are looking for those.
5
- * See if there are any files in the application folder that you can delete (e.g. images or materials that are no longer being used).
6
- * Read and modify the attributes of elements on different slides.
7
- * Batch change attributes (e.g. change all usage of one font or color to another).
8
- * Procedurally generate many models with automated placement in your scene.
9
-
10
- _Some of the features above are planned, but not yet implemented; see Known Limitations below._
11
-
12
- ## Table of Contents
13
- * [Installing RUIC](#installing-ruic)
14
- * [Using the RUIC DSL](#using-the-ruic-dsl)
15
- * [Creating and Accessing Applications](#creating-and-accessing-applications)
16
- * [Working with Presentations](#working-with-presentations)
17
- * [Finding Many Assets](#finding-many-assets)
18
- * [Working with References](#working-with-references)
19
- * [Writing Assertions](#writing-assertions)
20
- * [Locating MetaData.xml](#locating-metadataxml)
21
- * [Interactive RUIC](#interactive-ruic)
22
- * [Known Limitations (aka TODO)](#known-limitations-aka-todo)
23
- * [History](#history)
24
- * [License & Contact](#license--contact)
25
-
26
-
27
-
28
- # Installing RUIC
29
- RUIC can be installed via RubyGems (part of Ruby) via the command:
30
-
31
- gem install ruic # May need `sudo gem install ruic` depending on your setup
32
-
33
- Although RUIC is a pure-Ruby library, it relies on [Nokogiri][2] for all the XML processing and manipulation. Installing RUIC will also automatically install Nokogiri, which may require some compilation.
34
-
35
-
36
-
37
- # Using the RUIC DSL
38
-
39
- RUIC scripts are pure Ruby with a few convenience methods added. You run them via the `ruic` command-line script, e.g.
40
-
41
- ruic myscript.ruic # or .rb extension, for syntax highlighting while editing
42
-
43
-
44
- ## Creating and Accessing Applications
45
- RUIC scripts must start with `uia` commands to load an application and all its assets.
46
- After this you can access the application as `app`:
47
-
48
- ```ruby
49
- uia '../MyApp.uia' # Relative to the ruic script file, or absolute
50
-
51
- show app.file #=> /var/projects/UIC/MyApp/main/MyApp.uia
52
- show app.filename #=> MyApp.uia
53
-
54
- show app.assets.count #=> 7
55
- # You can ask for app.behaviors, app.presentations, app.statemachines, and app.renderplugins
56
- # for arrays of specific asset types
57
- ```
58
-
59
- _The `show` command prints the result; it is simply a nicer alias for `puts`._
60
-
61
- If you need to load multiple applications in the same script, subsequent `uia` commands will create
62
- `app2`, `app3`, etc. for you to use.
63
-
64
- ```ruby
65
- uia '../MyApp.uia' # Available as 'app'
66
- uia '../../v1/MyApp.uia' # Available as 'app2'
67
- ```
68
-
69
-
70
- ## Working with Presentations
71
-
72
- ```ruby
73
- uia '../MyApp.uia'
74
-
75
- main = app.main_presentation # The presentation displayed as the main presentation (regardless of id)
76
- sub = app['#nav'] # You can ask for an asset based on the id in the .uia...
77
- sub = app['Navigation.uip'] # or based on the path to the file (relative to the .uia)
78
-
79
-
80
- car = sub/"Scene.Vehicle.Group.Car" # Find elements in a presentation by presentation path…
81
- car = app/"nav:Scene.Vehicle.Group.Car" # …or absolute application path
82
-
83
- show car.name #=> Car
84
- show car.type #=> Model # Scene, Layer, Camera, Light, Group, Model, Material,
85
- # Image, Behavior, Effect, ReferencedMaterial, Text,
86
- # RenderPlugin, Component, (custom materials)
87
-
88
- show car.component? #=> false # Ask if an element is a component
89
- assert car.component==sub.scene # Ask for the owning component; may be the scene
90
- ```
91
-
92
- ## Finding Many Assets
93
-
94
- ```ruby
95
- uia 'MyApp.uia'
96
- main = app.main_presentation
97
-
98
- every_asset = main.find # Array of matching assets
99
- master_assets = main.find _master:true # Test for master/nonmaster
100
- models = main.find _type:'Model' # …or based on type
101
- slide2_assets = main.find _slide:2 # …or presence on slide
102
- rectangles = main.find sourcepath:'#Rectangle' # …or attribute values
103
- gamecovers = main.find name:'Game Cover' # …including the name
104
-
105
- # Combine tests to get more specific
106
- master_models = main.find _type:'Model', _master:true
107
- slide2_rects = main.find _type:'Model', _slide:2, sourcepath:'#Rectangle'
108
- nonmaster_s2 = main.find _slide:2, _master:false
109
- red_materials = main.find _type:'Material', diffuse:[1,0,0]
110
-
111
- # You can match values more loosely
112
- pistons = main.find name:/^Piston/ # Regex for batch finding
113
- bottom_row = main.find position:[nil,-200,nil] # nil for wildcards in vectors
114
-
115
- # Restrict the search to a sub-tree
116
- group = main/"Scene.Layer.Group"
117
- group_models = group.find _type:'Model' # Orig asset is never included
118
- group_models = main.find _under:group, _type:'Model' # Or, use `_under` to limit
119
-
120
- # Iterate the results as they are found
121
- main.find _type:'Model', name:/^Piston/ do |model, index| # Using the index is optional
122
- show "Model #{index} is named #{model.name}"
123
- end
124
- ```
125
-
126
- Notes:
127
- * `nil` inside an array is a "wildcard" value, allowing you to test only specific values
128
- * Numbers (both in vectors/colors/rotations and float/long values) must only be within `0.001` to match.
129
- * _For example, `attr:{diffuse:[1,0,0]}` will match a color with `diffuse=".9997 0.0003 0"`_
130
- * Results of `find` are always in scene-graph order.
131
-
132
-
133
- ## Working with References
134
-
135
- ```ruby
136
- uia 'MyApp.uia'
137
- mat1 = app/"main:Scene.Layer.Sphere.Material" # A normal UIC Material
138
- mat2 = app/"main:Scene.Layer.Cube.Material" # A normal UIC Material
139
- p mat2.type #=> "Material"
140
- ref = mat2.replace_with_referenced_material # A very specific method :)
141
- p ref.properties['referencedmaterial'].type #=> "ObjectRef"
142
- p ref['referencedmaterial',0].object #=> nil
143
- p ref['referencedmaterial',0].type #=> :absolute
144
- ref['referencedmaterial',0].object = mat1 #=> Sets an absolute reference
145
- ref['referencedmaterial',0].type = :path #=> Use a relative path instead
146
-
147
- # Alternatively, you can omit the .object when setting the reference:
148
- # ref['referencedmaterial',0] = mat1
149
-
150
- mat3 = ref['referencedmaterial',1].object #=> Get the asset pointed to
151
- assert mat1 == mat3 #=> They are the same! It worked!
152
-
153
- app.save_all! #=> Write presentations in place
154
- ```
155
-
156
- ## Writing Assertions
157
-
158
-
159
- ## Locating MetaData.xml
160
- RUIC needs access to a UIC `MetaData.xml` file to understand the properties in the various XML files.
161
- By default RUIC will look in the location specified by `RUIC::DEFAULTMETADATA`, e.g.
162
- `C:/Program Files (x86)/NVIDIA Corporation/UI Composer 8.0/res/DataModelMetadata/en-us/MetaData.xml`
163
-
164
- If this file is in another location, you can tell the script where to find it either:
165
-
166
- * on the command line: `ruic -m path/to/MetaData.xml myscript.ruic`
167
- * in your ruic script: `metadata 'path/to/MetaData.xml' # before any 'app' commands`
168
-
169
-
170
- # Interactive RUIC
171
- In addition to executing a standalone script, RUIC also has a REPL (like IRB) that allows you to
172
- interactively execute and test changes to your application/presentations before saving.
173
- There are two ways to enter interactive mode:
174
-
175
- * If you invoke the `ruic` binary with a `.uia` file as the argument the interpreter will load
176
- the application and enter the REPL:
177
- ```
178
- $ ruic myapp.uia
179
- (RUIC v0.2.2 interactive session; 'quit' or ctrl-d to end)
180
-
181
- uia "test/projects/SimpleScene/SimpleScene.uia"
182
- #=> <UIC::Application 'SimpleScene.uia'>
183
- ```
184
-
185
- * Alternatively, you can have RUIC execute a script and then enter the interactive REPL
186
- by supplying the `-i` command-line switch:
187
- ```
188
- $ ruic -i test/referencematerials.ruic
189
- (RUIC v0.2.2 interactive session; 'quit' or ctrl-d to end)
190
-
191
- app
192
- #=> <UIC::Application 'ReferencedMaterials.uia'>
193
-
194
- cubemat
195
- #=> <asset Material#Material_002>
196
- ```
197
- As shown above, all local variables created by the script continue to be available
198
- in the interactive session.
199
-
200
-
201
- # Known Limitations (aka TODO)
202
- _In decreasing priority…_
203
-
204
- - Report on image assets, their sizes
205
- - Report used assets (and where they are used)
206
- - Report unused assets (in a format suitable for automated destruction)
207
- - Report missing assets (and who was looking for them)
208
- - Gobs more unit tests
209
- - Parse .lua headers (in case one references an image)
210
- - Parse render plugins
211
- - Read/edit animation tracks
212
- - Find all colors, and where they are used
213
- - Visual actions for State Machines
214
- - Create new presentation assets (e.g. add a new sphere)
215
- - Modify the scene graph of presentations
216
- - Create new presentations/applications from code
217
- - Report on image asset file formats (e.g. find PNGs, find DXT1 vs DXT3 vs DXT Luminance…)
218
-
219
-
220
- # History
221
-
222
- ## v0.4.0 - 2014-Nov-11
223
- * Switch attribute filtering again; now all attributes are inline in the `find()` hash, and the four special keys are prefixed with an underscore: `_type`, `_slide`, `_master`, and `_under`.
224
-
225
- ## v0.3.0 - 2014-Nov-10
226
- * Switch attribute filtering to use `attr:{ }` instead of `attributes:{ }`
227
- * Attribute matching now requires that a requested attribute be present, or else the asset matching fails.
228
- * _For example, `main.find attr:{ diffusecolor:[nil,nil,nil] }` will now only find assets with a `diffusecolor` attribute._
229
-
230
- ## v0.2.5 - 2014-Nov-10
231
- * Re-adds blank line after REPL result.
232
-
233
- ## v0.2.4 - 2014-Nov-10
234
- * Fix bug with history editing in REPL (prompts no longer have a blank line before)
235
- * Add temporary hack to make projects using Float2 load correctly
236
-
237
- ## v0.2.3 - 2014-Nov-7
238
- * Cleaner mechanism for creating a truly blank binding
239
-
240
- ## v0.2.2 - 2014-Nov-7
241
- * REPL shows version number when it starts
242
-
243
- ## v0.2.1 - 2014-Nov-7
244
- * REPL mode after script maintains binding of script (all local variables remain available)
245
- * Customized `.irbrc` files will not cause warnings
246
-
247
- ## v0.2.0 - 2014-Nov-7
248
- * Add Presentation#save_as
249
- * REPL working directory is same as .uia
250
-
251
- ## v0.1.0 - 2014-Nov-7
252
- * Add REPL mode for ruic binary
253
-
254
- ## v0.0.1 - 2014-Nov-7
255
- * Initial gem release
256
- * Crawl presentations and modify attributes
257
- * Batch find assets
258
- * Save presentation changes back to disk
259
-
260
-
261
-
262
- # License & Contact
263
- RUIC is copyright ©2014 by Gavin Kistner and is licensed under the [MIT License][3]. See the `LICENSE` file for more details.
264
-
265
- For bugs or feature requests please open [issues on GitHub][4]. For other communication you can [email the author directly](mailto:!@phrogz.net?subject=RUIC).
266
-
267
- [1]: http://uicomposer.nvidia.com
268
- [2]: http://nokogiri.org
269
- [3]: http://opensource.org/licenses/MIT
270
- [4]: https://github.com/Phrogz/RUIC/issues
1
+ # What is RUIC?
2
+ RUIC is a Ruby API for reading, analyzing, and manipulating application assets created by NVIDIA's [UI Composer][1]. Among other things, it allows you to:
3
+
4
+ * See if an application is missing any assets (e.g. images or meshes) and what parts of the application are looking for those.
5
+ * See if there are any files in the application folder that you can delete (e.g. images or materials that are no longer being used).
6
+ * Read and modify the attributes of elements on different slides.
7
+ * Batch change attributes (e.g. change all usage of one font or color to another).
8
+ * Procedurally generate many models with automated placement in your scene.
9
+
10
+ _Some of the features above are planned, but not yet implemented; see Known Limitations below._
11
+
12
+ ## Table of Contents
13
+ * [Installing RUIC](#installing-ruic)
14
+ * [Using the RUIC DSL](#using-the-ruic-dsl)
15
+ * [Creating and Accessing Applications](#creating-and-accessing-applications)
16
+ * [Working with Presentations](#working-with-presentations)
17
+ * [Finding Many Assets](#finding-many-assets)
18
+ * [Working with References](#working-with-references)
19
+ * [Writing Assertions](#writing-assertions)
20
+ * [Locating MetaData.xml](#locating-metadataxml)
21
+ * [Interactive RUIC](#interactive-ruic)
22
+ * [Object Methods](#object-methods)
23
+ * [Known Limitations (aka TODO)](#known-limitations-aka-todo)
24
+ * [History](#history)
25
+ * [License & Contact](#license--contact)
26
+
27
+
28
+
29
+ # Installing RUIC
30
+ RUIC can be installed via RubyGems (part of Ruby) via the command:
31
+
32
+ gem install ruic # May need `sudo gem install ruic` depending on your setup
33
+
34
+ Although RUIC is a pure-Ruby library, it relies on [Nokogiri][2] for all the XML processing and manipulation. Installing RUIC will also automatically install Nokogiri, which may require some compilation.
35
+
36
+
37
+
38
+ # Using the RUIC DSL
39
+
40
+ RUIC scripts are pure Ruby with a few convenience methods added. You run them via the `ruic` command-line script, e.g.
41
+
42
+ ruic myscript.ruic # or .rb extension, for syntax highlighting while editing
43
+
44
+
45
+ ## Creating and Accessing Applications
46
+ RUIC scripts must start with `uia` commands to load an application and all its assets.
47
+ After this you can access the application as `app`:
48
+
49
+ ```ruby
50
+ uia '../MyApp.uia' # Relative to the ruic script file, or absolute
51
+
52
+ show app.file #=> /var/projects/UIC/MyApp/main/MyApp.uia
53
+ show app.filename #=> MyApp.uia
54
+
55
+ show app.assets.count #=> 7
56
+ # You can ask for app.behaviors, app.presentations, app.statemachines, and app.renderplugins
57
+ # for arrays of specific asset types
58
+ ```
59
+
60
+ _The `show` command prints the result; it is simply a nicer alias for `puts`._
61
+
62
+ If you need to load multiple applications in the same script, subsequent `uia` commands will create
63
+ `app2`, `app3`, etc. for you to use.
64
+
65
+ ```ruby
66
+ uia '../MyApp.uia' # Available as 'app'
67
+ uia '../../v1/MyApp.uia' # Available as 'app2'
68
+ ```
69
+
70
+
71
+ ## Working with Presentations
72
+
73
+ ```ruby
74
+ uia '../MyApp.uia'
75
+
76
+ main = app.main_presentation # The presentation displayed as the main presentation (regardless of id)
77
+ sub = app['#nav'] # You can ask for an asset based on the id in the .uia...
78
+ sub = app['Navigation.uip'] # or based on the path to the file (relative to the .uia)
79
+
80
+
81
+ car = sub/"Scene.Vehicle.Group.Car" # Find elements in a presentation by presentation path
82
+ car = app/"nav:Scene.Vehicle.Group.Car" # …or absolute application path
83
+
84
+ show car.name #=> Car
85
+ show car.type #=> Model # Scene, Layer, Camera, Light, Group, Model, Material,
86
+ # Image, Behavior, Effect, ReferencedMaterial, Text,
87
+ # RenderPlugin, Component, (custom materials)
88
+
89
+ show car.component? #=> false # Ask if an element is a component
90
+ assert car.component==sub.scene # Ask for the owning component; may be the scene
91
+ ```
92
+
93
+ ## Finding Many Assets
94
+
95
+ ```ruby
96
+ uia 'MyApp.uia'
97
+ main = app.main_presentation
98
+
99
+ every_asset = main.find # Array of matching assets
100
+ master_assets = main.find _master:true # Test for master/nonmaster
101
+ models = main.find _type:'Model' # …or based on type
102
+ slide2_assets = main.find _slide:2 # …or presence on slide
103
+ rectangles = main.find sourcepath:'#Rectangle' # …or attribute values
104
+ gamecovers = main.find name:'Game Cover' # …including the name
105
+
106
+ # Combine tests to get more specific
107
+ master_models = main.find _type:'Model', _master:true
108
+ slide2_rects = main.find _type:'Model', _slide:2, sourcepath:'#Rectangle'
109
+ nonmaster_s2 = main.find _slide:2, _master:false
110
+ red_materials = main.find _type:'Material', diffuse:[1,0,0]
111
+
112
+ # You can match values more loosely
113
+ pistons = main.find name:/^Piston/ # Regex for batch finding
114
+ bottom_row = main.find position:[nil,-200,nil] # nil for wildcards in vectors
115
+
116
+ # Restrict the search to a sub-tree
117
+ group = main/"Scene.Layer.Group"
118
+ group_models = group.find _type:'Model' # Orig asset is never included
119
+ group_models = main.find _under:group, _type:'Model' # Or, use `_under` to limit
120
+
121
+ # Iterate the results as they are found
122
+ main.find _type:'Model', name:/^Piston/ do |model, index| # Using the index is optional
123
+ show "Model #{index} is named #{model.name}"
124
+ end
125
+ ```
126
+
127
+ Notes:
128
+ * `nil` inside an array is a "wildcard" value, allowing you to test only specific values
129
+ * Numbers (both in vectors/colors/rotations and float/long values) must only be within `0.001` to match.
130
+ * _For example, `attr:{diffuse:[1,0,0]}` will match a color with `diffuse=".9997 0.0003 0"`_
131
+ * Results of `find` are always in scene-graph order.
132
+
133
+
134
+ ## Working with References
135
+
136
+ ```ruby
137
+ uia 'MyApp.uia'
138
+ mat1 = app/"main:Scene.Layer.Sphere.Material" # A normal UIC Material
139
+ mat2 = app/"main:Scene.Layer.Cube.Material" # A normal UIC Material
140
+ p mat2.type #=> "Material"
141
+ ref = mat2.replace_with_referenced_material # A very specific method :)
142
+ p ref.properties['referencedmaterial'].type #=> "ObjectRef"
143
+ p ref['referencedmaterial',0].object #=> nil
144
+ p ref['referencedmaterial',0].type #=> :absolute
145
+ ref['referencedmaterial',0].object = mat1 #=> Sets an absolute reference
146
+ ref['referencedmaterial',0].type = :path #=> Use a relative path instead
147
+
148
+ # Alternatively, you can omit the .object when setting the reference:
149
+ # ref['referencedmaterial',0] = mat1
150
+
151
+ mat3 = ref['referencedmaterial',1].object #=> Get the asset pointed to
152
+ assert mat1 == mat3 #=> They are the same! It worked!
153
+
154
+ app.save_all! #=> Write presentations in place
155
+ ```
156
+
157
+ ## Writing Assertions
158
+
159
+
160
+ ## Locating MetaData.xml
161
+ RUIC needs access to a UIC `MetaData.xml` file to understand the properties in the various XML files.
162
+ By default RUIC will look in the location specified by `RUIC::DEFAULTMETADATA`, e.g.
163
+ `C:/Program Files (x86)/NVIDIA Corporation/UI Composer 8.0/res/DataModelMetadata/en-us/MetaData.xml`
164
+
165
+ If this file is in another location, you can tell the script where to find it either:
166
+
167
+ * on the command line: `ruic -m path/to/MetaData.xml myscript.ruic`
168
+ * in your ruic script: `metadata 'path/to/MetaData.xml' # before any 'app' commands`
169
+
170
+
171
+ # Interactive RUIC
172
+ In addition to executing a standalone script, RUIC also has a REPL (like IRB) that allows you to
173
+ interactively execute and test changes to your application/presentations before saving.
174
+ There are two ways to enter interactive mode:
175
+
176
+ * If you invoke the `ruic` binary with a `.uia` file as the argument the interpreter will load
177
+ the application and enter the REPL:
178
+ ```
179
+ $ ruic myapp.uia
180
+ (RUIC v0.2.2 interactive session; 'quit' or ctrl-d to end)
181
+
182
+ uia "test/projects/SimpleScene/SimpleScene.uia"
183
+ #=> <UIC::Application 'SimpleScene.uia'>
184
+ ```
185
+
186
+ * Alternatively, you can have RUIC execute a script and then enter the interactive REPL
187
+ by supplying the `-i` command-line switch:
188
+ ```
189
+ $ ruic -i test/referencematerials.ruic
190
+ (RUIC v0.2.2 interactive session; 'quit' or ctrl-d to end)
191
+
192
+ app
193
+ #=> <UIC::Application 'ReferencedMaterials.uia'>
194
+
195
+ cubemat
196
+ #=> <asset Material#Material_002>
197
+ ```
198
+ As shown above, all local variables created by the script continue to be available
199
+ in the interactive session.
200
+
201
+
202
+ # Known Limitations (aka TODO)
203
+ _In decreasing priority…_
204
+
205
+ - Report on image assets, their sizes
206
+ - Report used assets (and where they are used)
207
+ - Report unused assets (in a format suitable for automated destruction)
208
+ - Report missing assets (and who was looking for them)
209
+ - Gobs more unit tests
210
+ - Parse .lua headers (in case one references an image)
211
+ - Parse render plugins
212
+ - Read/edit animation tracks
213
+ - Find all colors, and where they are used
214
+ - Visual actions for State Machines
215
+ - Create new presentation assets (e.g. add a new sphere)
216
+ - Modify the scene graph of presentations
217
+ - Create new presentations/applications from code
218
+ - Report on image asset file formats (e.g. find PNGs, find DXT1 vs DXT3 vs DXT Luminance…)
219
+
220
+
221
+ # History
222
+
223
+ ## v0.4.1 - 2014-Nov-16
224
+
225
+ * Update `MetaData.xml` for tests to newest version.
226
+ * Source paths for images/textures normalize the path (forward slashes and no leading `./`).
227
+ * Added `app.main` as a simpler alias for `app.main_presentation`.
228
+ * Add support for paths and anchor points, including `mypath.anchors` as an array of anchor points.
229
+ * Assets present in MetaData and presentation, but not yet hand-entered into the hierarchy, now work and default to inherit from `Asset`.
230
+
231
+ ## v0.4.0 - 2014-Nov-11
232
+ * Switch attribute filtering again; now all attributes are inline in the `find()` hash, and the four special keys are prefixed with an underscore: `_type`, `_slide`, `_master`, and `_under`.
233
+
234
+ ## v0.3.0 - 2014-Nov-10
235
+ * Switch attribute filtering to use `attr:{ }` instead of `attributes:{ … }`
236
+ * Attribute matching now requires that a requested attribute be present, or else the asset matching fails.
237
+ * _For example, `main.find attr:{ diffusecolor:[nil,nil,nil] }` will now only find assets with a `diffusecolor` attribute._
238
+
239
+ ## v0.2.5 - 2014-Nov-10
240
+ * Re-adds blank line after REPL result.
241
+
242
+ ## v0.2.4 - 2014-Nov-10
243
+ * Fix bug with history editing in REPL (prompts no longer have a blank line before)
244
+ * Add temporary hack to make projects using Float2 load correctly
245
+
246
+ ## v0.2.3 - 2014-Nov-7
247
+ * Cleaner mechanism for creating a truly blank binding
248
+
249
+ ## v0.2.2 - 2014-Nov-7
250
+ * REPL shows version number when it starts
251
+
252
+ ## v0.2.1 - 2014-Nov-7
253
+ * REPL mode after script maintains binding of script (all local variables remain available)
254
+ * Customized `.irbrc` files will not cause warnings
255
+
256
+ ## v0.2.0 - 2014-Nov-7
257
+ * Add Presentation#save_as
258
+ * REPL working directory is same as .uia
259
+
260
+ ## v0.1.0 - 2014-Nov-7
261
+ * Add REPL mode for ruic binary
262
+
263
+ ## v0.0.1 - 2014-Nov-7
264
+ * Initial gem release
265
+ * Crawl presentations and modify attributes
266
+ * Batch find assets
267
+ * Save presentation changes back to disk
268
+
269
+
270
+
271
+ # License & Contact
272
+ RUIC is copyright ©2014 by Gavin Kistner and is licensed under the [MIT License][3]. See the `LICENSE` file for more details.
273
+
274
+ For bugs or feature requests please open [issues on GitHub][4]. For other communication you can [email the author directly](mailto:!@phrogz.net?subject=RUIC).
275
+
276
+ [1]: http://uicomposer.nvidia.com
277
+ [2]: http://nokogiri.org
278
+ [3]: http://opensource.org/licenses/MIT
279
+ [4]: https://github.com/Phrogz/RUIC/issues