Merge lp:~mhr3/libunity/fix-1212307 into lp:libunity

Proposed by Michal Hruby
Status: Merged
Approved by: Paweł Stołowski
Approved revision: 292
Merged at revision: 292
Proposed branch: lp:~mhr3/libunity/fix-1212307
Merge into: lp:libunity
Diff against target: 245 lines (+137/-17)
4 files modified
bindings/python/Unity.py (+31/-1)
debian/libunity9.symbols (+2/-0)
src/unity-scope-interface.vala (+35/-0)
test/vala/test-scope-base.vala (+69/-16)
To merge this branch: bzr merge lp:~mhr3/libunity/fix-1212307
Reviewer Review Type Date Requested Status
Paweł Stołowski (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+186290@code.launchpad.net

Commit message

Add a few methods to allow python bindings to correctly create a SearchMetadata instance.

Description of the change

Add a few methods to allow python bindings to correctly create a SearchMetadata instance.

See the linked bug for a testcase.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Paweł Stołowski (stolowski) wrote :

LGTM. +1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bindings/python/Unity.py'
2--- bindings/python/Unity.py 2013-08-20 10:20:01 +0000
3+++ bindings/python/Unity.py 2013-09-18 11:20:49 +0000
4@@ -86,7 +86,6 @@
5 if isinstance(value, unicode):
6 metadata[col_name] = GLib.Variant("s", value)
7
8-
9 result = GLib.Variant("(ssuussssa{sv})", (uri, icon, category,
10 result_type, mimetype,
11 title, comment, dnd_uri,
12@@ -94,6 +93,24 @@
13 return result
14
15
16+def dict_to_variant(metadata_dict):
17+ metadata = {}
18+
19+ for name, value in metadata_dict.items():
20+ if isinstance(value, GLib.Variant):
21+ metadata[name] = value
22+ elif isinstance(value, str):
23+ metadata[name] = GLib.Variant("s", value)
24+ elif isinstance(value, int):
25+ metadata[name] = GLib.Variant("i", value)
26+ elif sys.version_info < (3, 0, 0):
27+ # unicode is not defined in py3
28+ if isinstance(value, unicode):
29+ metadata[name] = GLib.Variant("s", value)
30+
31+ return GLib.Variant("a{sv}", metadata)
32+
33+
34 class ScopeResult(Unity.ScopeResult):
35
36 @staticmethod
37@@ -104,6 +121,17 @@
38 return Unity.ScopeResult.create(*args)
39
40
41+class SearchContext(Unity.SearchContext):
42+
43+ @staticmethod
44+ def create(search_query, search_type, filter_state, metadata_dict, result_set, cancellable):
45+ context = Unity.SearchContext.create(search_query, search_type, filter_state, None, result_set, cancellable)
46+ if len(metadata_dict) > 0:
47+ metadata_variant = dict_to_variant(metadata_dict)
48+ context.set_search_metadata(Unity.SearchMetadata.create_from_variant(metadata_variant))
49+
50+ return context
51+
52 ScopeSearchBase = override(ScopeSearchBase)
53 __all__.append('ScopeSearchBase')
54 ResultPreviewer = override(ResultPreviewer)
55@@ -112,3 +140,5 @@
56 __all__.append('ResultSet')
57 ScopeResult = override(ScopeResult)
58 __all__.append('ScopeResult')
59+SearchContext = override(SearchContext)
60+__all__.append('SearchContext')
61
62=== modified file 'debian/libunity9.symbols'
63--- debian/libunity9.symbols 2013-08-28 13:23:27 +0000
64+++ debian/libunity9.symbols 2013-09-18 11:20:49 +0000
65@@ -621,8 +621,10 @@
66 unity_search_context_dup@Base 7.0.0daily13.05.31ubuntu.unity.next
67 unity_search_context_free@Base 7.0.0daily13.05.31ubuntu.unity.next
68 unity_search_context_get_type@Base 7.0.0daily13.05.31ubuntu.unity.next
69+ unity_search_context_set_search_metadata@Base 0replaceme
70 unity_search_metadata_construct@Base 7.0.0daily13.05.31ubuntu.unity.next
71 unity_search_metadata_create@Base 7.0.0daily13.05.31ubuntu.unity.next
72+ unity_search_metadata_create_from_variant@Base 0replaceme
73 unity_search_metadata_get_form_factor@Base 7.0.9+13.10.20130723
74 unity_search_metadata_get_locale@Base 7.0.0daily13.05.31ubuntu.unity.next
75 unity_search_metadata_get_location@Base 7.1.0+13.10.20130828.1
76
77=== modified file 'src/unity-scope-interface.vala'
78--- src/unity-scope-interface.vala 2013-08-27 15:36:13 +0000
79+++ src/unity-scope-interface.vala 2013-09-18 11:20:49 +0000
80@@ -277,6 +277,7 @@
81 * This method will add a new result to the result set from a variant.
82 * The default implementation will transform the variant into a ScopeResult
83 * and invoke the add_result() method.
84+ * The expected type of the variant is '(ssuussssa{sv})'.
85 * It is primarily meant for low-level language bindings.
86 */
87 public virtual void add_result_from_variant (Variant variant)
88@@ -411,6 +412,28 @@
89
90 return m;
91 }
92+
93+ /**
94+ * Create a new SearchMetadata from a variant
95+ *
96+ * This method will create a new heap-allocated SearchMetadata.
97+ * The expected type for the variant is 'a{sv}'.
98+ * It is primarily meant for low-level language bindings.
99+ */
100+ public static SearchMetadata create_from_variant (Variant metadata)
101+ {
102+ var m = new SearchMetadata ();
103+ if (!metadata.is_of_type (VariantType.VARDICT))
104+ {
105+ warning ("Incorrect variant type for SearchMetadata.create_from_variant. "
106+ + "Expected %s, but got %s", VariantType.VARDICT.dup_string (),
107+ metadata.get_type_string ());
108+ return m;
109+ }
110+ m.all_metadata = (HashTable<string, Variant>) metadata;
111+
112+ return m;
113+ }
114 }
115
116 public class GeoCoordinate: Object
117@@ -481,6 +504,18 @@
118
119 return ctx;
120 }
121+
122+ /**
123+ * Set search_metadata
124+ *
125+ * This method will create a new heap-allocated SearchContext.
126+ * It is primarily meant for low-level language bindings, to ensure correct
127+ * memory management of the individual fields in the struct.
128+ */
129+ public void set_search_metadata (SearchMetadata metadata)
130+ {
131+ this.search_metadata = metadata;
132+ }
133 }
134
135 public abstract class AbstractScope : GLib.Object
136
137=== modified file 'test/vala/test-scope-base.vala'
138--- test/vala/test-scope-base.vala 2013-08-27 15:36:13 +0000
139+++ test/vala/test-scope-base.vala 2013-09-18 11:20:49 +0000
140@@ -26,6 +26,12 @@
141 {
142 public ScopeSuite ()
143 {
144+ GLib.Test.add_data_func ("/Unit/SearchContext/Create",
145+ Fixture.create<SearchContextTester> (SearchContextTester.test_create));
146+ GLib.Test.add_data_func ("/Unit/SearchContext/SetMetadata",
147+ Fixture.create<SearchContextTester> (SearchContextTester.test_metadata));
148+ GLib.Test.add_data_func ("/Unit/ScopeResult/CreateFromVariant",
149+ Fixture.create<ScopeResultTester> (ScopeResultTester.test_create_from_variant));
150 GLib.Test.add_data_func ("/Unit/AbstractScope/AddResult",
151 Fixture.create<AbstractScopeTester> (AbstractScopeTester.test_add_result));
152 GLib.Test.add_data_func ("/Unit/AbstractScope/AddResultFromVariant",
153@@ -34,8 +40,69 @@
154 Fixture.create<AbstractScopeTester> (AbstractScopeTester.test_metadata_with_location));
155 GLib.Test.add_data_func ("/Unit/Cancellable/GetGCancellable",
156 Fixture.create<CancellableTester> (CancellableTester.test_get_gcancellable));
157- GLib.Test.add_data_func ("/Unit/ScopeResult/CreateFromVariant",
158- Fixture.create<ScopeResultTester> (ScopeResultTester.test_create_from_variant));
159+ }
160+
161+ class ResultSetTestImpl: ResultSet
162+ {
163+ public GenericArray<ScopeResult?> results;
164+
165+ construct
166+ {
167+ results = new GenericArray<ScopeResult?> ();
168+ }
169+ protected override void add_result (ScopeResult result)
170+ {
171+ results.add (result);
172+ }
173+ }
174+
175+ class SearchContextTester: Object, Fixture
176+ {
177+ public void test_create ()
178+ {
179+ var metadata_ht = new HashTable<string, Variant> (str_hash, str_equal);
180+ metadata_ht["locale"] = new Variant.string ("en_GB");
181+ var result_set = new ResultSetTestImpl ();
182+ var context = Unity.SearchContext.create ("query",
183+ Unity.SearchType.GLOBAL,
184+ null,
185+ metadata_ht,
186+ result_set,
187+ null);
188+
189+ assert (context.search_query == "query");
190+ assert (context.search_type == Unity.SearchType.GLOBAL);
191+ assert (context.filter_state == null);
192+ assert (context.result_set == result_set);
193+ assert (context.cancellable == null);
194+ assert (context.search_metadata.locale == "en_GB");
195+ }
196+
197+ public void test_metadata ()
198+ {
199+ var result_set = new ResultSetTestImpl ();
200+ var context = Unity.SearchContext.create ("query",
201+ Unity.SearchType.GLOBAL,
202+ null,
203+ null,
204+ result_set,
205+ null);
206+ assert (context.search_metadata.locale == null);
207+
208+ // set metadata after creation
209+ var metadata_ht = new HashTable<string, Variant> (str_hash, str_equal);
210+ metadata_ht["locale"] = new Variant.string ("en_AU");
211+ context.set_search_metadata (SearchMetadata.create (metadata_ht));
212+ assert (context.search_metadata.locale == "en_AU");
213+
214+ // set metadata from variant
215+ var locale_v = new Variant.dict_entry ("locale", new Variant.variant ("en_NZ"));
216+ var metadata_v = new Variant.array (VariantType.VARDICT.element (),
217+ {locale_v});
218+ var metadata = Unity.SearchMetadata.create_from_variant (metadata_v);
219+ context.set_search_metadata (metadata);
220+ assert (context.search_metadata.locale == "en_NZ");
221+ }
222 }
223
224 class AbstractScopeTester: Object, Fixture
225@@ -112,20 +179,6 @@
226 {
227 }
228
229- class ResultSetTestImpl: ResultSet
230- {
231- public GenericArray<ScopeResult?> results;
232-
233- construct
234- {
235- results = new GenericArray<ScopeResult?> ();
236- }
237- protected override void add_result (ScopeResult result)
238- {
239- results.add (result);
240- }
241- }
242-
243 public void test_add_result ()
244 {
245 bool runner_invoked = false;

Subscribers

People subscribed via source and target branches